(三)日常高頻操作
A. 鍵管理
- 鍵重命名:修改key的名字,若改后的key本已存在,會(huì)被覆蓋本來(lái)key的value,具體可參考下方案例
-
set a b,初次設(shè)置a的value為b; -
set c d,初次設(shè)置c的value為d; -
rename a c,將a重命名為c; -
get c,獲取c的值,此時(shí)得到的c的value是b,覆蓋了原來(lái)d,且get a獲得的結(jié)果時(shí)nil。 - 補(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)存理解部分。
-
expire key seconds&pexpire key milliseconds: 設(shè)置過(guò)期時(shí)長(zhǎng),二者精度不一樣。 - 使用set命令會(huì)抹掉過(guò)期時(shí)間(源碼可見(jiàn)到這一步驟)。
- 建議使用setex命令,原子性,直接一步完成value的設(shè)置和過(guò)期時(shí)間設(shè)置。
-
- 鍵遷移
- move: redis內(nèi)部遷移,對(duì)內(nèi)部db0 到db15,move key db;
- dump + restore
- 第一步在源redis上dump key;
- 然后目標(biāo)redis上restore key ttl value,完成redis不同實(shí)例間遷移。
- 注意,value是dump生成代碼;
- 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))。
- 遍歷鍵
- keys:
keys *ORkeys h?ll* - scan: 漸進(jìn)式遍歷,每次遍歷部分。
-
scan 0,會(huì)返回一個(gè)游標(biāo)(比如6),然后給出本次漸進(jìn)式遍歷得到的結(jié)果; - 第二次,scan 6,慢慢重復(fù)。直到游標(biāo)給0結(jié)束。
-
- keys:
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ǔ)法:
- 訂閱消息
- 語(yǔ)法:
subscribe channel - 案例:
subscribe xxx,訂閱上方channel,若后續(xù)生產(chǎn)者publish內(nèi)容,則使用該命令的客戶端會(huì)受到對(duì)應(yīng)信息。
- 語(yǔ)法:
- 總結(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)行重新同步,共需三步完成。
- slave節(jié)點(diǎn)使用
flushall清空數(shù)據(jù); - slave節(jié)點(diǎn)使用
slaveof no one解除主從關(guān)系; - slave節(jié)點(diǎn)使用
slaveof masterip port再次進(jìn)行主從關(guān)系綁定,激活重新同步。
- slave節(jié)點(diǎ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)行配置更新,且為了確保日后重啟后保持本次配置的效果。
- 具體操作案例
- 查看當(dāng)前所有配置:
config get * - 修改配置內(nèi)容:
config set maxmemory 10g,設(shè)置redis最大內(nèi)存為10g - 修改內(nèi)容持久化:
config rewrite,保障redis后期若重啟,本次的參數(shù)修改依然生效
- 查看當(dāng)前所有配置: