redis安裝及使用
本次安裝環(huán)境:
centos6.8
redis-3.2.1
1娘荡、安裝redis
下載redis-3.2.1.tar.gz
tar -xzf redis-3.2.1.tar.gz
mkdir /opt/redis
cp -rf /root/redis-3.2.1/* /opt/redis/
cd /opt/redis
make
make test #注意此時(shí)報(bào)錯(cuò):"You need tcl 8.5 or newer in order to run the Redis test"剑按,處理方法:yum -y install tcl
cd src
make install
mkdir /opt/redis/bin
mkdir /opt/redis/etc
mv /opt/redis/redis.conf /opt/redis/etc/
cd /opt/redis/src
mv redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server redis-sentinel /opt/redis/bin/
至此redis的安裝基本完成
2淳地、調(diào)試
cd /opt/redis/bin
./redis-server #直接運(yùn)行redis服務(wù),測(cè)試是否可正常運(yùn)行,查看端口是否正常監(jiān)聽(tīng),燃火ctrl-c中斷
vi redis.conf #修改配置文件,常用配置信息見(jiàn)附錄
????/opt/redis/bin/redis-server /opt/redis/etc/redis.conf #通過(guò)配置文件啟動(dòng)redis
3妆绞、redis客戶端的基本操作
redis-cli #不加任何參數(shù),默認(rèn)連接本地redis服務(wù)
redis-cli -h host -p port -a password #用于連接遠(yuǎn)端redis服務(wù)
redis-cli -n 庫(kù)號(hào) #進(jìn)入編號(hào)為n的redis庫(kù)中枫攀,redis默認(rèn)有16個(gè)庫(kù)號(hào)
select 庫(kù)號(hào) #進(jìn)入redis后切換到其他庫(kù)
ping #返回pong括饶,該命令用于檢測(cè)redis是否啟動(dòng)
keys * #查看當(dāng)前redis庫(kù)中所有key
set name yinlong #name為key,yinlong為value来涨,set命令為創(chuàng)建一個(gè)key并存入相應(yīng)的value
get name #get命令查詢name這個(gè)key中的存入的value值
mget key1 kye2... #一次返回多個(gè)key的value
getrange name 0 2 #通過(guò)范圍取值key的內(nèi)容图焰,此時(shí)返回'yin'
del name #del為刪除name這個(gè)key
rename name name1 #給key重新命名,rename key newkey
type name #type key蹦掐,獲取key的數(shù)據(jù)類型
hmset long name 'yinlong' age '26' #創(chuàng)建一個(gè)hash楞泼,long為key,之后為鍵值對(duì)笤闯,可跟多個(gè)
hgetall long #獲取long這個(gè)key中的所有hash值
hget long name #獲取long這個(gè)key中的name的hash值
hdel long name #刪除long這個(gè)key中的name的hash值
lpush class yinlong xiale tianyuan #lpush為創(chuàng)建一個(gè)列表并從左部插入新元素堕阔,class為key
rpush class shuaige #rpush為在class列表的右部插入新元素
lrange class 0 100 #查看class列表中從0到100的值
lindex class 7 #以索引的方式返回class列表中的值
lpop class #從列表中移除并返回第一個(gè)元素
rpop class #從列表中移除并返回最后一個(gè)元素
sadd shu lunyu mengzi daxue #sadd可以新建一個(gè)集合(set),shu為key后跟集合內(nèi)的元素
smembers shu #查看shu集合內(nèi)的元素
srem shu lunyu #移除集合中一個(gè)或多個(gè)元素
zadd wangzhan 1 ali 3 baidu 4 sina #zadd可以新建一個(gè)有序集合颗味,wangzhan為key超陆,后跟1(score)和ali(value)
zrange wangzhan 0 10 (withscores) #查看有序集合中的元素,可選擇是否顯示scores
zrem wangzhan ali #移除有序集合中的元素,可跟多個(gè)
4时呀、redis主從同步张漂、主從切換
此時(shí)環(huán)境狀態(tài):
A主機(jī):192.168.137.50 master
B主機(jī):192.168.137.51 slave
主從同步配置:
修改A主機(jī)配置文件:
????bind 127.0.0.1 192.168.137.50 #使A機(jī)器redis可以監(jiān)聽(tīng)192.168.137.50
通過(guò)配置文件啟動(dòng)A主機(jī):
/opt/redis/bin/redis-server /opt/redis/etc/redis.conf
修改B主機(jī)配置文件:
????bind 127.0.0.1 192.168.137.51
????slaveof 192.168.137.50 6379 #開(kāi)啟slave模式,后跟master地址和端口
????masterauth wang123 #master有密碼的話谨娜,輸入鏈接密碼
通過(guò)配置文件啟動(dòng)B主機(jī):
/opt/redis/bin/redis-server /opt/redis/etc/redis.conf
此時(shí)可通過(guò)客戶端分別連接A航攒、B主機(jī)的redis,使用info命令查看redis狀態(tài):
A主機(jī):
role:master
connected_slaves:1
slave0:ip=192.168.137.51,port=6379,state=online,offset=43,lag=0
B主機(jī):
role:slave
master_host:192.168.137.50
master_port:6379
master_link_status:up
若查看主從失敗優(yōu)先考錄防火墻原因
在B主機(jī)執(zhí)行keys *發(fā)現(xiàn)已經(jīng)將A主機(jī)上的數(shù)據(jù)通過(guò)過(guò)來(lái)趴梢,進(jìn)行測(cè)試:
A主機(jī)set name erzhu ------>B主機(jī)get name ------>'yinlong'
B主機(jī)set name1 erzhu -------->(error) READONLY You can't write against a read only slave.
說(shuō)明主從同步已正常工作漠畜,且B主機(jī)只有讀權(quán)限
主從自動(dòng)切換配置:
redis中自帶了sentinel(哨兵),其特點(diǎn)如下:
監(jiān)控:不斷地檢查主服務(wù)器和從服務(wù)器的運(yùn)行狀態(tài)
通知:當(dāng)主或從服務(wù)器出問(wèn)題時(shí)sentinel可通過(guò)API向管理員或其他應(yīng)用發(fā)送通知
自動(dòng)故障遷移:當(dāng)主發(fā)生故障時(shí)sentinel可自動(dòng)將一個(gè)從提升為主坞靶,并且其它的從自動(dòng)將切換新主
sentinel配置:(redis安裝文件中自帶了sentinel運(yùn)行文件和配置文件)
mkdir /opt/redis/tmp
cp /opt/redis/sentinel.conf /opt/redis/etc/
vi /opt/redis/etc/sentinel.conf #配置文件主要參數(shù)及功能見(jiàn)附錄
????dir /opt/redis/tmp #設(shè)置工作目錄
????sentinel monitor master 192.168.137.51 6379 1
????sentinel down-after-milliseconds master 10000
/opt/redis/bin/redis-sentinel /opt/redis/etc/sentinel.conf #啟動(dòng)sentinel服務(wù)
驗(yàn)證是否實(shí)現(xiàn)自動(dòng)主從切換:
先驗(yàn)證A為主憔狞、B為從
殺掉A主機(jī)redis進(jìn)程
觀察sentinel輸出信息:
+promoted-slave slave 192.168.137.51:6379 192.168.137.51 6379 @ mymaster 192.168.137.50 6379
將從晉升為主
此時(shí)查看B主機(jī)redis狀態(tài),發(fā)現(xiàn)以成為master彰阴,且可以插入新數(shù)據(jù)
再次開(kāi)啟A主機(jī)redis
觀察sentinel輸出信息:
+convert-to-slave slave 192.168.137.50:6379 192.168.137.50 6379 @ mymaster 192.168.137.51 6379
發(fā)現(xiàn)A主機(jī)redis啟動(dòng)瘾敢,自動(dòng)將A主機(jī)添加為B主機(jī)的從服務(wù)器
進(jìn)入A主機(jī)redis查看狀態(tài)為slave,無(wú)法插入新數(shù)據(jù)
5尿这、redis集群
特點(diǎn):無(wú)中心化簇抵,多節(jié)點(diǎn)共享數(shù)據(jù)。不支持處理多個(gè)key的命令射众,因?yàn)閿?shù)據(jù)會(huì)在多個(gè)節(jié)點(diǎn)間移動(dòng)正压,會(huì)導(dǎo)致不可預(yù)料的問(wèn)題。
redis集群官方推薦最小規(guī)模為3主3從责球,注意集群中每臺(tái)redis節(jié)點(diǎn)至少要有一臺(tái)相應(yīng)的從節(jié)點(diǎn)焦履,否則當(dāng)該節(jié)點(diǎn)故障時(shí)集群將無(wú)法正常使用。
搭建集群:本次試驗(yàn)采用最小規(guī)模的3主3從雏逾,環(huán)境如下:
A(主)192.168.137.50 6379
B(主)192.168.137.51 6379
C(主)192.168.137.52 6379
A(從)192.168.137.51 7000
B(從)192.168.137.52 7000
C(從)192.168.137.50 7000
集群搭建前準(zhǔn)備:
yum -y install ruby-devel rubygems rpm-build #安裝ruby環(huán)境嘉裤,redis-trib.rb依賴ruby環(huán)境
安裝ruby2.2.2或以上版本
gem install redis
創(chuàng)建redis主機(jī):(分別在三臺(tái)主機(jī)上創(chuàng)建redis配置文件,本次以一臺(tái)為例)
cd /opt/redis/etc
vi redis_master.conf #此處只列出重要選項(xiàng)栖博,可根據(jù)情況自行添加
????daemonize yes? ? ? ? ? ? ?
????pidfile /var/run/redis_6379.pid?
????port 6379
????dir /opt/redis/db
????cluster-enabled yes #開(kāi)啟集群
????cluster-config-file nodes_6379.conf #集群的配置文件首次啟動(dòng)自動(dòng)生成
????cluster-node-timeout 5000 #請(qǐng)求超時(shí)屑宠,設(shè)置5秒即可
????appendonly yes #aof日志開(kāi)啟,有需要就開(kāi)啟仇让,它會(huì)每次寫操作都記錄一條日志
????logfile "/opt/redis/log/redis.log"
????bind 192.168.137.50 #注意此IP不能綁定127.0.0.1典奉,否則加入集群不成功
????dbfilename dump_6379.rdb
????appendfilename "appendonly_6379.aof"
vi redis_slave.conf
????daemonize yes? ? ? ? ? ? ?
????pidfile /var/run/redis_7000.pid?
????port 7000
????dir /opt/redis/db
????cluster-enabled yes
????cluster-config-file nodes_7000.conf
????cluster-node-timeout 5000
????appendonly yes
????logfile "/opt/redis/log/redis.log"
????bind 192.168.137.50
????dbfilename dump_7000.rdb
????appendfilename "appendonly_7000.aof"
啟動(dòng)所有redis實(shí)例:
/opt/redis/bin/redis-server /opt/redis/etc/redis_master.conf
/opt/redis/bin/redis-server /opt/redis/etc/redis_slave.conf
ps -elf|grep redis
創(chuàng)建集群:
/opt/redis/src/redis-trib.rb create 192.168.137.50:6379 192.168.137.51:6379 192.168.137.52:6379 #將三臺(tái)主加入集群
/opt/redis/src/redis-trib.rb add-node --slave 192.168.137.51:7000 192.168.137.50:6379 #分別將三臺(tái)從按照對(duì)應(yīng)關(guān)系加入
/opt/redis/src/redis-trib.rb add-node --slave 192.168.137.52:7000 192.168.137.51:6379
/opt/redis/src/redis-trib.rb add-node --slave 192.168.137.50:7000 192.168.137.52:6379
/opt/redis/src/redis-trib.rb check 192.168.137.50:6379 #隨便指定一臺(tái)redis主機(jī)即可查看集群中所有主機(jī)的狀態(tài)
此時(shí)redis集群搭建完畢,該工具會(huì)自動(dòng)分配槽點(diǎn)丧叽,連接任意一臺(tái)主redis都可以對(duì)數(shù)據(jù)進(jìn)行操作卫玖。但若存儲(chǔ)該數(shù)據(jù)的槽點(diǎn)不在連接的主機(jī)上,該主機(jī)會(huì)返回對(duì)應(yīng)的主機(jī)信息踊淳,并不會(huì)直接返回?cái)?shù)據(jù)假瞬。
附錄:
redis配置文件:
daemonize no #默認(rèn)不是以守護(hù)進(jìn)程的方式啟動(dòng),可改成yes
pidfile /var/run/redis.pid #以守護(hù)進(jìn)程的方式啟動(dòng)時(shí)pid文件位置
port 6379 #指定redis監(jiān)聽(tīng)的端口,默認(rèn)6379
bind 127.0.0.1 #綁定的主機(jī)ip
timeout 300 #連接redis服務(wù)的超時(shí)時(shí)間脱茉,指定為0則表示關(guān)閉此功能
loglevel verbose #指定日志級(jí)別剪芥,debug、verbose琴许、notice税肪、warning,默認(rèn)為verbose
logfile "/redis/redis.log" #指定redis日志的存放位置榜田,默認(rèn)為標(biāo)準(zhǔn)輸出
databases 16 #設(shè)置數(shù)據(jù)庫(kù)的數(shù)量益兄,默認(rèn)數(shù)據(jù)庫(kù)為0
save <seconds> <changes> #指定多長(zhǎng)時(shí)間內(nèi)有多少次更新則會(huì)將數(shù)據(jù)寫入硬盤,可設(shè)置多個(gè)策略串慰,默認(rèn)值如下
save 900 1
save 300 10
save 60 10000
rdbcompression yes #存儲(chǔ)至本地?cái)?shù)據(jù)庫(kù)時(shí)是否壓縮數(shù)據(jù),默認(rèn)為yes唱蒸,redis采用LZF壓縮
dbfilename dump.rdb #指定本地?cái)?shù)據(jù)庫(kù)名邦鲫,默認(rèn)為dump.rdb
dir /opt/redis/db #指定本地?cái)?shù)據(jù)庫(kù)存放位置
slaveof <masterip> <masterport> #設(shè)置本機(jī)為slave服務(wù)時(shí),指定master的ip及port
masterauth <master-password> #本機(jī)為slave神汹,當(dāng)master設(shè)置密碼時(shí)連接所需密碼
requirepass 密碼 #設(shè)置redis的密碼
maxclients 128 #同一時(shí)間最大客戶連接數(shù)庆捺,默認(rèn)0不限制
maxmemory <bytes> #redis最大內(nèi)存限制,默認(rèn)0不限制屁魏,當(dāng)達(dá)到最大內(nèi)存時(shí)只能讀不能寫
appendonly no #是否在每次更新數(shù)據(jù)后進(jìn)行日志記錄滔以,默認(rèn)為no
appendfilename appendonly.aof #指定更新日志文件名,默認(rèn)為appendonly.aof
appendfsync everysec #日志更新條件氓拼, no:表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤(快)
always:表示每次更新操作后手動(dòng)調(diào)用fsync()將數(shù)據(jù)寫到磁盤(慢你画,安全)
everysec:表示每秒同步一次(折衷,默認(rèn)值)
vm-enabled no #是否啟動(dòng)虛擬內(nèi)存機(jī)制桃漾,默認(rèn)no
vm-swap-file /tmp/redis.swap #虛擬文件路徑坏匪,默認(rèn)/tmp/redis.swap,不可多個(gè)redis實(shí)例共享
vm-max-memory 0 #所有大于該值的數(shù)據(jù)會(huì)存入虛擬內(nèi)存撬统,為0時(shí)所有數(shù)據(jù)都會(huì)存入虛擬內(nèi)存
vm-page-size 32 #redis的swap文件分成很多page适滓,這里設(shè)置page的大小,一般為32或64
vm-pages 134217728 #設(shè)置page的數(shù)量恋追,磁盤上每8個(gè)page消耗1byte內(nèi)存
vm-max-threads 4 #訪問(wèn)swap文件的線程數(shù)凭迹,不要超過(guò)cpu核心數(shù),為0則為串行操作
glueoutputbuf yes #向客戶端應(yīng)答時(shí)是否把較小的包合并為一個(gè)包發(fā)送苦囱,默認(rèn)為開(kāi)啟
hash-max-zipmap-entries 512 #指定在超過(guò)一定的數(shù)量或者最大的元素超過(guò)某一臨界值時(shí)嗅绸,采用一種特殊的哈希算法
hash-max-zipmap-value 64 #同上為一組功能
activerehashing yes #是否激活重置哈希,默認(rèn)開(kāi)啟
include /path/to/local.conf #指定包含的其他配置文件
sentinel配置文件:
bind 0.0.0.0 #在一些云主機(jī)上屏蔽掉了IPv6撕彤,所以加上這一項(xiàng)可只監(jiān)聽(tīng)I(yíng)Pv4
port xxxooo #端口
sentinel monitor master 127.0.0.1 6379 2 #指定要監(jiān)控的主IP朽砰、端口,2表示有幾個(gè)sentinel監(jiān)控到主出問(wèn)題時(shí)才判定down
sentinel down-after-milliseconds master 30000 #指定sentinel監(jiān)控到主異常多長(zhǎng)時(shí)間才判定down,單位毫秒
sentinel failover-timeout master 180000 #指定在該之間內(nèi)未完成主從切換則認(rèn)為本次failover失敗
sentinel parallel-syncs master 1 #指定failover過(guò)程中同時(shí)重新配置的slave的個(gè)數(shù)瞧柔,該值最好取小
sentinel notification-script #指定sentinel檢測(cè)到異常時(shí)執(zhí)行的腳本
sentinel auth-pass master password #password為redis有密碼時(shí)添加訪問(wèn)密碼