redis實現session共享,哨兵


一、Redis介紹

1、redis是key-value的存儲系統,屬於非關系型數據庫

2、特點:支持數據持久化,可以讓數據在內存中保存到磁盤里(memcached:數據存在內存里,如果服務重啟,數據會丟失)

3、支持5種數據類型:string,hash,list,set,zset

4、兩種文件格式(即數據持久化)

(1)RDB(全量數據):多長時間/頻率,把內存中的數據刷到磁盤中,便於下次讀取文件時進行加載

(2)AOF(增量請求):類似mysql的二進制日志,不停地把對數據庫的更改語句記錄到日志中,下次重啟服務,會根據二進制日志把數據重寫一次,加載到內存里,實現數據持久化

5、存儲

(1)內存存儲 (2)磁盤存儲(RDB)  (3)log文件(AOF)

 

二、Redis安裝

1、下載 redis-2.8.21.tar.gz 

2、解壓:  tar zxvf redis-2.8.21.tar.gz

3、cd redis-2.8.21

4、編譯:make

5、安裝: make PREFIX=/usr/local/redis install

6、創建配置文件所在的目錄:mkdir /usr/local/redis/etc

7、網上下載配置文件 redis.conf,放到 6 創建的目錄下

8、創建啟動腳本 /etc/init.d/redis 

9、添加redis用戶:useradd -s /sbin/nologin redis

10、創建var目錄,放置redis 的pid,rdb文件:  mkdir /usr/local/redis/var

11、修改var目錄和配置文件權限

(1)chmod 777 /usr/local/redis/var

(2)chmod 755 /etc/init.d/redis

12、啟動redis:  service redis start

13、ps aux | grep redis      ——》 監聽6379端口

 

三、php應用redis

前提:已經搭建了LAMP網站架構

php不能直接連redis,需要redis模塊的支持(redis是和開發語言結合使用的)

 

1、Redis擴展模塊安裝
(1)下載 phpredis.zip
(2)解壓:unzip phpredis.zip
(3)cd phpredis-develop/
(4)/usr/local/php/bin/phpize   ——》生成 configure文件
(5)編譯redis.so的模塊
./configure --with-php-config=/usr/local/php/bin/php-config
(6)make && make install
(7)檢查是否有redis.so文件
ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
——》 redis.so
(8)編輯php.ini配置文件
最后1行加上
extension=redis.so
(9)php檢查是否加載了redis.so模塊
/usr/local/php/bin/php -m |grep redis
——》redis
 
 
 
2、Redis 實現session共享
(1)apache測試目錄下創建info.php ——》 調用 phpinfo() 函數
(2)apache虛擬主機配置文件(extra目錄下)或者主配置文件httpd.conf 中定義
session存儲的處理方式和存儲路徑
(a)php_value session.save_handler "redis"
(b)php_value session.save_path "tcp://127.0.0.1:6379"
 
ps: 還有另外兩種方法
1、php的全局配置文件php.ini添加上面2行
2、如果是lnmp架構
php-fpm.conf對應的pool中加入 
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://127.0.0.1:6379"
 
 
(3)重啟apachectl
/usr/local/apache2/bin/apachectl restart
(4)瀏覽器訪問:192.168.131.110/info.php

說明配置已經生效

 

3、Redis 存儲session 測試

(1)進入apache的htdoc下

(2)創建session.php

 1 <?php 
 2     session_start(); 
 3     if (!isset($_SESSION['TEST'])) { 
 4         $_SESSION['TEST'] = time(); 
 5     } 
 6     $_SESSION['TEST3'] = time(); 
 7     print $_SESSION['TEST']; 
 8     print "<br><br>"; 
 9     print $_SESSION['TEST3']; 
10     print "<br><br>"; 
11     print session_id(); 
12 ?>

(3)測試  ——》 記得去掉redis配置文件中的密碼設置,否則會返回500授權錯誤

(a)curl localhost/session.php

(b)redis-cli  ——》 在家目錄的.bashrc加入了redis啟動目錄

說明session已經存入到redis里了

 

 

四、redis的一些題外話

 redis一些重點

1、主從

2、持久化

3、哨兵實現主從切換

4、sentinel原理 (2.8.0之后有這個功能 sentinel.conf)

5、數據類型: hash,string 用得多

 

 

着重講下哨兵

1、支持redis協議

2、原理簡單描述

所有服務器都部署哨兵,哨兵去監控主從,要是redis或者哨兵死了,另外所有的機器會重新投票(就是下圖6379后面的數字,比如2),投死那台掛掉的機器(2台機器投票確認機器死了),再在另外所有的機器上自成一個體系,重新生成主

 

3、重點

(1)哨兵的配置文件也就是sentinel.conf是時時發生變化的

當主被投票死掉后,從起來於是產生一個新的主ip,新主會變成配置文件master的ip

(2)redis的配置文件也會改變

(3)當已死的主恢復后,就變成了從

(4)哨兵一定要是單數,否則選舉易出現問題,偶數可能會同票

 

4、幾個問題

(1)什么時候用redis?

所有的web第一次請求,先從db上取,取到的結果再返回給客戶端的同時也寫到redis去,
當再次用到這個結果時就從redis取,不需要再從db上取(很慢)
 
(2)什么時候用redis高可用,也就是哨兵?
所有的研發程序需要連主(可寫),從(只讀)是寫不進去東西的
主redis有一個vip或者直連它的物理ip,研發程序直連redis寫東西時,
redis主掛了,哨兵就起到作用
 
redis取不到數據,就從db上取——》程序做的,自動的降級
如果程序沒有做降級,redis主掛了,線上所有涉及到在redis寫的業務都用不了 ——》 所以就要用哨兵
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM