Redis 刪除、淘汰策略
Redis 刪除策略
當(dāng)有 key 設(shè)置了過(guò)期時(shí)間,就會(huì)有刪除策略
定時(shí)刪除
以 CPU 定時(shí)執(zhí)行的方式換 Redis 內(nèi)存(因?yàn)闀?huì)使用輪詢的方式一直耗用 CPU 資源),及時(shí)性不高,但是內(nèi)存不會(huì)浪費(fèi)
惰性刪除
在 get 的時(shí)候,先判斷 key 是否會(huì)過(guò)期,如果過(guò)期了,會(huì)進(jìn)行刪除,會(huì)導(dǎo)致有大量的垃圾數(shù)據(jù)占用內(nèi)存空間(因?yàn)檫^(guò)期的數(shù)據(jù)在沒(méi)有進(jìn)行 get 時(shí),就會(huì)一直存在)
定期刪除
hz 10在 Redis 啟動(dòng)的時(shí)候讀取配置文件 hz 的值,默認(rèn)為 10
每秒執(zhí)行 hz 次,
每次執(zhí)行會(huì)一次執(zhí)行:
serverCron() --> databaseCron() --> activeExpireCyle()三個(gè)函數(shù)
activeExpireCyle() 對(duì)每個(gè) expires[*] (過(guò)期庫(kù),* 代表對(duì)應(yīng)的數(shù)據(jù)庫(kù),一共 0~15 個(gè),每一個(gè)過(guò)期庫(kù)都會(huì)和 Redis 的數(shù)據(jù)庫(kù)對(duì)應(yīng))進(jìn)行逐一檢查,每次執(zhí)行 250ms/hz,默認(rèn)情況就是 25ms
對(duì)某個(gè) expires[ * ] 檢測(cè)時(shí),隨機(jī)挑選 N(默認(rèn) 20)個(gè) key 檢查
如果 key 超時(shí),刪除 key
如果一輪中刪除的 key 的數(shù)量 > N * 25%,循環(huán)該過(guò)程
如果一輪中刪除的 key 的數(shù)量 < N * 25%,檢查下一個(gè) expires[ * ]
current_db 用于記錄 activeExpireCyle() 進(jìn)入哪一個(gè) expire[ * ] 執(zhí)行,如果時(shí)間到了,那么下次根據(jù) current_db 繼續(xù)執(zhí)行
Reids采用的是惰性刪除 + 定期刪除兩種策略結(jié)合使用。
Redis 淘汰策略
當(dāng) Redis 內(nèi)存滿了,在進(jìn)行 set 的時(shí)候,就會(huì)觸發(fā)淘汰策略
逐出算法
LRU(Least recently used):最近最少使用,針對(duì)時(shí)間
LFU(Least frequently used):最近最不頻繁使用,針對(duì)訪問(wèn)次數(shù)

maxmemory:最大可使用內(nèi)存,占用物理內(nèi)存的比例,默認(rèn)為 0,表示不限制,生產(chǎn)環(huán)境一般根據(jù)需求設(shè)置,通常在 50 以上
maxmemory-policy:達(dá)到最大內(nèi)存后,對(duì)挑選出來(lái)的數(shù)據(jù)進(jìn)行刪除策略(volatile:針對(duì)過(guò)期數(shù)據(jù)的策略,allkeys:針對(duì)所有數(shù)據(jù)的策略)
volatile-lru:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最長(zhǎng)時(shí)間沒(méi)有使用的數(shù)據(jù)(推薦)
allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最長(zhǎng)時(shí)間沒(méi)有使用的數(shù)據(jù)淘汰
volatile-ttl:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過(guò)期的數(shù)據(jù)淘汰(推薦)
volatile-lfu:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中挑選最近使用次數(shù)最少的數(shù)據(jù)淘汰
allkeys-lfu:從數(shù)據(jù)集(server.db[i].dict)中挑選最近使用次數(shù)最少的數(shù)據(jù)淘汰
volatile-random:從已設(shè)置過(guò)期時(shí)間的數(shù)據(jù)集(server.db[i].expires)中隨機(jī)挑選數(shù)據(jù)淘汰
allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中隨機(jī)挑選數(shù)據(jù)淘汰
noeviction:驅(qū)逐,禁止驅(qū)逐數(shù)據(jù)(默認(rèn)策略)
maxmemory-sample:每次選取待刪除的數(shù)據(jù)個(gè)數(shù),選取數(shù)據(jù)時(shí)并不會(huì)進(jìn)行全表掃描,采用隨機(jī)獲取數(shù)據(jù)的方式作為待檢測(cè)刪除數(shù)據(jù),默認(rèn)選擇 5 個(gè)樣本進(jìn)行檢測(cè)

喜歡,在看
