redis過時key的清理策略

一,有三種不一樣的刪除策略
(1),當即清理。在設置鍵的過時時間時,建立一個回調事件,當過時時間達到時,由時間處理器自動執行鍵的刪除操做。redis

(2),惰性清理。鍵過時了就過時了,無論。當讀/寫一個已通過期的key時,會觸發惰性刪除策略,直接刪除掉這個過時key數據庫

(3),按期清理。每隔一段時間,對expires字典進行檢查,刪除裏面的過時鍵。服務器

二,詳細說明三種清理方式的優劣
(1)當即清理
當即刪除能保證內存中數據的最大新鮮度,由於它保證過時鍵值會在過時後立刻被刪除,其所佔用的內存也會隨之釋放。可是當即刪除對cpu是最不友好的。
由於刪除操做會佔用cpu的時間,若是恰好碰上了cpu很忙的時候,好比正在作交集或排序等計算的時候,就會給cpu形成額外的壓力。測試

(2)惰性刪除
惰性刪除是指,某個鍵值過時後,此鍵值不會立刻被刪除,而是等到下次被使用的時候,纔會被檢查到過時,此時才能獲得刪除。
因此惰性刪除的缺點很明顯:浪費內存。dict字典和expires字典都要保存這個鍵值的信息。server

(3)定時刪除
從上面分析來看,當即刪除會短期內佔用大量cpu,惰性刪除會在一段時間內浪費內存,因此定時刪除是一個折中的辦法。
定時刪除是:每隔一段時間執行一次刪除操做,並經過限制刪除操做執行的時長和頻率,來減小刪除操做對cpu的影響。
另外一方面定時刪除也有效的減小了因惰性刪除帶來的內存浪費。排序

三,目前redis使用的過時鍵值刪除策略是:惰性刪除加上按期刪除,二者配合使用。事件

四,詳細說明定時清理機制
這個和redis.conf 的hz 10配置有關。
首先說一下時間事件,對於持續運行的服務器來講, 服務器須要按期對自身的資源和狀態進行必要的檢查和整理,
從而讓服務器維持在一個健康穩定的狀態, 這類操做被統稱爲常規操做(cron job)

在 Redis 中, 常規操做由 redis.c/serverCron 實現, 它主要執行如下操做
•更新服務器的各種統計信息,好比時間、內存佔用、數據庫佔用狀況等。
•清理數據庫中的過時鍵值對。
•關閉和清理鏈接失效的客戶端。
•嘗試進行 AOF 或 RDB 持久化操做。
•若是服務器是主節點的話,對附屬節點進行按期同步。
•若是處於集羣模式的話,對集羣進行按期同步和鏈接測試。

Redis 將 serverCron 做爲時間事件來運行, 從而確保它每隔一段時間就會自動運行一次,
又由於 serverCron 須要在 Redis 服務器運行期間一直按期運行, 因此它是一個循環時間事件: serverCron 會一直按期執行,直到服務器關閉爲止。內存


好比Redis-3.0.0中的hz默認值是10,表明每秒鐘調用10次後臺任務。
典型的方式爲,Redis每秒作10次以下的步驟:
•隨機測試100個設置了過時時間的key
•刪除全部發現的已過時的key
•若刪除的key超過25個則重複步驟1資源

總結:redis會在hz的頻率下(n次每秒),會在必定時間限制內儘量多的刪除過時key。同步

相關文章
相關標籤/搜索