一、主節點的過期策略
Redis有兩種策略來刪除過期的key,定時掃描刪除策略和惰性刪除策略。
1、惰性刪除策略
惰性策略指的是,在客戶端訪問這個key的時候,對key的過期時間進行檢測,如果過期就立即刪除。這是一種零散處理。
2、定時掃描策略
Redis將設置了過期時間的key放到一個集合中,然後會定時掃描集合刪除到期的key。Redis默認每秒進行10次過期掃描,過期掃描不會遍歷過期字典的所有的key,而是採用貪心策略:
- 從過期字典隨機選出20個key;
- 刪除這20個key中已經過期的key;
- 如果掃描時間達到了掃描時間上限(默認25ms),就終止本次掃描;
- 如果過期的key的比例超過了1/4,就重複步驟1;否則,終止本次掃描。
2.1 定時掃描策略的問題
1、卡頓問題:
如果Redis中大量的key同一時間過期了,會導致嚴重的卡頓問題:
- Redis定時掃描過期字典時,循環次數會明顯升高,消耗的時間明顯增加。由於Redis是單線程的,所以會延遲處理掃描期間接入的客戶端請求;
- 由於大量內存被回收,內存管理器會頻繁回收內存頁,也會產生一定的CPU消耗,影響性能。
2、難定位的慢查詢:
需要注意的是,Redis定時掃描導致的請求變慢,無法從Redis的slowlog中查看到慢查詢記錄,因爲slowlog記錄的是邏輯處理過程慢的請求,而不包含等待時間。
所以使用者需要注意,如果有大批量的key過期,要給過期時間設置一個隨機值,而不能全部在同一時間過期。
二、從節點的過期策略
從節點不會自主對過期的key進行處理。主節點在key到期時,會在AOF文件中增加一條del指令,同步到所有的從節點,從節點通過執行這條del指令來刪除過期的key。
由於指令同步是異步進行的,所以主從節點對過期的key的處理,不是強一致性的,在同步期間會產生數據不一致的問題。