十分鐘了解Redis

Redis入門、安裝、配置、命令、數(shù)據(jù)類型、集群模式
Redis 是一個(gè)高性能的key-value內(nèi)存數(shù)據(jù)庫。

1、yum安裝
yum install -y redis 2、編譯安裝(建議) yum install -y gcc
wget http://download.redis.io/releases/redis-5.0.3.tar.gz tar -xvf redis-5.0.3.tar.gz
cd redis-5.0.3 make && make install PREFIX=PWD Redis的啟動(dòng)和關(guān)閉 1、常用配置項(xiàng) 只能使用bind列表中的地址連接redis bind 0.0.0.0 沒有設(shè)置bind和requirepass時(shí)才能啟用,啟用后只有本機(jī)可以連接。在設(shè)置bind或requirepass后此選項(xiàng)失效 protected-mode yes 端口 port 6379 是否以守護(hù)進(jìn)程啟動(dòng) daemonize yes 客戶端連接密碼,注釋則不需要密碼 requirepass foobared 2、常用命令 以配置文件啟動(dòng)redis服務(wù) redis-server redis.conf
在特定端口上啟動(dòng)redis服務(wù)
redis-server --prot <port> 查看redis集群命令幫助 redis-cli --cluster help
客戶端帶參數(shù)連接
redis-cli -h <host> -p <port> -a <pass> 客戶端直接執(zhí)行redis指令 redis-cli [command] 例如:redis-cli shutdown 或者 redis-cli info
殺死全部帶有redis關(guān)鍵字的進(jìn)程
$ pkill redis
Redis的數(shù)據(jù)類型
Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(有序集合)。

1、string
string是最常用的數(shù)據(jù)類型

設(shè)置一個(gè)鍵值對(duì)

SET key value
獲取一個(gè)鍵的值
GET key
使一個(gè)鍵的值自增1,若鍵不存在新增鍵值為1
INCR key
使一個(gè)鍵的值自減1,若鍵不存在新增鍵值為-1
DECR key
使一個(gè)鍵的值自增value,若鍵不存在新增鍵值為value
INCRBY key value
使一個(gè)鍵的值自減value,若鍵不存在新增鍵值為-value
DECRBY key value
設(shè)置多個(gè)鍵值對(duì)
MSET key1 value1 key2 value2 ...
獲取多個(gè)鍵的值
MGET key1 key2 ...
2、hash
指令前綴H-

向哈希表中加入一個(gè)屬性值

HSET key field value
獲取哈希表中一個(gè)屬性的值
HGET key field
向哈希表中加入多個(gè)屬性值
HMSET key field1 value1 field2 value2 ...
獲取哈希表中多個(gè)屬性的值
HMGET key field1 field2 ...
3、 list
指令前綴L-或R-,事實(shí)上它是個(gè)阻塞雙端隊(duì)列

從列表的頭部插入一個(gè)或多個(gè)值,批量插入時(shí)每一個(gè)都從頭部插入會(huì)得到[... value2] value1

LPUSH key value1 [value2 ...]
從列表的頭部插入一個(gè)或多個(gè)值
RPUSH key value1 [value2 ...]
立即從列表頭部彈出一個(gè)元素,不存在則返回nil
LPOP key
立即從列表尾部彈出一個(gè)元素,不存在則返回nil
RPOP key
阻塞彈出列表頭部一個(gè)元素,直到有元素可彈出或等待超時(shí),超時(shí)設(shè)置為0則一直阻塞
BLPOP key timeout
阻塞彈出列表尾部一個(gè)元素
BRPOP key timeout
獲取列表指定范圍內(nèi)的元素
LRANGE key start stop
裁剪列表保留指定范圍的元素
LTRIM key start stop
4、set
指令前綴S-

向集合中添加一個(gè)或多個(gè)成員

SADD key member1 [menber2 ...]
返回集合中的全部成員
SMEMBERS key
從集合中移除一個(gè)或多個(gè)成員
SREM key member1 [menber2 ...]
返回兩個(gè)集合的差集
SDIFF key1 key2
返回兩個(gè)集合的交集
SINTER key1 key2
返回兩個(gè)集合的并集
SUNION key1 key2
判斷menber是否為集合中的成員
SISMEMBER key member
5、zset
指令前綴Z-

