redis常用指令總結(jié)以及功能介紹

redis常用指令總結(jié)以及功能介紹 - 前行的snail - CSDN博客

第一部分 redis的常用指令

一、針對key的操作

1.1 del key [key .. ] ? ? ? ? ? ? ? ? , 刪除指定的一個或者多個key;

1.2 dump key ? ? ? ? ? ? ? ? ? ? ? ? ?, 序列化給定的key

1.3 restore key ttl serialized-value ?, 反序列化到key

1.4 exists key ? ? ? ? ? ? ? ? ? ? ? ?, 判斷某一key是否存在

1.5 expire key seconds ? ? ? ? ? ? ? ?, 設(shè)置key的過期時間?

? ? ? ? ? ? ① set命令可以覆蓋過期時間;不改變key的操作不會影響key的生存時間

② rename也不會改變key的過期時間

③ persist命令可以刪除key的過期時間,即永久

④ ttl可以查看redis中key的過期時間

1.6 expireat key timestamp ? ? ? ? ? ?, 設(shè)置key的生存時間

1.7 keys pattern ? ? ? ? ? ? ? ? ? ? ?, 查找所有符合給定模式pattern的key

? ? ? ? ? ? ① *, ?, [m,n]

1.8 move key db ? ? ? ? ? ? ? ? ? ? ? , 將當前數(shù)據(jù)庫中的key移動數(shù)據(jù)庫 db中。使用select db可以切換數(shù)據(jù)庫

1.9 persist key ? ? ? ? ? ? ? ? ? ? ? , 移除給定 key 的生存時間

1.10 pexpire,pexpireat ? ? ? ? ? ? ? ?, 設(shè)置key的過期、生存時間,單位毫秒

1.11 ttl,pttl ? ? ? ? ? ? ? ? ? ? ? ? , key的剩余過期時間,單位秒,單位是毫秒

1.12 randomkey ? ? ? ? ? ? ? ? ? ? ? ?, 隨機返回一個key

1.13 rename key newkey ? ? ? ? ? ? ? ?, 將 key 改名為 newkey ,當newkey存在時會覆蓋

1.14 renamenx key newkey ? ? ? ? ? ? ?, ?當newkey不存在時,將key改名為newkey

1.15 sort key [by pattern] [get pattern [get pattern]] [limit offset count] [asc | desc] [alpha] [store destination] ?,排序,pattern可以有 *字符出現(xiàn)

1.16 type key ? ? ? ? ? ? ? ? ? ? ? ? , ?返回key所存儲的值的類型 (none,string,list,set,zset,hash)

1.17 scan [db] cursor [MATCH pattern] [COUNT count] ,增量式迭代。 ?類似有 sscan,hscan,zscan

? ? ? ? ? ① SCAN命令用于迭代當前數(shù)據(jù)庫中的數(shù)據(jù)庫鍵。 ? 返回結(jié)果為:用于下一次迭代的新游標;所有被迭代的元素

? ? ? ? ? ② SSCAN 命令用于迭代集合鍵中的 元素。

? ? ? ? ? ③ HSCAN 命令用于迭代哈希鍵中的 鍵值對。

? ? ? ? ? ④ ZSCAN 命令用于迭代有序集合中的 元素(包括元素成員和元素分值)

二、String操作

2.1 append key value ? ? ? ? ? ? ? ? , 將value追加到原先值的末尾

2.2 bitcount key [start] [end] ? ? ? , 計算給定字符串中,設(shè)置為1的比特位的數(shù)據(jù)量。

? ? ? ① 注意字符串"1"對應(yīng)的十進制為49,二進制為00110001

? ? ? ② 可以通過setbit key offset value

2.3 bitop operation destkey key [key ...] ?, 對key的二進制字符串進行元操作,operation可以是and,or, not,xor。

2.4 decr key ? ? ? ? ? ? ? ? ? ? ? ? ?, 將key中存儲的數(shù)字值減一

? ? ? ① 與incr命令相反

2.5 decrby key decrement ? ? ? ? ? ? ?, 將key所存儲的值減去減量decrement

? ? ? ② 與incrby命令相反

2.6 get key

2.7 getbit key offset ? ? ? ? ? ? ? ? , 獲取key中所存儲字符串值對應(yīng)偏移量上的bit

2.8 getrange key start end ? ? ? ? ? ?, 返回key中字符串值的子字符串

2.9 getset key value ? ? ? ? ? ? ? ? ?, 設(shè)置key的值為value,并返回key的舊值

2.10 mget key [key ...] ? ? ? ? ? ? ? , 返回指定的多個key的值

2.11 mset key value [key value ...] ? , 同時設(shè)置多個key-value值

2.12 msetnx key value [key value ...] , 當且僅當所有的key都不存在時,同時設(shè)置多個key-value對

2.13 set key value [EX second] [PX millisceonds] [NX|XX]

? ? ? ?① setex key second value , 設(shè)置key的同時設(shè)置過期時間單位為秒

? ? ? ?② psetex key millisceonds value , 過期時間單位為毫秒

③ setbit key offset value , 設(shè)置指定偏移量上的位

④ setnx key value , 當且僅當key不存在時設(shè)置key的value

⑤ setrange key offset value , 從offset開始,用value參數(shù)覆蓋key中的值

2.14 strlen key ? ? ? ? ? ? ? ? ? ? ?, 返回key中所存字符串的長度

三、 Hash操作

3.1 hdel key field [field ...] ? ? ? , 刪除哈希表key中的一個或多個指定域

3.2 hexists key field ? ? ? ? ? ? ? ?, 查看哈希表key中給定的field是否存在

3.3 hget key feild ? ? ? ? ? ? ? ? ? , 查看哈希表key中給定的field的值

? ? ? ① hgetall key , 查看哈希表key中所有的field的值

? ② hmget key field [field ...] , 返回哈希表key中一個或多個給定域的值

3.4 hincrby key field increment ? ? ?, 為哈希表key中的field的值加上增量increment

3.5 hkeys key ? ? ? ? ? ? ? ? ? ? ? ?, 獲取哈希表key中的所有域

3.6 hlen key ? ? ? ? ? ? ? ? ? ? ? ? , 返回哈希表key中域的數(shù)量

3.7 hset key field value ? ? ? ? ? ? , 設(shè)置哈希表key中field的值

? ? ? ① hmset key field value [field value] , 同時設(shè)置過個field的值

? ② hsetnx key field value , 當field不存在時,設(shè)置field的值

3.8 hvals key ? ? ? ? ? ? ? ? ? ? ? ?, 返回哈希表key中所有域的值

3.9 hstrlen key field ? ? ? ? ? ? ? ?, 返回哈希表key中給定field關(guān)聯(lián)值的字符長度

四、List操作(List相當于堆棧)

4.1 lpush key value [value ...] ? ? ?, 將一個或者多個值插入到列表key的表頭

? ? ? ① rpush key value [value ...] , 將一個或者多個值插入到列表key的表尾

? ② lpushx key value ,當且僅當key存在時將值value插入到key的表頭

? ③ rpushx key value ,當且僅當key存在時將值value插入到key的表尾

4.2 lpop key ? ? ? ? ? ? ? ? ? ? ? ? ?, 移除并返回列表key的頭元素

? ? ? ① rpop key , 移除并返回列表的尾元素

? ② blpop key [key ...] timeout , lpop的阻塞式指令

? ③ brpop key [key ...] timeout , rpop的阻塞式指令

? ④ rpoplpush source destination , 將列表Source的尾元素彈出以及返回客戶端,并且將該元素插入到destination列表中

? ⑤ brpoplpush source destination timeout , rpoplpush的阻塞版

4.3 lindex key index ? ? ? ? ? ? ? ? ?, 返回key中下表為index的元素

4.4 linsert key before|after pivot value , 將值value插入到key中,位為pivot之前或者之后

4.5 llen key ? ? ? ? ? ? ? ? ? ? ? ? ? , 返回列表key的長度

4.6 lrange key start stop ? ? ? ? ? ? ?, 返回列表key中指定區(qū)間內(nèi)的元素

4.7 lrem key count value ? ? ? ? ? ? ? , 根據(jù)count的值,移除列表中與參數(shù)value相等的元素

4.8 lset key index value ? ? ? ? ? ? ? , 將列表key下表為index的元素值設(shè)置為value

4.9 ltrim key start stop ? ? ? ? ? ? ? , 對一個列表進行trim

五、Set操作(不可重復(fù))

5.1 sadd key member [member ...] ? ? ? , 將元素加入到集合key中,已經(jīng)有的忽略

5.2 scard key ? ? ? ? ? ? ? ? ? ? ? ? ?, 返回集合key的元素個數(shù)

