redis會將每個設置了過期時間的key放入到一個獨立的字典中,以後會定時遍歷這個字典來刪除到期的 key。除了定時遍歷之外,它還會使用惰性策略來刪除過期的key,所謂惰性策略就是在客戶端訪問這個key的時候,redis對key的過期時間進行檢查,如果過期了就立即刪除。定時刪除是集中處理,惰性刪除是零散處理。
問題1:定時刪除是如何工作的?
答:Redis默認會每秒進行十次過期掃描,過期掃描不會遍歷過期字典中所有的key:
1、從過期字典中隨機20個key;
2、刪除這20個key中已經過期的key;
3、如果過期的key比率超過1/4,那就重複步驟 1;
同時,爲了保證過期掃描不會出現循環過度,導致線程卡死現象,算法還增加了掃描時間的上限,默認不會超過 25ms。
所以業務開發人員一定要注意過期時間,如果有大批量的 key 過期,要給過期時間設置一個隨機範圍,而不能全部在同一時間過期。
注意事項
從庫不會進行過期掃描,從庫對過期的處理是被動的。主庫在 key到期時,會在AOF文件裏增加一條del指令,同步到所有的從庫,從庫通過執行這條del指令來刪除過期的 key。
因爲指令同步是異步進行的,所以主庫過期的key的del指令沒有及時同步到從庫的話,會出現主從數據的不一致,主庫沒有的數據在從庫裏還存在。