關於redis中過期的key的處理


一,有三種不同的刪除策略

(1),立即清理。在設置鍵的過期時間時,創建一個回調事件,當過期時間達到時,由時間處理器自動執行鍵的刪除操作。

(2),惰性清理。鍵過期了就過期了,不管。當讀/寫一個已經過期的key時,會觸發惰性刪除策略,直接刪除掉這個過期key

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

 

二,詳細說明三種清理方式的優劣

(1)立即清理

立即刪除能保證內存中數據的最大新鮮度,因為它保證過期鍵值會在過期后馬上被刪除,其所占用的內存也會隨之釋放。但是立即刪除對cpu是最不友好的

因為刪除操作會占用cpu的時間,如果剛好碰上了cpu很忙的時候,比如正在做交集或排序等計算的時候,就會給cpu造成額外的壓力。

(2)惰性刪除

惰性刪除是指,某個鍵值過期后,此鍵值不會馬上被刪除,而是等到下次被使用的時候,才會被檢查到過期,此時才能得到刪除。

所以惰性刪除的缺點很明顯:浪費內存。dict字典和expires字典都要保存這個鍵值的信息。

(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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM