redis伺服器實際使用的過期鍵刪除策略有兩種:
通過配合使用這兩種刪除策略,伺服器可以很好地合理使用cpu時間和避免浪費記憶體空間之間取得平衡。
redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。
從過期字典中隨機 20 個 key;
刪除這 20 個 key 中已經過期的 key;
如果過期的 key 比率超過 1/4,那就重複步驟 1;
同時,為了保證過期掃瞄不會出現迴圈過度,導致執行緒卡死現象,演算法還增加了掃瞄時間的上限,預設不會超過 25ms。
如果某一時刻,有大量key同時過期,redis 會持續掃瞄過期字典,造成客戶端響應卡頓,因此設定過期時間時,就盡量避免這個問題,在設定過期時間時,可以給過期時間設定乙個隨機範圍,避免同一時刻過期。
1.1 如何配置定期刪除執行時間間隔
redis的定時任務預設是10s執行一次,如果要修改這個值,可以在redis.conf中修改hz的值。
redis.conf中,hz預設設為10,提高它的值將會占用更多的cpu,當然相應的redis將會更快的處理同時到期的許多key,以及更精確的去處理超時。 hz的取值範圍是1~500,通常不建議超過100,只有在請求延時非常低的情況下可以將值提公升到100。
1.2 單執行緒的redis,如何知道要執行定時任務?
redis是單執行緒的,執行緒不但要處理定時任務,還要處理客戶端請求,執行緒不能阻塞在定時任務或處理客戶端請求上,那麼,redis是如何知道何時該執行定時任務的呢?
redis 的定時任務會記錄在乙個稱為最小堆的資料結構中。這個堆中,最快要執行的任務排在堆的最上方。在每個迴圈週期,redis 都會將最小堆裡面已經到點的任務立即進行處理。處理完畢後,將最快要執行的任務還需要的時間記錄下來,這個時間就是接下來處理客戶端請求的最大時長,若達到了該時長,則暫時不處理客戶端請求而去執行定時任務。
定時刪除策略中,從刪除方法來看,必然會導致有key過期了但未從redis中刪除的情況。
面對這種情況,redis在操作乙個key時,會先判斷這個值是否過期,若已過期,則刪除該key;若未過期,則進行後續操作。
rdbaof
複製當伺服器執行在複製模式下時,從伺服器的過期刪除動作由主伺服器控制:
redis過期策略
1 noeviction 一旦記憶體滿則返回錯誤 2 allkeys lru 對所有的key進行lru 3 volatile lru 只對設定了過期的key進行lru 預設的方式 4 allkeys random 隨機剔除乙個key 5 volatile random 對設定過期的key進行隨機剔除...
Redis過期策略
1,設定過期時間 expire key time 單位為秒 setex string key,int seconds,string value 字串獨有的方式 注意 過期key的判定 檢查給定key是否存在於過期字典,如果存在,那麼取得key的過期時間。檢查當前unix時間戳是否大於key的過期時間...
Redis 過期策略
redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。從過期字典中隨機 20 個 key 刪除這 20 個 key 中已經過期的 key 如果過期的 key 比率超過 1 4,那就重複步驟 1 同時,為了保證過期掃瞄不會出現迴圈過度,導致執行...