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