Redis:過期策略

一、主節點的過期策略

    Redis有兩種策略來刪除過期的key,定時掃描刪除策略和惰性刪除策略。

1、惰性刪除策略

    惰性策略指的是,在客戶端訪問這個key的時候,對key的過期時間進行檢測,如果過期就立即刪除。這是一種零散處理。

2、定時掃描策略

    Redis將設置了過期時間的key放到一個集合中,然後會定時掃描集合刪除到期的key。Redis默認每秒進行10次過期掃描,過期掃描不會遍歷過期字典的所有的key,而是採用貪心策略:

  1. 從過期字典隨機選出20個key;
  2. 刪除這20個key中已經過期的key;
  3. 如果掃描時間達到了掃描時間上限(默認25ms),就終止本次掃描;
  4. 如果過期的key的比例超過了1/4,就重複步驟1;否則,終止本次掃描。

2.1 定時掃描策略的問題

1、卡頓問題:

    如果Redis中大量的key同一時間過期了,會導致嚴重的卡頓問題:

  1. Redis定時掃描過期字典時,循環次數會明顯升高,消耗的時間明顯增加。由於Redis是單線程的,所以會延遲處理掃描期間接入的客戶端請求;
  2. 由於大量內存被回收,內存管理器會頻繁回收內存頁,也會產生一定的CPU消耗,影響性能。

2、難定位的慢查詢:

    需要注意的是,Redis定時掃描導致的請求變慢,無法從Redis的slowlog中查看到慢查詢記錄,因爲slowlog記錄的是邏輯處理過程慢的請求,而不包含等待時間。

    所以使用者需要注意,如果有大批量的key過期,要給過期時間設置一個隨機值,而不能全部在同一時間過期。

二、從節點的過期策略

    從節點不會自主對過期的key進行處理。主節點在key到期時,會在AOF文件中增加一條del指令,同步到所有的從節點,從節點通過執行這條del指令來刪除過期的key。

    由於指令同步是異步進行的,所以主從節點對過期的key的處理,不是強一致性的,在同步期間會產生數據不一致的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章