【13期】談?wù)?Redis 的過期策略
閱讀本文大概需要 6.5 分鐘。
來自:https://www.shipengqi.top/
定期刪除策略
隨機(jī)抽取 20 個 key
刪除這 20 個key中過期的key
如果過期的 key 比例超過 1/4,就重復(fù)步驟 1,繼續(xù)刪除。
從庫的過期策略
懶惰刪除策略
unlink
>?unlink?key
OK
flush
>?flushall?async
OK
異步隊列
更多異步刪除點(diǎn)
slave-lazy-flush 從庫接受完 rdb 文件后的 flush 操作
lazyfree-lazy-eviction 內(nèi)存達(dá)到 maxmemory 時進(jìn)行淘汰
lazyfree-lazy-expire key 過期刪除
lazyfree-lazy-server-del rename 指令刪除 destKey
內(nèi)存淘汰機(jī)制
配置參數(shù) maxmemory。當(dāng)內(nèi)存超出 maxmemory,Redis 提供了幾種內(nèi)存淘汰機(jī)制讓用戶選擇,配置 maxmemory-policy:
noeviction:當(dāng)內(nèi)存超出 maxmemory,寫入請求會報錯,但是刪除和讀請求可以繼續(xù)。(使用這個策略,瘋了吧)
allkeys-lru:當(dāng)內(nèi)存超出 maxmemory,在所有的 key 中,移除最少使用的key。只把 Redis 既當(dāng)緩存是使用這種策略。(推薦)。
allkeys-random:當(dāng)內(nèi)存超出 maxmemory,在所有的 key 中,隨機(jī)移除某個 key。(應(yīng)該沒人用吧)
volatile-lru:當(dāng)內(nèi)存超出 maxmemory,在設(shè)置了過期時間 key 的字典中,移除最少使用的 key。把 Redis 既當(dāng)緩存,又做持久化的時候使用這種策略。
volatile-random:當(dāng)內(nèi)存超出 maxmemory,在設(shè)置了過期時間 key 的字典中,隨機(jī)移除某個key。
volatile-ttl:當(dāng)內(nèi)存超出 maxmemory,在設(shè)置了過期時間 key 的字典中,優(yōu)先移除 ttl 小的。
LRU 算法
from?collections?import?OrderedDict
class?LRUDict(OrderedDict):
????def?__init__(self,?capacity):
????????self.capacity?=?capacity
????????self.items?=?OrderedDict()
????def?__setitem__(self,?key,?value):
????????old_value?=?self.items.get(key)
????????if?old_value?is?not?None:
????????????self.items.pop(key)
????????????self.items[key]?=?value
????????elif?len(self.items)?self.capacity:
????????????self.items[key]?=?value
????????else:
????????????self.items.popitem(last=True)
????????????self.items[key]?=?value
????def?__getitem__(self,?key):
????????value?=?self.items.get(key)
????????if?value?is?not?None:
????????????self.items.pop(key)
????????????self.items[key]?=?value
????????return?value
????def?__repr__(self):
????????return?repr(self.items)
d?=?LRUDict(10)
for?i?in?range(15):
????d[i]?=?i
print?d
近似 LRU 算法
LFU
//?redis?的對象頭
typedef?struct?redisObject?{
????unsigned?type:4;?//?對象類型如?zset/set/hash?等等
????unsigned?encoding:4;?//?對象編碼如?ziplist/intset/skiplist?等等
????unsigned?lru:24;?//?對象的「熱度」
????int?refcount;?//?引用計數(shù)
????void?*ptr;?//?對象的?body
}?robj;
推薦閱讀:
IntelliJ IDEA 2020.2 正式發(fā)布,真香!
微信掃描二維碼,關(guān)注我的公眾號
朕已閱?