5.3 sdiff key [key ...] ? ? ? ? ? ? ? ?, 返回一個集合的全部成員,該集合是所有給定集合之間的差集

5.4 sdiffstore destination key [key ...] , 放回集合之間的差集,并將它保存在destination集合中

5.5 sinter key [key ...] ? ? ? ? ? ? ? ,返回集合中給定集合的交集

5.6 sinterstore destination key [key ...] , 返回給定集合之間的差集,并將它保存在destination集合中

5.7 sismember key member ? ? ? ? ? ? ? , 判斷member元素是否為集合key成員

5.8 smembers key ? ? ? ? ? ? ? ? ? ? ? , 返回集合中的所有成員

5.9 smove source destination member ? ?, 將member元素從source集合移動到destination集合

5.10 spop key ? ? ? ? ? ? ? ? ? ? ? ? ?, 移除并返回集合中的一個隨機元素

5.11 srandmember key [count] ? ? ? ? ? , 返回指定count個數(shù)的集合,count為正數(shù)表示不能重復(fù),負數(shù)可以重復(fù)

5.12 srem key member [member ...] ? ? ?, 移除集合key中的多個元素

5.13 sunion key [key ...] ? ? ? ? ? ? ?, 返回所有指定key的并集

5.14 sunionstore destination key [key ...]?

六、ZADD操作(有序集合)

6.1 zadd key source member [[source member] [...]] , 將一個或者多個member元素及其score值加入到有序集合key中

6.2 zcard key ? ? ? ? ? ? ? ? ? ? ? ? ?, 返回有序集合key的元素個數(shù)

6.3 zcount key min max ? ? ? ? ? ? ? ? , 返回有序集合key中,score值在min和max之間的元素個數(shù)

6.4 zincrby key increment member ? ? ? , 為有序集合key的成員member的score值加上增量increment

6.5 zrange key start stop ? ? ? ? ? ? ?, 返回有序集key中,指定下標區(qū)間內(nèi)的成員

? ① zrevrange key start stop [withscores] , 返回指定區(qū)間內(nèi)的成員遞減順序

? ② zrevrangebyrank key max min [withscores] [limit offset count]

6.6 zrangebyscore key min max [withscopes] [limit offset count] , 返回score值介于min和max之間的集合

6.7 zrank key member ? ? ? ? ? ? ? ? ? , 返回有序集key中成員member的排名

? ① zrevrank key member ? ? ? ? ?, 返回有序集key中成員member的遞減排名

6.8 zrem key member [member ...] ? ? ? , 移除有序集key中的多個成員

? ? ? ① zremrangebyrank key start stop , 移除有序集key中,指定排名區(qū)間內(nèi)的所有成員

? ② zremrangebyscore key min max , 移除有序集key中,指定score范圍內(nèi)的成員

6.9 zscore key member ? ? ? ? ? ? ? ? ?, 返回成員member的score值

七、pub/sub(發(fā)布、訂閱)

7.1 psubscribe pattern [pattern ...] ? , 訂閱一個或者多個符合給定模式的頻道

7.2 publish channel message ? ? ? ? ? ?, 將信息message發(fā)送到指定的頻道channel

7.3 pubsub <subcommand> [argument ...] , 查看訂閱與發(fā)布系統(tǒng)狀態(tài)的內(nèi)省命令

? eg pubsub channels [pattern] , 列出當前的活躍頻道,訂閱模式的客戶端不計算在內(nèi)

? eg pubsub numsub [channel-1 ...] , 返回給定頻道的訂閱者數(shù)量,訂閱模式的客戶端不計算在內(nèi)

7.4 punsubscribe [pattern ...] ? ? ? ? ?, 指示客戶端退訂所有給定模式

7.5 subscribe channel [channel ...] ? ? , 訂閱給定的一個或者多個頻道信息

7.6 unsubscribe [channel ...] ? ? ? ? ? , 指示客戶端退訂給定的頻道

八、Transaction(事務(wù))

8.1 discard ? ? ? ? ? ? ? ? ? ? ? ? ? ? , 取消執(zhí)行事務(wù)塊內(nèi)的所有命令

8.2 exec ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?, 執(zhí)行事務(wù)塊內(nèi)的命令

8.3 multi ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? , 標記一個事務(wù)塊的開始

8.4 unwatch ? ? ? ? ? ? ? ? ? ? ? ? ? ? , 取消watch命令對所有key的監(jiān)視

8.5 watch key [key ...] ? ? ? ? ? ? ? ? , 監(jiān)視一個或者多個key,如果事務(wù)執(zhí)行之前,這個kye被其它命令所動,則事務(wù)被打斷

九、Connection(連接)

9.1 auth password ? ? ? ? ? ? ? ? ? ? ? , 登錄redis時輸入密碼

9.2 echo message ? ? ? ? ? ? ? ? ? ? ? ?, 打印一個特定的信息message,測試時使用

9.3 ping ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?, 測試與服務(wù)器的連接,如果正常則返回pong

9.4 quit ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?, 請求服務(wù)器關(guān)閉與當前客戶端的連接

9.5 select index ? ? ? ? ? ? ? ? ? ? ? ?, 切換到指定的數(shù)據(jù)庫

十、Server(服務(wù)器)

10.1 bgsave ? ? ? ? ? ? ? ? ? ? ? ? ? ? , 后臺異步保存數(shù)據(jù)到硬盤

10.2 client setname/client getname ? ? ?, 為連接設(shè)置、獲取名字

10.3 client kill ip:port ? ? ? ? ? ? ? ?, 關(guān)閉地址為 ip:port的客戶端

10.4 client list ? ? ? ? ? ? ? ? ? ? ? ?, 以人類可讀的方式,返回所有的連接客戶端信息和統(tǒng)計數(shù)據(jù)

10.5 config get parameter ? ? ? ? ? ? ? , 取得運行redis服務(wù)器的配置參數(shù)

10.6 config set parameter value ? ? ? ? , 設(shè)置redis服務(wù)器的配置參數(shù)

10.7 config resetstat ? ? ? ? ? ? ? ? ? , 重置info命令的某些統(tǒng)計數(shù)據(jù)

10.8 dbsize ? ? ? ? ? ? ? ? ? ? ? ? ? ? , 返回當前數(shù)據(jù)庫中key的數(shù)量

10.9 flushall ? ? ? ? ? ? ? ? ? ? ? ? ? , 清空整個redis服務(wù)器的數(shù)據(jù)(刪除所有數(shù)據(jù)庫的所有 key)

10.10 flushdb ? ? ? ? ? ? ? ? ? ? ? ? ? , 清空當前數(shù)據(jù)庫中的所有key

10.11 info [section] ? ? ? ? ? ? ? ? ? ?, 返回redis服務(wù)器的各種信息和統(tǒng)計數(shù)據(jù)

10.12 lastsave ? ? ? ? ? ? ? ? ? ? ? ? ?, 返回最近一次redis成功將數(shù)據(jù)保存到磁盤時的時間

10.13 monitor ? ? ? ? ? ? ? ? ? ? ? ? ? , 實時打印出redis服務(wù)器接收到的指令

10.14 save ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?, 將當前 Redis 實例的所有數(shù)據(jù)快照(snapshot)以 RDB 文件的形式保存到硬盤

10.15 slaveof host port ? ? ? ? ? ? ? ? , 將當前服務(wù)器轉(zhuǎn)變?yōu)橹付ǚ?wù)器的從屬服務(wù)器

10.16 slowlog subcommand [argument] ? ? , Redis 用來記錄查詢執(zhí)行時間的日志系統(tǒng)

第二部分 redis的一些功能介紹

一、持久化

1.1 持久化方式:RDB與AOF。

①RDB:在指定的時間間隔內(nèi)生成數(shù)據(jù)集的時間點快照(snapshot);

②AOF(append-only file):持久化記錄服務(wù)器執(zhí)行的所有寫操作命令,并在服務(wù)器啟動時,通過重新執(zhí)行這些命令來還原數(shù)據(jù)集。

③Redis支持同時使用AOF和RDB持久化。在這種情況下,當Redis重啟時,它會優(yōu)先使用AOF文件來還原數(shù)據(jù)集,因為AOF文件保存的數(shù)據(jù)集通常比RDB文件所保存的數(shù)據(jù)集更完整。

1.2 RDB持久化

? ?當 Redis 需要保存 dump.rdb 文件時, 服務(wù)器執(zhí)行以下操作:

①Redis 調(diào)用 fork()。

②子進程將數(shù)據(jù)集寫入到一個臨時 RDB 文件中。

③當子進程完成對新 RDB 文件的寫入時,Redis 用新 RDB 文件替換原來的 RDB 文件,并刪除舊的 RDB 文件。

缺點:如果 Redis 因為某些原因而造成故障停機, 那么服務(wù)器將丟失最近寫入、且仍未保存到快照中的那些數(shù)據(jù)。因此需要使用開啟AOF。

1.3 AOF重寫

①AOF的運作方式是不斷地將命令追加到文件的末尾,所以隨著寫入命令的不斷增加,AOF文件的體積也會變得越來越大。

②你可以配置 Redis 多久才將數(shù)據(jù) fsync 到磁盤一次。有三個選項,每次有新命令追加到 AOF 文件時就執(zhí)行一次 fsync :非常慢,也非常安全;每秒 fsync 一次:足夠快(和使用 RDB 持久化差不多),并且在故障時只會丟失 1 秒鐘的數(shù)據(jù);從不 fsync :將數(shù)據(jù)交給操作系統(tǒng)來處理。更快,也更不安全的選擇。

③AOF重寫步驟:

? ?(1)Redis 執(zhí)行 fork() ,現(xiàn)在同時擁有父進程和子進程。

? ?(2)子進程開始將新 AOF 文件的內(nèi)容寫入到臨時文件。

? ?(3)對于所有新執(zhí)行的寫入命令,父進程一邊將它們累積到一個內(nèi)存緩存中,一邊將這些改動追加到現(xiàn)有AOF文件的末尾:這樣即使在重寫的中途發(fā)生停機,現(xiàn)有的 AOF 文件也還是安全的。

? ?(4)當子進程完成重寫工作時,它給父進程發(fā)送一個信號,父進程在接收到信號之后,將內(nèi)存緩存中的所有數(shù)據(jù)追加到新 AOF 文件的末尾。

? ?(5)搞定!現(xiàn)在 Redis 原子地用新文件替換舊文件,之后所有命令都會直接追加到新 AOF 文件的末尾。

④從RDB持久化到AOF持久化切換

? ? (1)為最新的 dump.rdb 文件創(chuàng)建一個備份。

? ? ? ? ? ? ?(2)將備份放到一個安全的地方。

? ? ? ? ? ? ?(3)執(zhí)行以下兩條命令:

? ? ? ? ? ? ? ? ? ? ? CONFIG SET appendonly yes

? ? ? ? ? ? ? ? ? ? ? CONFIG SET save "" ? ?//關(guān)閉RDB功能

1.4 數(shù)據(jù)備份

①創(chuàng)建一個定期任務(wù)(cron job)每小時將一個RDB文件備份到一個文件夾,并且每天將一個RDB文件備份到另一個文件夾。 ②確??煺盏膫浞荻紟в邢鄳?yīng)的日期和時間信息,每次執(zhí)行定期任務(wù)腳本時,使用find命令來刪除過期的快照:比如說,你可以保留最近48小時內(nèi)的每小時快照,還可以保留最近一兩個月的每日快照。

? ? ? ? ③至少每天一次,將RDB備份到你的數(shù)據(jù)中心之外,或者至少是備份到你運行Redis服務(wù)器的物理機器之外。

二、Sentinel

2.1 Redis的Sentinel系統(tǒng)用于管理多個Redis服務(wù)器,該系統(tǒng)執(zhí)行以下三個任務(wù)

①監(jiān)控(Monitoring):Sentinel 會不斷地檢查你的主服務(wù)器和從服務(wù)器是否運作正常。

②提醒(Notification):當被監(jiān)控的某個Redis服務(wù)器出現(xiàn)問題時,Sentinel可以通過API向管理員或者其他應(yīng)用程序發(fā)送通知。

③自動故障遷移(Automatic failover):當一個主服務(wù)器不能正常工作時,Sentinel會開始一次自動故障遷移操作,它會將失效主服務(wù)器的其中一個從服務(wù)器升級為新的主服務(wù)器,并讓失效主服務(wù)器的其他從服務(wù)器改為復(fù)制新的主服務(wù)器;當客戶端試圖連接失效的主服務(wù)器時,集群也會向客戶端返回新主服務(wù)器的地址,使得集群可以使用新主服務(wù)器代替失效服務(wù)器。

2.2 啟動 Sentinel

①redis-sentinel /path/to/sentinel.conf

②redis-server /path/to/sentinel.conf --sentinel

2.3 配置 Sentinel

sentinel monitor mymaster 127.0.0.1 6379 2 ? //配置指示 Sentinel 去監(jiān)視一個名為 mymaster 的主服務(wù)器。這個主服務(wù)器的 IP 地址為 127.0.0.1 , 端口號為 6379 , 而將這個主服務(wù)器判斷為失效至少需要 2 個 Sentinel 同意

sentinel down-after-milliseconds mymaster 60000 ?//選項指定了 Sentinel 認為服務(wù)器已經(jīng)斷線所需的毫秒數(shù)

sentinel failover-timeout mymaster 180000

sentinel parallel-syncs mymaster 1 ? ?//選項指定了在執(zhí)行故障轉(zhuǎn)移時, 最多可以有多少個從服務(wù)器同時對新的主服務(wù)器進行同步

sentinel monitor resque 192.168.1.3 6380 4

sentinel down-after-milliseconds resque 10000

sentinel failover-timeout resque 180000

sentinel parallel-syncs resque 5

2.4 主客觀下線

①主觀下線(Subjectively Down,簡稱SDOWN)指的是單個 Sentinel 實例對服務(wù)器做出的下線判斷。

②客觀下線(Objectively Down,簡稱ODOWN)指的是多個 Sentinel 實例在對同一個服務(wù)器做出 SDOWN 判斷,并且通過SENTINEL is-master-down-by-addr命令互相交流之后,得出的服務(wù)器下線判斷。(一個 Sentinel 可以通過向另一個 Sentinel發(fā)送SENTINEL is-master-down-by-addr命令來詢問對方是否認為給定的服務(wù)器已下線。)

2.5 Sentinel需要定期執(zhí)行的任務(wù)

①每個Sentinel以每秒鐘一次的頻率向它所知的主服務(wù)器、從服務(wù)器以及其他 Sentinel 實例發(fā)送一個 PING 命令。

②如果一個實例(instance)距離最后一次有效回復(fù) PING 命令的時間超過 down-after-milliseconds 選項所指定的值, 那么這個實例會被 Sentinel 標記為主觀下線。 一個有效回復(fù)可以是: +PONG 、 -LOADING 或者 -MASTERDOWN 。

③如果一個主服務(wù)器被標記為主觀下線,那么正在監(jiān)視這個主服務(wù)器的所有 Sentinel 要以每秒一次的頻率確認主服務(wù)器的確進入了主觀下線狀態(tài)。

④如果一個主服務(wù)器被標記為主觀下線,并且有足夠數(shù)量的Sentinel(至少要達到配置文件指定的數(shù)量)在指定的時間范圍內(nèi)同意這一判斷,那么這個主服務(wù)器被標記為客觀下線。

⑤在一般情況下,每個 Sentinel 會以每10秒一次的頻率向它已知的所有主服務(wù)器和從服務(wù)器發(fā)送INFO命令。 當一個主服務(wù)器被Sentinel標記為客觀下線時,Sentinel 向下線主服務(wù)器的所有從服務(wù)器發(fā)送 INFO 命令的頻率會從 10 秒一次改為每秒一次。

⑥當沒有足夠數(shù)量的 Sentinel 同意主服務(wù)器已經(jīng)下線, 主服務(wù)器的客觀下線狀態(tài)就會被移除。 當主服務(wù)器重新向 Sentinel 的 PING 命令返回有效回復(fù)時, 主服務(wù)器的主觀下線狀態(tài)就會被移除。

2.6 Sentinel API

①主要有兩種:(1)通過直接發(fā)送命令來查詢被監(jiān)視 Redis 服務(wù)器的當前狀態(tài);(2)使用發(fā)布與訂閱功能, 通過接收 Sentinel 發(fā)送的通知。

②Sentinel命令

(1)PING :返回 PONG 。

(2)SENTINEL masters :列出所有被監(jiān)視的主服務(wù)器,以及這些主服務(wù)器的當前狀態(tài)。

(3)SENTINEL slaves <master name> :列出給定主服務(wù)器的所有從服務(wù)器,以及這些從服務(wù)器的當前狀態(tài)。

(4)SENTINEL get-master-addr-by-name <master name> 返回給定名字的主服務(wù)器的IP地址和端口號。如果這個主服務(wù)器正在執(zhí)行故障轉(zhuǎn)移操作,或者針對這個主服務(wù)器的故障轉(zhuǎn)移操作已經(jīng)完成, 那么這個命令返回新的主服務(wù)器的 IP地址和端口號。