向有序集合中添加成員,若成員存在則更新score

ZADD key score1 member1 [score2 member2 ...]
按score從小到大的順序返回score排名在[start,stop]區(qū)間集合成員[返回score]
ZRANGE key start stop [WITHSCORES]
按score從大到小的順序返回score排名在[start,stop]區(qū)間集合成員[返回score]
ZREVRANGE key start stop [WITHSCORES]
從集合中移除一個(gè)成員
ZREM key member
使集合中一個(gè)成員score自增incrment,若成員不存在則新增成員score為increment
ZINCRBY key incrment member
EX 秒為單位的過期時(shí)間;PX毫秒為單位的過期時(shí)間;NX鍵不存在時(shí);XX鍵存在時(shí)

Redis的應(yīng)用場(chǎng)景
緩存

將數(shù)據(jù)庫的查詢結(jié)果放入redis,最常用

阻塞隊(duì)列

list的BLPOP(操作簡(jiǎn)單,但ack需要自己實(shí)現(xiàn))

新聞列表

list的LPUSH放入新數(shù)據(jù),LTRIM或者RPOP將舊數(shù)據(jù)移除,LRANGE查詢指定范圍

計(jì)數(shù)器

string的INCR可實(shí)現(xiàn)計(jì)數(shù)器,加入過期時(shí)間還可以讓計(jì)數(shù)定期清零

TOP N

zset的ZINCRBY可實(shí)現(xiàn)熱點(diǎn)排名

Redis高可用
redis主從復(fù)制
redis.conf中寫入slaveof <masterip> <masterport> 即可,redis在啟動(dòng)時(shí)即可作為從服務(wù)器去同步主服務(wù)器的數(shù)據(jù)

Sentinel 集群
在主從復(fù)制的基礎(chǔ)上增加哨兵進(jìn)程來監(jiān)控master狀態(tài)并實(shí)現(xiàn)主從自動(dòng)切換,啟動(dòng)多個(gè)哨兵來監(jiān)控同一個(gè)redis的master進(jìn)程就構(gòu)成了一個(gè)哨兵集群。
redis-sentinel.conf的配置

sentinel monitor mymaster 127.0.0.1 6379 2
master-name ip port quorum
*quorum干掉一個(gè)master需要的票數(shù)

Sentinel的工作原理
每個(gè)Sentinel以每秒鐘一次的頻率向它所知的Master、Slave以及其他Sentinel實(shí)例發(fā)送一個(gè)PING命令。
如果一個(gè)實(shí)例距離最后一次有效回復(fù)PING命令的時(shí)間超過down-after-milliseconds選項(xiàng)所指定的值,則這個(gè)實(shí)例會(huì)被Sentinel標(biāo)記為主觀下線。
如果一個(gè)Master被標(biāo)記為主觀下線,則正在監(jiān)視這個(gè)Master的所有Sentinel要以每秒一次的頻率確認(rèn)Master的確進(jìn)入了主觀下線狀態(tài)。
當(dāng)有足夠數(shù)量(quorum)的Sentinel在指定的時(shí)間范圍內(nèi)確認(rèn)Master的確進(jìn)入了主觀下線狀態(tài),則Master會(huì)被標(biāo)記為客觀下線。
在一般情況下,每個(gè)Sentinel會(huì)以每10秒一次的頻率向它已知的所有Master,Slave發(fā)送INFO命令。
當(dāng)Master被Sentinel標(biāo)記為客觀下線時(shí),Sentinel向下線的Master的所有Slave發(fā)送INFO命令的頻率會(huì)從10秒一次改為每秒一次。
若沒有足夠數(shù)量的Sentinel同意Master已經(jīng)下線,Master的客觀下線狀態(tài)就會(huì)被移除。若Master重新向Sentinel的PING命令返回有效回復(fù),Master的主觀下線狀態(tài)就會(huì)被移除。
Cluster 集群
redis cluster集群?jiǎn)?dòng)要求至少有6個(gè)節(jié)點(diǎn)(3主3從)

cluster集群搭建
早期版本
$ redis-trib.rb create --replicas <num> host1:port1 ... hostN:portN

