天天看點

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

redis實作session共享,哨兵

說明配置已經生效

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

redis實作session共享,哨兵

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

redis實作session共享,哨兵

說明session已經存入到redis裡了

四、redis的一些題外話

 redis一些重點

1、主從

2、持久化

3、哨兵實作主從切換

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

5、資料類型: hash,string 用得多

着重講下哨兵

1、支援redis協定

2、原理簡單描述

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

redis實作session共享,哨兵

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寫的業務都用不了 ——》 是以就要用哨兵