過期政策
Redis 會把設定了過期時間的 key 放入一個獨立的字典裡,在 key 過期時并不會立刻删除它。
Redis 會通過如下兩種政策,來删除過期的key:
- 惰性删除
-
- 用戶端通路某個 key 時,Redis 會檢查該 key 是否過期,若過期則删除
-
定期掃描
Redis 預設每秒執行 10 次過期掃描(配置hz選項),掃描政策如下:
1. 從過期字典中随機選擇 20 個 key;
2. 删除這 20 個 key 中已過期的 key;
3. 如果過期的 key 的比例超過 25%,則重複步驟 1;
https://izshun.github.io/2020/02/16/Redis%20%E4%B8%AD%E6%95%B0%E6%8D%AE%E7%9A%84%E8%BF%87%E6%9C%9F%E7%AD%96%E7%95%A5%E5%92%8C%E6%B7%98%E6%B1%B0%E7%AD%96%E7%95%A5/#%E6%B7%98%E6%B1%B0%E7%AD%96%E7%95%A5 淘汰政策
當 Redis 占用記憶體超出最大限制(maxmemory)時,可采用如下政策(maxmemory-policy)
讓 Redis 淘汰一些資料,以騰出空間繼續提供讀寫服務:
- noeviction: 對可能導緻增大記憶體的指令傳回錯誤(大多數寫指令,DEL除外)
- volatile-ttl: 在設定了過期時間的 key 中,選擇剩餘壽命(TTL)最短的 key,将其淘汰
- volatile-lru: 在設定了過期時間的 key 中,選擇最少使用的 key,将其淘汰
- volatile-random: 在設定了過期時間的 key 中,随機選擇一些 key,将其淘汰
- allkeys-lru: 在所有的 key 中,選擇最少使用的 key,将其淘汰
- allkeys-random: 在所有的 key 中,随機選擇一些 key,将其淘汰
- LRU 算法
-
- 維護一個連結清單,用于順序存儲被通路過的key。
- 在通路資料時,最新通路過的 key 将被移動到表頭
- 即最近通路的 key 在表頭,最少通路的 key 在表尾
- 近似 LRU 算法(Redis)
-
- 給每個 key 維護一個時間戳,淘汰時随機采樣 5 個key,從中淘汰掉最舊的key。如果還是超出記憶體限制,則繼續随機采樣淘汰
- 優點:比 LRU 算法節約記憶體,卻可以取得非常近似的效果