Redis 刪除、淘汰策略

Redis 刪除策略

當有 key 設置了過期時間,就會有刪除策略

以 CPU 定時執行的方式換 Redis 內存(因爲會使用輪詢的方式一直耗用 CPU 資源),及時性不高,但是內存不會浪費

在 get 的時候,先判斷 key 是否會過期,如果過期了,會進行刪除,會導致有大量的垃圾數據佔用內存空間(因爲過期的數據在沒有進行 get 時,就會一直存在)

hz 10
  1. 在 Redis 啓動的時候讀取配置文件 hz 的值,默認爲 10

  2. 每秒執行 hz 次,

  3. 每次執行會一次執行:serverCron() --> databaseCron() --> activeExpireCyle() 三個函數

  4. activeExpireCyle() 對每個 expires[] (過期庫, 代表對應的數據庫,一共 0~15 個,每一個過期庫都會和 Redis 的數據庫對應)進行逐一檢查,每次執行 250ms/hz,默認情況就是 25ms

  5. 對某個 expires[*] 檢測時,隨機挑選 N(默認 20)個 key 檢查

  6. 如果 key 超時,刪除 key

  7. 如果一輪中刪除的 key 的數量 > N * 25%,循環該過程

  8. 如果一輪中刪除的 key 的數量 <N * 25%,檢查下一個 expires[ *]

current_db 用於記錄 activeExpireCyle() 進入哪一個 expire[ *] 執行,如果時間到了,那麼下次根據 current_db 繼續執行

Reids 採用的是惰性刪除 + 定期刪除兩種策略結合使用。

Redis 淘汰策略

當 Redis 內存滿了,在進行 set 的時候,就會觸發淘汰策略

LRU(Least recently used):最近最少使用,針對時間

LFU(Least frequently used):最近最不頻繁使用,針對訪問次數

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/DWtVzjHbNcUFBX2l3WXTEA