Redis 超時失效 Key 監聽不及時原因分析及解決方案

Redis 共有 3 種過期策略:定時刪除、惰性刪除、定期刪除

三者對比如下:

說明 優點 缺點
定時刪除 在設置 Key 過期時間的同時創建定時器,讓定時器在 Key 過期時執行刪除操作 保證過期數據能被及時刪除 耗 CPU,尤其當存在大量非永久 Key 時,對 CPU 影響更嚴重
惰性刪除 Key 過期時不主動刪除,獲取數據時判斷該 Key 是否過期,如果過期直接刪除 對 CPU 消耗小 耗內存,如果數據過期但又沒有任何操作來獲取該數據,哪怕數據已經過期了,但該數據任會一直存在
定期刪除 每隔一段時間執行一次刪除操作 不如定時刪除那麼消耗 CPU,也不如惰性刪除那麼佔內存 比定時刪除更消耗內存,必惰性刪除更消耗 CPU

原因
默認情況下,Redis 使用的是惰性刪除 + 定期刪除的策略,過程如下:

  1. 每隔一段時間,Redis 會分別去各個庫隨機拿 20 個非永久 Key,判斷它們是否過期,過期則刪除,如果這一次拿的 key 中有超過 1/4 的數據過期,則再執行一遍過程 1,直到過期數據不超過當次拿出來的 20 條記錄的 1/4(可以通過配置 redis.conf 中的 hz 修改 Redis 執行定期刪除的頻率,默認 hz=10,即每 100ms 執行一次,1/4 與每次拿的數量 20 暫時未找到配置項);
  2. 如果當前數據庫沒有非永久 key,則跳過當前數據庫;
  3. 如果 key 已過期,但沒有在步驟 1 中被定期刪除,由於惰性刪除策略,在下次請求獲取該數據時會將該數據刪除;

通過對 Redis 刪除策略的解讀,可以得出如下結論:

如果每次從 Redis 數據庫中拿的 20 條記錄中,過期的不足 1/4,則本次定期刪除流程結束 ==>> 如果同一 Redis 數據庫中同時存在緩存數據及要做超時監聽的 key,並且緩存數據遠大於超時監聽 key 數,那麼在定期刪除時監聽的 key 被拿出來的概率便會很小,由此**導致 Key 過期監聽不及時**。

解決方案

  1. 將緩存數據與監聽數據分離,即把不同功能類型的數據分庫存放(Redis 默認有 16 個庫,庫的數量可在 redis.conf 配置修改),例如把緩存數據存在 database0,把監聽數據存在 database1;
  2. 讓進行監聽的庫中 key 儘量少,如果不同業務的監聽超時時間差異較大,則考慮將不同業務的超時監聽數據存放到不同的數據庫;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章