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

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

喜歡,在看
