Redis Note(三)日常高頻操作

(三)日常高頻操作

A. 鍵管理

  • 鍵重命名:修改key的名字,若改后的key本已存在,會(huì)被覆蓋本來(lái)key的value,具體可參考下方案例
    1. set a b,初次設(shè)置a的value為b;
    2. set c d,初次設(shè)置c的value為d;
    3. rename a c,將a重命名為c;
    4. get c,獲取c的值,此時(shí)得到的c的value是b,覆蓋了原來(lái)d,且get a獲得的結(jié)果時(shí)nil。
    5. 補(bǔ)充說(shuō)明:rename本質(zhì)新建一個(gè)new key,把old key的value拷貝到new key,然后刪除old key。所以如果rename的key過(guò)大,會(huì)有阻塞redis的可能性。
  • 鍵過(guò)期: key的過(guò)期時(shí)間僅支持string、hash、list、set這類一級(jí)數(shù)據(jù)結(jié)構(gòu),不能單獨(dú)hash等內(nèi)部二級(jí)的某個(gè)值(field)去設(shè)置過(guò)期時(shí)間。關(guān)于key過(guò)期刪除策略可參考第(五)篇的內(nèi)存理解部分。
    1. expire key seconds & pexpire key milliseconds: 設(shè)置過(guò)期時(shí)長(zhǎng),二者精度不一樣。
    2. 使用set命令會(huì)抹掉過(guò)期時(shí)間(源碼可見(jiàn)到這一步驟)。
    3. 建議使用setex命令,原子性,直接一步完成value的設(shè)置和過(guò)期時(shí)間設(shè)置。
  • 鍵遷移
    1. move: redis內(nèi)部遷移,對(duì)內(nèi)部db0 到db15,move key db;
    2. dump + restore
      • 第一步在源redis上dump key;
      • 然后目標(biāo)redis上restore key ttl value,完成redis不同實(shí)例間遷移。
      • 注意,value是dump生成代碼;
    3. migrate: 具有原子性,僅在源redis上執(zhí)行即可,migrate target_host target_port key db timeout。
      • migrate 192.18.4.1 6379 hello 0 1000,向192.18.4.1的redis遷移數(shù)據(jù)內(nèi)容。
      • 注意,可在key前加copy(源不刪除)和replace(強(qiáng)制覆蓋目標(biāo))。
  • 遍歷鍵
    1. keys: keys * OR keys h?ll*
    2. scan: 漸進(jìn)式遍歷,每次遍歷部分。
      • scan 0,會(huì)返回一個(gè)游標(biāo)(比如6),然后給出本次漸進(jìn)式遍歷得到的結(jié)果;
      • 第二次,scan 6,慢慢重復(fù)。直到游標(biāo)給0結(jié)束。

B. 發(fā)布訂閱(MQ)功能

  • 概述:redis可以實(shí)現(xiàn)消息中間件的功能,承接生產(chǎn)者 & 消費(fèi)者。
  • 發(fā)布消息
    • 語(yǔ)法:publish channel message。
    • 案例:publish xxx “we are the champion!”,返回結(jié)果是訂閱者個(gè)數(shù)。
  • 訂閱消息
    • 語(yǔ)法:subscribe channel
    • 案例:subscribe xxx,訂閱上方channel,若后續(xù)生產(chǎn)者publish內(nèi)容,則使用該命令的客戶端會(huì)受到對(duì)應(yīng)信息。
  • 總結(jié):路人甲打開(kāi)redis客戶端1號(hào),開(kāi)始進(jìn)行publish發(fā)布,此時(shí)甲是生產(chǎn)者。路人乙和丙打開(kāi)redis客戶端2,3號(hào),對(duì)甲的channel訂閱,那么乙和丙是消費(fèi)者。若甲開(kāi)始publish,后續(xù)乙和丙會(huì)收到信息,同時(shí)甲收到返回結(jié)果為2,表示兩個(gè)客戶端收到信息。

C. 其他類型操作

  • 主從模式(包括cluster sentinel)下臟數(shù)據(jù)問(wèn)題

    • 預(yù)防出現(xiàn):確保slave節(jié)點(diǎn)在分流功能上僅負(fù)責(zé)讀的流量分擔(dān),新寫入或變更數(shù)據(jù)的操作直接和master節(jié)點(diǎn)交互,由master同步給所有的slave。

    • 解決方案:若臟數(shù)據(jù)已寫入或主從數(shù)據(jù)已經(jīng)不一致,則需要進(jìn)行重新同步,共需三步完成。

      1. slave節(jié)點(diǎn)使用flushall清空數(shù)據(jù);
      2. slave節(jié)點(diǎn)使用slaveof no one解除主從關(guān)系;
      3. slave節(jié)點(diǎn)使用slaveof masterip port再次進(jìn)行主從關(guān)系綁定,激活重新同步。
    • 說(shuō)明:若不手動(dòng)解除主從關(guān)系,新版本下master不會(huì)更新slave的rid和offset,只會(huì)將增量的key同步到slave節(jié)點(diǎn)。

  • 動(dòng)態(tài)修改配置

    • 概述:在生產(chǎn)環(huán)境下需要在不重啟redis的情況下進(jìn)行配置更新,且為了確保日后重啟后保持本次配置的效果。
    • 具體操作案例
      1. 查看當(dāng)前所有配置:config get *
      2. 修改配置內(nèi)容:config set maxmemory 10g,設(shè)置redis最大內(nèi)存為10g
      3. 修改內(nèi)容持久化:config rewrite,保障redis后期若重啟,本次的參數(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)容