(5)SENTINEL reset <pattern> : 重置所有名字和給定模式 pattern 相匹配的主服務(wù)器。 pattern 參數(shù)是一個 Glob 風(fēng)格的模式。 重置操作清除主服務(wù)器目前的所有狀態(tài), 包括正在執(zhí)行中的故障轉(zhuǎn)移, 并移除目前已經(jīng)發(fā)現(xiàn)和關(guān)聯(lián)的, 主服務(wù)器的所有從服務(wù)器和 Sentinel 。

(6)SENTINEL failover <master name> : 當主服務(wù)器失效時, 在不詢問其他 Sentinel 意見的情況下, 強制開始一次自動故障遷移 (不過發(fā)起故障轉(zhuǎn)移的 Sentinel 會向其他 Sentinel 發(fā)送一個新的配置,其他 Sentinel 會根據(jù)這個配置進行相應(yīng)的更新)。

③發(fā)布與訂閱信息

客戶端可以將 Sentinel 看作是一個只提供了訂閱功能的Redis服務(wù)器:你不可以使用 PUBLISH命令向這個服務(wù)器發(fā)送信息,但你可以用SUBSCRIBE命令或者PSUBSCRIBE 命令, 通過訂閱給定的頻道來獲取相應(yīng)的事件提醒。

客戶端可以通過訂閱來獲得的頻道和信息的格式:第一個英文單詞是頻道/事件的名字

<instance-type> <name> <ip> <port> @ <master-name> <master-ip> <master-port>

三、redis集群

3.1 Redis 集群是一個可以在多個 Redis 節(jié)點之間進行數(shù)據(jù)共享的設(shè)施

? ?notice :Redis 集群不支持那些需要同時處理多個鍵的 Redis 命令, 因為執(zhí)行這些命令需要在多個 Redis 節(jié)點之間移動數(shù)據(jù), 并且在高負載的情況下, 這些命令將降低 Redis 集群的性能,并導(dǎo)致不可預(yù)測的行為。

3.2 redis集群好處,Redis 集群提供了以下兩個好處:

將數(shù)據(jù)自動切分(split)到多個節(jié)點的能力。

當集群中的一部分節(jié)點失效或者無法進行通訊時, 仍然可以繼續(xù)處理命令請求的能力。

3.3 redis集群數(shù)據(jù)共享

? ?①Redis 集群使用數(shù)據(jù)分片(sharding)而非一致性哈希(consistency hashing)來實現(xiàn): 一個 Redis 集群包含 16384 個哈希槽(hash slot), 數(shù)據(jù)庫中的每個鍵都屬于這 16384 個哈希槽的其中一個, 集群使用公式 CRC16(key) % 16384 來計算鍵 key 屬于哪個槽, 其中 CRC16(key) 語句用于計算鍵 key 的 CRC16 校驗和。

②將一個哈希槽從一個節(jié)點移動到另一個節(jié)點不會造成節(jié)點阻塞, 所以無論是添加新節(jié)點還是移除已存在節(jié)點, 又或者改變某個節(jié)點包含的哈希槽數(shù)量, 都不會造成集群下線。

3.4 集群的主從復(fù)制

為了使得集群在一部分節(jié)點下線或者無法與集群的大多數(shù)(majority)節(jié)點進行通訊的情況下,仍然可以正常運作,Redis集群對節(jié)點使用了主從復(fù)制功能:集群中的每個節(jié)點都有 1 個至 N 個復(fù)制品(replica),其中一個復(fù)制品為主節(jié)點(master),而其余的 N-1個復(fù)制品為從節(jié)點(slave)。

3.5 節(jié)點屬性

? ?①每個節(jié)點在集群中都有一個獨一無二的 ID ,該ID是一個十六進制表示的160位隨機數(shù),在節(jié)點第一次啟動時由 /dev/urandom 生成。

節(jié)點信息: ?節(jié)點所使用的 IP 地址和 TCP 端口號。

節(jié)點的標志(flags)。

節(jié)點負責(zé)處理的哈希槽。

節(jié)點最近一次使用集群連接發(fā)送 PING 數(shù)據(jù)包(packet)的時間。

節(jié)點最近一次在回復(fù)中接收到 PONG 數(shù)據(jù)包的時間。

集群將該節(jié)點標記為下線的時間。

該節(jié)點的從節(jié)點數(shù)量。

如果該節(jié)點是從節(jié)點的話,那么它會記錄主節(jié)點的節(jié)點 ID 。如果這是一個主節(jié)點的話,那么主節(jié)點 ID 這一欄的值為 0000000 。

