1,簡介
redis內(nèi)存回收主要體現(xiàn)在兩個方面
1)過期key的清理
2)設(shè)置maxmemory,內(nèi)存達到限制時觸發(fā)數(shù)據(jù)淘汰
2,過期key的清理
redisDb數(shù)據(jù)結(jié)構(gòu)
expires字典:保存了所有鍵的過期時間,值使用unix時間戳
image.png
1)惰性刪除
讀寫一個過期key時,會觸發(fā)惰性刪除。
2)定時刪除
redis維護定時任務(wù),默認1秒10次。隨機抽取部分key,如失效,則刪除
3)主從模式的影響
主節(jié)點才會執(zhí)行兩種key清理策略,發(fā)送DEL命令到從節(jié)點如果期間對從節(jié)點讀操作,則仍會正常讀取。
3,maxmemory與數(shù)據(jù)淘汰
redisObject數(shù)據(jù)結(jié)構(gòu)
lru:記錄對象最后一次被命令程序訪問的時間。使用object idletime $key 可以查看key的空轉(zhuǎn)時間
參與數(shù)據(jù)淘汰:當(dāng)使用內(nèi)存操作maxmemory時,會觸發(fā)數(shù)據(jù)淘汰策略。使用volatile-lru、allkeys—lru時,redis會淘汰空轉(zhuǎn)時間最長的對象
maxmemory_samples:隨機取固定數(shù)目的key基于server.maxmemory_samples,按照訪問時間排序,淘汰的最不經(jīng)常使用的。
image.png
1)maxmemory、maxmemory-policy配置
redis.conf:配置maxmemory
config命令:CONFIG SET maxmemory 100MB
image.png
2)數(shù)據(jù)淘汰策略
volatile-lru:只對設(shè)置了過期時間的內(nèi)存數(shù)據(jù)集進行LRU
allkeys-lru:對所有內(nèi)存數(shù)據(jù)集進行LRU
noeviction:永不過期
volatile-ttl:刪除即將過期的數(shù)據(jù)
volatile-random:隨機刪除即將過期的數(shù)據(jù)
allkeys-random:隨機刪除數(shù)據(jù)
4,Redis LFU實現(xiàn)
Redis4.0之后出現(xiàn)的數(shù)據(jù)淘汰策略:
使用LRU并不精確,不能準(zhǔn)確的識別熱點key
1)LFU按最近的訪問頻率進行淘汰,將lru字段分成16bit + 8bit。
高16bit:最近一次計數(shù)器降低的時間ldt (last decrement time)
低8bit:用來存儲訪問頻次,logc (logistic counter)
2)數(shù)據(jù)淘汰策略
volatile-lfu:對有過期時間的key采用LFU淘汰算法
allkeys-lfu:對全部key采用LFU淘汰算法
3)參數(shù)配置
lfu-log-factor:調(diào)整logc的增長速度,lfu-log-factor越大,增長越慢
lfu-decay-time:以分鐘為單位的數(shù)值,調(diào)整logc的減少速度


