Chanler

Chanler

「黑馬 Redis 原理」四、內存回收

內存回收#

Redis 之所以性能強,最主要的原因就是基於內存存儲,然而單節點的 Redis 其內存大小不宜過大,會影響持久化或主從同步性能

配置文件中可以設置 redis 最大內存 maxmemory <bytes>maxmemory 1gb,當內存達到上限就無法繼續存儲數據

所以引出了內存回收策略

過期策略#

expire <key> <expireTime> 可以給 key 設置存活時間 TTL,當過期後再訪問得到的就是 nil

image.png|500

image.png|500

redis 如何知道一個 key 是否過期?
利用兩個 Dict 分別記錄 key-value 以及 key-ttl

是不是 ttl 到期就立即刪除?
比如:
惰性刪除
周期刪除

惰性刪除#

不是在 TTL 到期時立即刪除,而是在訪問 KEY 時檢查該 KEY 的 存活時間,如果過期則刪除

image.png|500

週期刪除#

週期刪除:顧名思義是通過一個定時任務,周期性的抽樣部分過期的 key,然後執行刪除。執行周期有兩種:

  • Redis 初始化時會設置一個定時任務 serverCron (),按照 server.hz 的頻率來執行過期 key 清理,模式為 SLOW
  • Redis 的每個事件循環前會調用 beforeSleep () 函數,執行過期 key 清理,模式為 FAST

image.png|500

image.png|500

淘汰策略#

內存淘汰:當 Redis 內存使用達到設定的閾值時,主動挑選部分 key 刪除以釋放更多內存的流程

在處理命令時,如果內存不充足,設置了 maxmemory 並且不是 lua 腳本在執行,就先嘗試淘汰內存

image.png|500

淘汰策略

image.png|500

如何知道 LRU 和 LFU 呢

image.png|500

淘汰策略流程圖

對於 TTL 來說,存活時間越長越要刪;對於 LRU 來說,越遠訪問越要刪;對於 LFU 來說,越不訪問越要刪

image.png|500

此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://blog.0xling.cyou/posts/redis/redis-6


載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。