一,軟件准備
#redis wget http://download.redis.io/releases/redis-3.0.7.tar.gz #phpredis 非php7使用 下載后文件名為:phpredis-develop wget https://codeload.github.com/phpredis/phpredis/zip/develop #phpredis PHP7專屬 下載后文件名為:phpredis-php7 wget https://codeload.github.com/phpredis/phpredis/zip/php7
安裝phpredis前,務必已經安裝好autoconf。
附:如果你有window(必須64位)安裝redis服務需求,或者wamp僅僅需要redis擴展。可以到點鏈接下載redis64和php_redis.dll。
二,安裝配置Redis
安裝方法非常簡單,make后,redis直接安裝在當前目錄:
tar xzf redis-3.0.7.tar.gz cd redis-3.0.7 make
開啟redis前台服務測試:
src/redis-server
顯示這個小盒子,前台服務即為成功開啟,占用端口6379:
_._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.0.7 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 23909 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-'
按Ctrl+C退出redis前台服務。
配置redis使用環境:
現在,我們新建目錄 /usr/local/redis ,把./redis.conf,src/redis-server,src/redis-cli 三個文件復制到該目錄下
mkdir /usr/local/redis cp redis.conf src/redis-server src/redis-cli /usr/local/redis/
cd /usr/local/redis
這三個文件:
redis.conf redis配置文件
redis-server redis服務端
redis-cli redis客戶端
vi redis.conf修改配置,使redis服務在后台運行:
#redis.conf#
daemonize yes
保存退出,./redis-server redis.conf 開啟redis后台服務。
開啟密碼登入:
vi redis.conf修改配置
masterauth redis_password
重啟redis-server后登入redis-cli客戶端,輸入auth redis_password 方可登入管理。
如果你修改redis.conf中的任何配置,需要關閉redis-server進程后,再./redis-server redis.conf 重新開啟redis后台服務。
./redis-cli 開啟redis客戶端,你可以在其中輸入任意redis命令。*注意,如果你在redis.conf配置文件中設置了requirepass 密碼,那么登錄客戶端后,輸入auth 密碼 才可以繼續操作。
#redis-cli接收參數,不填寫參數默認連接127.0.0.1:6379 ./redis-cli -h <host> -p <port>
Redis數據庫
存入redis數據前必須選擇數據庫,redis數據庫默認16個,下標0~15,默認使用第0個,存放數據前可以使用select N選擇數據庫。
Redis數據庫在redis.conf中配置如下:
#redis.conf# databases 16
你可以根據實際需要更改數據庫個數,但一般不建議修改。
*持久化功能
redis(nosql產品)為了內部數據的安全考慮,會把本身的數據以文件形式保存到硬盤中一份,在服務器重啟之后會自動把硬盤的數據恢復到內存(redis)的里邊。
數據保存到硬盤的過程就稱為“持久化”效果。
Redis快照持久化(snap shotting或稱RDB持久化)配置:
該持久化默認開啟,一次性把redis中全部的數據保存一份存儲在硬盤中,如果數據非常多(10-20G)就不適合頻繁進行該持久化操作。快照持久化會根據配置條件定期生成二進制備份文件,默認文件名dump.rdb。
redis.conf 中關於快照的配置:
#快照寫入文件名 dbfilename dump.rdb #快照保存目錄 dir ./ #快照寫入頻率 save 900 1 #900 秒內如果超過 1 個 key 被修改,則發起快照保存 save 300 10 #300秒超過10個key被修改,發起快照 save 60 10000 #60秒超過10000個key被修改,發起快照 #以上三個備份頻率需要同時存在: #數據變化非常快的時候,就快點做備份(保證數據安全) #數據變化慢的時候,就慢點做備份(節省服務器資源)
手動發起快照持久化:
快照持久化默認開啟,並定時執行,你也可以通過redis-cli客戶端使用bgsave命令手動發起。
./redis-cli bgsave
Redis AOF(append only file)持久化配置:
本質:把用戶執行的每個“寫”指令(添加、修改、刪除)都備份到文件中,還原數據的時候就是執行具體寫指令而已。
AOF默認關閉,默認保存文件名append.aof,默認每秒執行一次,具體參數如下
#開啟/關閉AOF appendonly yes #保存文件名 appendfilename "appendonly.aof" #AOF保存頻率 # appendfsync always #每次收到寫命令就立即強制寫入磁盤,最慢的,但是保證完全的持久化,不推薦使用 appendfsync everysec #每秒鍾強制寫入磁盤一次,在性能和持久化方面做了很好的折中,推薦 # appendfsync no #完全依賴 os,性能最好,持久化沒保證 #上面三種選項數據安全性及服務性能情況 #數據最安全 服務器性能低 #數據較安全 服務器性能中等 #數據不安全 服務器性能高(優良)
AOF策略設置為always或者everysec時,后台處理進程(后台保存或者AOF日志重寫)會執行大量的I/O操作,在某些Linux配置中會阻止過長的fsync()請求。注意現在沒有任何修復,即使fsync在另外一個線程進行處理。
為了減緩這個問題,可以設置下面這個參數no-appendfsync-on-rewrite:
#redis.conf#
no-appendfsync-on-rewrite yes
為AOF備份文件做優化壓縮處理:
AOF記錄用戶的每個操作,但是有些操作例如對某個key的多個同類型操作是可以合並為一個,從而做到壓縮文件大小的效果。例如多次incr一個整型key,可以直接合並為set key N。
壓縮優化(AOF重寫)命令:
./redis-cli bgrewriteaof
AOF自動重寫:
當AOF文件增長到一定大小的時候Redis能夠調用 BGREWRITEAOF 對日志文件進行重寫,它是這樣工作的:Redis會記住上次進行些日志后文件的大小(如果從開機以來還沒進行過重寫,那日子大小在開機的時候確定)基礎大小會同現在的大小進行比較。如果現在的大小比基礎大小大制定的百分比,重寫功能將啟動,同時需要指定一個最小大小用於AOF重寫,這個用於阻止即使文件很小但是增長幅度很大也去重寫AOF文件的情況,設置 percentage 為0就關閉這個重寫特性。
#redis.conf# auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb
手動持久化相關指令:
save (客戶端命令行內)前台備份數據(快照保存)
bgsave 異步保存數據到磁盤(快照保存)
lastsave 返回上次成功保存到磁盤的unix時間戳
shutdown 同步保存到服務器並關閉redis服務器
bgrewriteaof 當日志文件過長時優化AOF日志文件存儲
redis 127.0.0.1:6379> SAVE #前台備份數據
./redis-cli bgrewriteaof ./redis-cli bgsave ./redis-cli -h 127.0.0.1 -p 6379 bgsave #手動發起快照
數據恢復
如果需要恢復數據,只需將備份文件 (dump.rdb) 移動到 redis 快照保存目錄 並啟動服務即可。要查看快照保存目錄,可以查看redis.conf的dir配置。
*Redis主從模式
為了降低每個redis服務器的負載,可以多設置幾個,並做主從模式,一個服務器負載“寫”(添加、修改、刪除)數據,其他服務器負載“讀”數據,主服務器數據會“自動”同步給從服務器
Redis主從復制特點
1.master可以有多個slave
2.除了多個slave連接到master外,slave也可以連接到其他slave,形成網狀結構
3.可以讓slave做讀請求,master做寫操作
配置主服務器:
(假定局域網IP為192.168.1.101)
#redis.conf# #配置主服務器密碼 requirepass admin123 #自定義端口 port 6379
配置從服務器:
#redis.conf#
#主服務器連接密碼
masterauth admin123
#自定義端口
port 6379
#設置成為192.168.1.101的從服務器 slaveof 192.168.1.101 6379 #取消從服務器只讀 slave-read-only no
開啟訪問端口(主從都需要開啟):
#開放6379端口 firewall-cmd --zone=public --add-port=6379/tcp --permanent #重啟防火牆 firewall-cmd --reload
重新開啟redis-server 服務,則從服務器設置成功。
關於redis.conf 配置文件中bind和protected-mode的配置問題:
網上很多資料關於bind配置的描述都是‘指定redis只接收來自於該IP地址的請求,如果不進行設置,那么將處理所有請求,在生產環境中最好設置該項’,其實是一個錯誤的翻譯說法。如果按照這個說法去配置,百分百是connection refuse。 *這里bind指的是interface,網絡接口,也就是服務器上的網卡,一個服務器可以有一或多個網卡,設置這個bind是讓這台服務器某一或多個網卡來接收請求,如果讓本機所有網卡都接收請求,則bind可以直接注釋掉。 *Redis protected-mode 是3.2 之后加入的新特性, 是為了禁止公網訪問redis cache,加強redis安全的。它啟用的條件,有兩個: 1) 沒有bind IP 2) 沒有設置訪問密碼 如果啟用了,則只能夠通過lookback(回路) ip(127.0.0.1)訪問Redis cache,如果從外網訪問,則會返回錯誤信息。 因此如果沒有設置bind,則protected-mode設置為no,且開放6379訪問端口。
Redis推薦部署方式:
在一台服務器上部署多個Redis服務節點(啟動多端口,運行多實例)方式:
假設你只有一台電腦,但又想實現redis的主從部署,你考慮使用諸如6380,6381...等端口創建從節點,那么問題來了,改怎么設置呢?
如果要在一台服務器上運行多個redis實例,必須滿足以下3點:
- 使用不同的端口
- 分別配置每個實例(服務)的pid和log文件
- RDB和AOF持久化到每個實例(服務)的rdb和aof文件中
每個實例必須對應一個配置文件,配置文件按照上面3點設置:
cp redis.conf redis_6380.conf vi redis_6380.conf port 6380 #設置端口 pidfile /var/run/redis/redis_6380.pid #設置pid文件 logfile /var/log/redis/redis_6380.log #設置log文件 dbfilename dump_6380.rdb #設置RDB持久化文件 appendfilename "appendonly_6380.aof" #設置aof持久化文件
其他配置文件按此修改,至於從節點配置,回上面看。
啟動多個redis實例:
./redis-server redis_6380.conf
./redis-server redis_6381.conf
配置好從節點后,./redis-cli 開啟客戶端,auth 密碼 登入,再輸入info命令,可以查看redis主節點狀態,其中該主節點的從節點信息如下:
# Replication role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6380,state=online,offset=1037,lag=1 slave1:ip=127.0.0.1,port=6381,state=online,offset=1037,lag=0 master_repl_offset:1037 repl_backlog_active:1 repl_backlog_size:1048576 repl_backlog_first_byte_offset:2 repl_backlog_histlen:1036
*Redis哨兵模式
Sentinel哨兵模式是在主從模式架構上,增加對redis服務的監控,如果主服務器宕機,可以將從服務器切換為主服務,提高了redis服務的可用性。
哨兵的作用:
1、監控redis進行狀態,包括master和slave
2、當master 宕機機,能自動將slave切換成master
單個哨兵(圖片來源:http://blog.csdn.net/yingxiake/article/details/51671335)
多個哨兵(圖片來源:http://blog.csdn.net/yingxiake/article/details/51671335)
具體配置:(主192.168.1.109,從192.168.1.111)
1,復制redis安裝包中的sentinel.conf和src/redis-sentinel文件到/usr/local/redis/下。
2,配置sentinel.conf,這里每台redis服務器都設置一個哨兵,主從哨兵都使用同樣的配置
####下面2個配置要與redis.conf的配置同步,否則會出錯## #bind x.x.x.x #protected-mode yes|no #開啟后台運行,如果開啟運行,將看不到sentinel前台運行時狀態實時信息 daemonize yes #配置主服務sentinel monitor 主服務名(自定義) 服務ip 服務端口 當有n個哨兵認為主服務宕機,才能啟動切換主從服務。因為我只有2台服務器,因此此處設置為1 sentinel monitor mymaster 192.168.1.109 6379 1 #主服務密碼 sentinel auth-pass mymaster redis_password #間隔多少毫秒檢查主服務器宕機,這里寫5秒 sentinel down-after-milliseconds mymaster 5000 #失效超時 #sentinel failover-timeout mymaster 90000
3,哨兵默認占用26379端口,需開放:
#開放26379端口 firewall-cmd --zone=public --add-port=26379/tcp --permanent #重啟防火牆 firewall-cmd --reload
4,在已開啟主從服務器情況下,啟用哨兵服務:
./redis-sentinel sentinel.conf --sentinel
在前台模式運行下,會顯示如下:
./redis-sentinel sentinel.conf --sentinel 16123:X 24 Jun 10:53:35.288 * Increased maximum number of open files to 10032 (it was originally set to 1024). _._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.2.9 (00000000/0) 64 bit .-`` .-```. ```\/ _.,_ ''-._ ( ' , .-` | `, ) Running in sentinel mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 26379 | `-._ `._ / _.-' | PID: 16123 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' 16123:X 24 Jun 10:53:35.292 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. 16123:X 24 Jun 10:53:35.292 # Sentinel ID is 594f00cb60e77a52a47d9b3c520dd3f28c0b3d25 16123:X 24 Jun 10:53:35.292 # +monitor master mymaster 192.168.1.109 6379 quorum 1 16123:X 24 Jun 10:55:36.542 # +sdown sentinel ec86fc3abde024f5297131822d415abd09543c46 192.168.1.109 26379 @ mymaster 192.168.1.109 6379 16123:X 24 Jun 10:55:45.171 # -sdown sentinel ec86fc3abde024f5297131822d415abd09543c46 192.168.1.109 26379
kill掉主服務器,顯示如下信息
16123:X 24 Jun 10:56:15.641 # +failover-state-reconf-slaves master mymaster 192.168.1.109 6379 16123:X 24 Jun 10:56:15.702 # +failover-end master mymaster 192.168.1.109 6379 16123:X 24 Jun 10:56:15.703 # +switch-master mymaster 192.168.1.109 6379 192.168.1.111 6379 16123:X 24 Jun 10:56:15.703 * +slave slave 192.168.1.109:6379 192.168.1.109 6379 @ mymaster 192.168.1.111 6379
說明主服務已經切換到從服務。
*關於Redis詳細配置信息,可以參考以下博客:
三,安裝PHP擴展
方式1. 生成redis.so:
unzip phpredis-Version cd phpredis-Version /usr/local/php/bin/phpize ./configure --with-php-config=/usr/local/php/bin/php-config make && make install
將extension=redis.so加入到php.ini
重啟服務器,查看phpinfo();
如果是使用php-fpm,則需要重啟php-fpm:
ps aux|grep php-fpm #查看fpm進程號 kill -USR2 fpm進程號 #平滑重啟php-fpm
方式2.Yum安裝:
首先查看php版本信息 php -v
顯示如:
PHP 7.0.32 (cli) (built: Sep 15 2018 07:54:46) ( NTS ) Copyright (c) 1997-2017 The PHP Group Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
則可以通過:
yum list | grep php70w*
來搜索php-redis擴展列表。
選擇並安裝:
yum -y install php70w-pecl-redis.x86_64
流程自動走完即可。
phpinfo():
顯示即OK。
四,測試使用
新建test_redis.php
1 <?php 2 3 //連接本地Redis服務 4 $redis=new Redis(); 5 $redis->connect('localhost','6379'); //$redis->auth('admin123');//如果設置了密碼,添加此行 6 //查看服務是否運行 7 $redis->ping(); 8 9 //選擇數據庫 10 $redis->select(5); 11 12 //設置數據 13 $redis->set('school','WuRuan'); 14 //設置多個數據 15 $redis->mset(array('name'=>'jack','age'=>24,'height'=>'1.78')); 16 17 //存儲數據到列表中 18 $redis->lpush("tutorial-list", "Redis"); 19 $redis->lpush("tutorial-list", "Mongodb"); 20 $redis->lpush("tutorial-list", "Mysql"); 21 22 //獲取存儲數據並輸出 23 echo $redis->get('school'); 24 25 echo '<br/>'; 26 27 $gets=$redis->mget(array('name','age','height')); 28 print_r($gets); 29 30 $tl=$redis->lrange("tutorial-list", 0 ,5); 31 print_r($tl);
顯示:
*語法參考文檔,phpredis中文手冊
五(附),Redis性能測試及常用命令
Redis性能測試
Redis還自帶一個redis-benchmark性能測試工具,我們將其復制到/usr/local/redis目錄下
cp /usr/local/src/redis-3.0.7/src/redis-benchmark /usr/local/redis/
redis-benchmark操作命令如下:
redis-benchmark [option] [option value]
redis 性能測試工具可選參數如下所示:
實例
1,我們同時執行10000個請求來檢測redis性能:
./redis-benchmark -n 10000 ====== PING_INLINE ====== 10000 requests completed in 0.31 seconds 50 parallel clients 3 bytes payload keep alive: 1 74.11% <= 1 milliseconds 95.93% <= 2 milliseconds 98.82% <= 3 milliseconds 99.30% <= 6 milliseconds 99.33% <= 7 milliseconds 99.40% <= 9 milliseconds 99.45% <= 10 milliseconds 99.51% <= 13 milliseconds 99.60% <= 14 milliseconds 99.64% <= 18 milliseconds 99.82% <= 29 milliseconds 100.00% <= 29 milliseconds 31746.03 requests per secon ....更多顯示參數不列舉
2,使用了多個參數來測試 redis 性能:
#以下實例中主機為 127.0.0.1,端口號為 6379,執行的命令為 set,lpush,請求數為 10000,通過 -q 參數讓結果只顯示每秒執行的請求數。 ./redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q SET: 38314.18 requests per second LPUSH: 36363.64 requests per second
Redis常用命令
到這個博客看看redis命令http://blog.csdn.net/yhl27/article/details/9936189
*下面圖片出自傳播智客
*Redis教程:http://www.runoob.com/redis/redis-tutorial.html,http://www.jb51.net/article/56448.htm