redis鍵管理

1 單個(gè)鍵管理
  • 查看所有鍵

    keys *
    
  • 鍵總數(shù)

    dbsize
    

    dbsize命令在計(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 seconds
    

    ttl命令會(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)的鍵。

migrate命令在Redis實(shí)例之間原子性的遷移數(shù)據(jù)

下面對(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í)需要考慮的。
最后編輯于
?著作權(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)容