最新版本
redis-cli --cluster create --cluster-replicas <num> host1:port1 ... hostN:portN 集群測(cè)試 echo "redis-server --port $1 --daemonize yes --cluster-enabled yes --cluster-config-file nodes-$1.conf" > redis-with-port
chmod a+x redis-with-port ./redis-with-port 6379 && ./redis-with-port 6378 && ./redis-with-port 6377 && ./redis-with-port 6376 && ./redis-with-port 6375 && ./redis-with-port 6374
./redis-cli --cluster create --cluster-replicas 1 \ 127.0.0.1:6379 \ 127.0.0.1:6378 \ 127.0.0.1:6377 \ 127.0.0.1:6376 \ 127.0.0.1:6375 \ 127.0.0.1:6374 如果只是用于測(cè)試的話,redis源碼文件REDIS_HOME/utils/create-cluster中有一個(gè)create-cluster的腳本,這個(gè)腳本會(huì)在30001-30006端口上啟動(dòng)6個(gè)redis實(shí)例,并將他們創(chuàng)建為3主3從的集群模式。

cdREDIS_HOME/utils/create-cluster
$ ./create-cluster start && ./create-cluster create
當(dāng)然自己動(dòng)手寫的話更容易理解到底執(zhí)行了些什么。

集群
redis cluster采用無中心結(jié)構(gòu),節(jié)點(diǎn)間使用gossip協(xié)議進(jìn)行通信。每個(gè)節(jié)點(diǎn)保存數(shù)據(jù)和所有節(jié)點(diǎn)和槽的映射關(guān)系。
哈希槽slot
在redis cluster中使用16834個(gè)slots來存儲(chǔ)一定范圍內(nèi)的數(shù)據(jù)集。每個(gè)redis節(jié)點(diǎn)上有一定數(shù)量的槽。當(dāng)客戶端提交數(shù)據(jù)時(shí),要先計(jì)算出數(shù)據(jù)要落到哪個(gè)虛擬槽內(nèi)。
故障檢測(cè)
集群中的每一個(gè)節(jié)點(diǎn)每經(jīng)過一段時(shí)間都會(huì)向其他節(jié)點(diǎn)發(fā)送PING消息,如果沒有在規(guī)定時(shí)間內(nèi)收到回復(fù),則將該節(jié)點(diǎn)標(biāo)記為疑似下線。當(dāng)集群中過半數(shù)的節(jié)點(diǎn)將某節(jié)點(diǎn)標(biāo)記為疑似下線,則該節(jié)點(diǎn)會(huì)被標(biāo)記為下線,做出此裁定的節(jié)點(diǎn)或發(fā)送一條廣播,任何收到廣播的節(jié)點(diǎn)也將此節(jié)點(diǎn)標(biāo)記為下線。
選舉機(jī)制
當(dāng)從節(jié)點(diǎn)收到自己跟隨的主節(jié)點(diǎn)故障的廣播后,該從節(jié)點(diǎn)會(huì)根據(jù)rank和offset加上一個(gè)隨機(jī)數(shù)來計(jì)算一個(gè)短暫延時(shí),之后該節(jié)點(diǎn)會(huì)將自己的epoch+1,并發(fā)送一條廣播要求其他主節(jié)點(diǎn)進(jìn)行投票,投票者判斷會(huì)比較自身與投票發(fā)起者的epoch來決定是否投票,若投票則在同一個(gè)選舉周期內(nèi)投票者不會(huì)在為相同的epoch投票。當(dāng)發(fā)起投票的從節(jié)點(diǎn)收到大于master半數(shù)時(shí),自身成為master。
故障恢復(fù)
當(dāng)一個(gè)從節(jié)點(diǎn)升級(jí)為主節(jié)點(diǎn)后,接管前任管理的slots,接管前任的其他從節(jié)點(diǎn),發(fā)送一條廣播通知集群自己已經(jīng)接管前任,將集群的epoch設(shè)置為自己的epoch。
注意:Cluster對(duì)于同時(shí)處理多個(gè)鍵的命令,如果所有鍵在同一個(gè)slot則能夠執(zhí)行,否則將不能執(zhí)行。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容