1 單個(gè)鍵管理
-
查看所有鍵
keys * -
鍵總數(shù)
dbsizedbsize命令在計(jì)算鍵總數(shù)時(shí)不會(huì)遍歷所有鍵,而是直接獲取Redis內(nèi)置的鍵總數(shù)變量,所以dbsize命令的時(shí)間復(fù)雜度是O(1)。而keys命令會(huì)遍歷所有鍵,所以它的時(shí)間復(fù)雜度是O(n),當(dāng)Redis保存了大量鍵時(shí),線上環(huán)境禁止使用。
-
檢查鍵是否存在
exists key -
刪除鍵
del key [key ...] -
鍵過期
expire key secondsttl命令會(huì)返回鍵的剩余過期時(shí)間,它有3種返回值:
- 大于等于0的整數(shù):鍵剩余的過期時(shí)間。
- 1:鍵沒設(shè)置過期時(shí)間。
- 2:鍵不存在
-
鍵的數(shù)據(jù)結(jié)構(gòu)類型
type key -
鍵重命名
rename key newkey如果在rename之前,鍵java已經(jīng)存在,那么它的值也將被覆蓋。為了防止被強(qiáng)行rename,Redis提供了renamenx命令,確保只有newKey不存在時(shí)候才被覆蓋。
在使用重命名命令時(shí),有兩點(diǎn)需要注意:由于重命名鍵期間會(huì)執(zhí)行del命令刪除舊的鍵,如果鍵對(duì)應(yīng)的值比較大,會(huì)存在阻塞Redis的可能性,這點(diǎn)不要忽視;如果rename和renamenx中的key和newkey如果是相同的,在Redis3.2和之前版本返回結(jié)果略有不同。 -
鍵過期
除了expire、ttl命令以外,Redis還提供了expireat、pexpire、pexpireat、pttl、persist等一系列命令,下面分別進(jìn)行說
明:- expire key seconds:鍵在seconds秒后過期。
- expireat key timestamp:鍵在秒級(jí)時(shí)間戳timestamp后過期。
- pexpire key milliseconds:鍵在milliseconds毫秒后過期。
- pexpireat key milliseconds-timestamp鍵在毫秒級(jí)時(shí)間戳timestamp后過期。
- ttl命令和pttl都可以查詢鍵的剩余過期時(shí)間,但是pttl精度更高可以達(dá)到毫秒級(jí)別。
在使用Redis相關(guān)過期命令時(shí),需要注意以下幾點(diǎn)。
1)如果expire key的鍵不存在,返回結(jié)果為0。
2)如果過期時(shí)間為負(fù)值,鍵會(huì)立即被刪除,猶如使用del命令一樣。
3)persist命令可以將鍵的過期時(shí)間清除。
4)對(duì)于字符串類型鍵,執(zhí)行set命令會(huì)去掉過期時(shí)間,這個(gè)問題很容易在開發(fā)中被忽視。
5)Redis不支持二級(jí)數(shù)據(jù)結(jié)構(gòu)(例如哈希、列表)內(nèi)部元素的過期功能,例如不能對(duì)列表類型的一個(gè)元素做過期時(shí)間設(shè)置。
6)setex命令作為set+expire的組合,不但是原子執(zhí)行,同時(shí)減少了一次網(wǎng)絡(luò)通訊的時(shí)間。
2 遷移鍵
遷移鍵功能非常重要,因?yàn)橛袝r(shí)候我們只想把部分?jǐn)?shù)據(jù)由一個(gè)Redis遷移到另一個(gè)Redis(例如從生產(chǎn)環(huán)境遷移到測(cè)試環(huán)境),Redis發(fā)展歷程中提供了move、dump+restore、migrate三組遷移鍵的方法,它們的實(shí)現(xiàn)方式以及使用的場(chǎng)景不太相同,下面分別介紹。
2.1 move命令
move命令用于在Redis內(nèi)部進(jìn)行數(shù)據(jù)遷移,Redis內(nèi)部可以有多個(gè)數(shù)據(jù)庫(kù),由于多個(gè)數(shù)據(jù)庫(kù)功能后面會(huì)進(jìn)行介紹,這里只需要知道Redis內(nèi)部可以有多個(gè)數(shù)據(jù)庫(kù),彼此在數(shù)據(jù)上是相互隔離的,move key db就是把指定的鍵從源數(shù)據(jù)庫(kù)移動(dòng)到目標(biāo)數(shù)據(jù)庫(kù)中,但筆者認(rèn)為多數(shù)據(jù)庫(kù)功能不建議在生產(chǎn)環(huán)境使用,所以這個(gè)命令讀者知道即可。
2.2 dump+restore命令
dump key
restore key ttl value
dump+restore可以實(shí)現(xiàn)在不同的Redis實(shí)例之間進(jìn)行數(shù)據(jù)遷移的功能,整個(gè)遷移的過程分為兩步:
1)在源Redis上,dump命令會(huì)將鍵值序列化,格式采用的是RDB格式。
2)在目標(biāo)Redis上,restore命令將上面序列化的值進(jìn)行復(fù)原,其中ttl參數(shù)代表過期時(shí)間,如果ttl=0代表沒有過期時(shí)間。
有關(guān)dump+restore有兩點(diǎn)需要注意:第一,整個(gè)遷移過程并非原子性的,而是通過客戶端分步完成的。第二,遷移過程是開啟了兩個(gè)客戶端連接,所以dump的結(jié)果不是在源Redis和目標(biāo)Redis之間進(jìn)行傳輸。
2.3 migrate命令
migrate命令也是用于在Redis實(shí)例間進(jìn)行數(shù)據(jù)遷移的,實(shí)際上migrate命令就是將dump、restore、del三個(gè)命令進(jìn)行組合,從而簡(jiǎn)化了操作流程。migrate命令具有原子性,而且從Redis3.0.6版本以后已經(jīng)支持遷移多個(gè)鍵的功能,有效地提高了遷移效率,migrate在10.4節(jié)水平擴(kuò)容中起到重要作用。
整個(gè)過程如圖所示,實(shí)現(xiàn)過程和dump+restore基本類似,但是有3點(diǎn)不太相同:第一,整個(gè)過程是原子執(zhí)行的,不需要在多個(gè)Redis實(shí)例上開啟客戶端的,只需要在源Redis上執(zhí)行migrate命令即可。第二,migrate命令的數(shù)據(jù)傳輸直接在源Redis和目標(biāo)Redis上完成的。第三,目標(biāo)Redis完成restore后會(huì)發(fā)送OK給源Redis,源Redis接收后會(huì)根據(jù)migrate對(duì)應(yīng)的選項(xiàng)來決定是否在源Redis上刪除對(duì)應(yīng)的鍵。

下面對(duì)migrate的參數(shù)進(jìn)行逐個(gè)說明:
- host:目標(biāo)Redis的IP地址。
- port:目標(biāo)Redis的端口。
- key|"":在Redis3.0.6版本之前,migrate只支持遷移一個(gè)鍵,所以此處是要遷移的鍵,但Redis3.0.6版本之后支持遷移多個(gè)鍵,如果當(dāng)前需要遷移多個(gè)鍵,此處為空字符串""。
- destination-db:目標(biāo)Redis的數(shù)據(jù)庫(kù)索引,例如要遷移到0號(hào)數(shù)據(jù)庫(kù),這里就寫0。
- timeout:遷移的超時(shí)時(shí)間(單位為毫秒)。
- [copy]:如果添加此選項(xiàng),遷移后并不刪除源鍵。
- [replace]:如果添加此選項(xiàng),migrate不管目標(biāo)Redis是否存在該鍵都會(huì)正常遷移進(jìn)行數(shù)據(jù)覆蓋。
- [keys key[key...]]:遷移多個(gè)鍵,例如要遷移key1、key2、key3,此處填
寫“keys key1 key2 key3”。
3 遍歷鍵
3.1 全量遍歷鍵:keys
keys pattern
該命令會(huì)造成redis阻塞,慎用。
3.2 漸進(jìn)遍歷鍵:scan
每次執(zhí)行scan,可以想象成只掃描一個(gè)字典中的一部分鍵,直到將字典中的所有鍵遍歷完畢。scan的使用方法如下:
scan cursor [match pattern] [count number]
- cursor是必需參數(shù),實(shí)際上cursor是一個(gè)游標(biāo),第一次遍歷從0開始,每
次scan遍歷完都會(huì)返回當(dāng)前游標(biāo)的值,直到游標(biāo)值為0,表示遍歷結(jié)束。 - match pattern是可選參數(shù),它的作用的是做模式的匹配,這點(diǎn)和keys的
模式匹配很像。 - count number是可選參數(shù),它的作用是表明每次要遍歷的鍵個(gè)數(shù),默認(rèn)
值是10,此參數(shù)可以適當(dāng)增大。
除了scan以外,Redis提供了面向哈希類型、集合類型、有序集合的掃描遍歷命令,解決諸如hgetall、smembers、zrange可能產(chǎn)生的阻塞問題,對(duì)應(yīng)的命令分別是hscan、sscan、zscan,它們的用法和scan基本類似。
漸進(jìn)式遍歷可以有效的解決keys命令可能產(chǎn)生的阻塞問題,但是scan并非完美無瑕,如果在scan的過程中如果有鍵的變化(增加、刪除、修改),那么遍歷效果可能會(huì)碰到如下問題:新增的鍵可能沒有遍歷到,遍歷出了重復(fù)的鍵等情況,也就是說scan并不能保證完整的遍歷出來所有的鍵,這些是我們?cè)陂_發(fā)時(shí)需要考慮的。