Redis常用的刪除策略有以下三種:
1.被動(dòng)刪除(惰性刪除):當(dāng)讀/寫一個(gè)已經(jīng)過期的Key時(shí),會(huì)觸發(fā)惰性刪除策略,直接刪除掉這個(gè)Key;
2.主動(dòng)刪除(定期刪除):Redis會(huì)定期巡檢,來清理過期Key;
3.當(dāng)內(nèi)存達(dá)到maxmemory配置時(shí)候,會(huì)觸發(fā)Key的刪除操作;
主動(dòng)刪除
在 Redis 中,常規(guī)操作由?redis.c/serverCron?實(shí)現(xiàn),它主要執(zhí)行以下操作:
1.更新服務(wù)器的各類統(tǒng)計(jì)信息,比如時(shí)間、內(nèi)存占用、數(shù)據(jù)庫占用情況等。
2.清理數(shù)據(jù)庫中的過期鍵值對。
3.對不合理的數(shù)據(jù)庫進(jìn)行大小調(diào)整。
4.關(guān)閉和清理連接失效的客戶端。
5.嘗試進(jìn)行 AOF 或 RDB 持久化操作。
6.如果服務(wù)器是主節(jié)點(diǎn)的話,對附屬節(jié)點(diǎn)進(jìn)行定期同步。
如果處于集群模式的話,對集群進(jìn)行定期同步和連接測試。
Redis 將 serverCron 作為時(shí)間事件來運(yùn)行,從而確保它每隔一段時(shí)間就會(huì)自動(dòng)運(yùn)行一次, 又因?yàn)?serverCron 需要在 Redis 服務(wù)器運(yùn)行期間一直定期運(yùn)行, 所以它是一個(gè)循環(huán)時(shí)間事件:serverCron 會(huì)一直定期執(zhí)行,直到服務(wù)器關(guān)閉為止。
總結(jié)
如果Redis中每天過期大量Key(比如幾千萬),那么必須得考慮過期Key的清理:
增加Redis主動(dòng)清理的頻率(通過調(diào)大hz參數(shù))
手動(dòng)清理過期Key,最簡單的方法是進(jìn)行scan操作,scan操作會(huì)觸發(fā)第一種被動(dòng)刪除,scan操作時(shí)候別忘了加count;
dbsize命令返回的Key數(shù)量,包含了過期Key
randomkey命令返回的Key,不包含過期Key
scan命令返回的Key,包含過期Key
info命令返回的# Keyspace
db6:keys=1034937352,expires=994731489,avg_ttl=507838502
keys對應(yīng)的Key數(shù)量等同于dbsize
expires指的是設(shè)置了過期時(shí)間的Key數(shù)量
avg_ttl指設(shè)置了過期時(shí)間的Key的平均過期時(shí)間(單位:毫秒)