eg ?redis-cli cluster nodes

d1861060fe6a534d42d8a19aeb36600e18785e04 :0 myself - 0 1318428930 connected 0-1364

3886e65cc906bfd9b1f7e7bde468726a052d1dae 127.0.0.1:6380 master - 1318428930 1318428931 connected 1365-2729

d289c575dcbc4bdd2931585fd4339089e461a27d 127.0.0.1:6381 master - 1318428931 1318428931 connected 2730-4095

3.6 集群在線重配置

①redis集群支持在集群運行的過程中過程中添加或者移除節(jié)點

添加一個新節(jié)點到集群, 等于將其他已存在節(jié)點的槽移動到一個空白的新節(jié)點里面。

從集群中移除一個節(jié)點, 等于將被移除節(jié)點的所有槽移動到集群的其他節(jié)點上面去。

②CLUSTER命令可用的子命令:當槽被指派或者移除之后,節(jié)點會將這一信息通過Gossip協(xié)議傳播到整個集群

CLUSTER ADDSLOTS slot1 [slot2] ... [slotN] ? //向節(jié)點添加槽

CLUSTER DELSLOTS slot1 [slot2] ... [slotN] ? //向節(jié)點刪除槽

CLUSTER SETSLOT slot NODE node ? ? ? ? ? ? ? //將指定的槽指派給節(jié)點node

CLUSTER SETSLOT slot MIGRATING node ? ?//將給定節(jié)點 node 中的槽 slot 遷移出節(jié)點

CLUSTER SETSLOT slot IMPORTING node ?// 將給定槽 slot 導(dǎo)入到節(jié)點 node

四、Redis過期鍵刪除策略

被動刪除:當讀/寫一個已經(jīng)過期的key時,會觸發(fā)惰性刪除策略,直接刪除掉這個過期key

主動刪除:由于惰性刪除策略無法保證冷數(shù)據(jù)被及時刪掉,所以Redis會定期主動淘汰一批已過期的key

當前已用內(nèi)存超過maxmemory限定時,觸發(fā)主動清理策略

? ? ? ? 4.1 被動刪除

只有key被操作時(如GET),REDIS才會被動檢查該key是否過期,如果過期則刪除之并且返回NIL。

1、這種刪除策略對CPU是友好的,刪除操作只有在不得不的情況下才會進行,不會其他的expire key上浪費無謂的CPU時間。 2、但是這種策略對內(nèi)存不友好,一個key已經(jīng)過期,但是在它被操作之前不會被刪除,仍然占據(jù)內(nèi)存空間。如果有大量的過期鍵存在但是又很少被訪問到,那會造成大量的內(nèi)存空間浪費。

4.2 主動刪除

相當于一個定時任務(wù),主動掃描過期的key。

4.3 主動清除策略

當前已用內(nèi)存超過maxmemory的限定后,主動觸發(fā)清除策略。當mem_used內(nèi)存已經(jīng)超過maxmemory的設(shè)定,對于所有的讀寫請求,都會觸發(fā)函數(shù)以清理超出的內(nèi)存。注意這個清理過程是阻塞的,直到清理出足夠的內(nèi)存空間。所以如果在達到maxmemory并且調(diào)用方還在不斷寫入的情況下,可能會反復(fù)觸發(fā)主動清理策略,導(dǎo)致請求會有一定的延遲。

noeviction:當?shù)竭_內(nèi)存限制時返回錯誤。當客戶端嘗試執(zhí)行命令時會導(dǎo)致更多內(nèi)存占用(大多數(shù)寫命令,除了 DEL 和一些例外)。

allkeys-lru:回收最近最少使用(LRU)的鍵,為新數(shù)據(jù)騰出空間。

volatile-lru:回收最近最少使用(LRU)的鍵,但是只回收有設(shè)置過期的鍵,為新數(shù)據(jù)騰出空間。

allkeys-random:回收隨機的鍵,為新數(shù)據(jù)騰出空間。

volatile-random:回收隨機的鍵,但是只回收有設(shè)置過期的鍵,為新數(shù)據(jù)騰出空間。

volatile-ttl:回收有設(shè)置過期的鍵,嘗試先回收離 TTL 最短時間的鍵,為新數(shù)據(jù)騰出空間。

---------------------

作者:kevin_vv

來源:CSDN

原文:https://blog.csdn.net/u013758116/article/details/53433997

版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

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

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