內存回收#
Redis 之所以性能強,最主要的原因就是基於內存存儲,然而單節點的 Redis 其內存大小不宜過大,會影響持久化或主從同步性能
配置文件中可以設置 redis 最大內存 maxmemory <bytes>
如 maxmemory 1gb
,當內存達到上限就無法繼續存儲數據
所以引出了內存回收策略
過期策略#
expire <key> <expireTime>
可以給 key 設置存活時間 TTL,當過期後再訪問得到的就是 nil
redis 如何知道一個 key 是否過期?
利用兩個 Dict 分別記錄 key-value 以及 key-ttl
是不是 ttl 到期就立即刪除?
比如:
惰性刪除
周期刪除
惰性刪除#
不是在 TTL 到期時立即刪除,而是在訪問 KEY 時檢查該 KEY 的 存活時間,如果過期則刪除
週期刪除#
週期刪除:顧名思義是通過一個定時任務,周期性的抽樣部分過期的 key,然後執行刪除。執行周期有兩種:
- Redis 初始化時會設置一個定時任務 serverCron (),按照 server.hz 的頻率來執行過期 key 清理,模式為 SLOW
- Redis 的每個事件循環前會調用 beforeSleep () 函數,執行過期 key 清理,模式為 FAST
淘汰策略#
內存淘汰:當 Redis 內存使用達到設定的閾值時,主動挑選部分 key 刪除以釋放更多內存的流程
在處理命令時,如果內存不充足,設置了 maxmemory 並且不是 lua 腳本在執行,就先嘗試淘汰內存
淘汰策略
如何知道 LRU 和 LFU 呢
淘汰策略流程圖
對於 TTL 來說,存活時間越長越要刪;對於 LRU 來說,越遠訪問越要刪;對於 LFU 來說,越不訪問越要刪
此文由 Mix Space 同步更新至 xLog
原始鏈接為 https://blog.0xling.cyou/posts/redis/redis-6