Redis中Key的過期策略和淘汰機制


Key的過期策略

Redis的Key有3種過期刪除策略,具體如下:

1. 定時刪除

  • 原理:在設置鍵的過期時間的同時,創建一個定時器(timer),讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作
  • 優點:能夠很及時的刪除過期的Key,能夠最大限度的節約內存
  • 缺點:對CPU時間不友好,如果過期的Key比較多時,可能會占用相當一部分CPU時間,對服務器的響應時間和吞吐量造成影響

2. 惰性刪除

  • 原理:在取出鍵時才對鍵進行過期檢查,如果發現過期了就會被刪除
  • 優點:對CPU友好,能夠最大限度的節約CPU時間
  • 缺點:對內存不友好,過期的Key會占用內存,造成浪費

3. 定期刪除

  • 原理:定期刪除策略是定時刪除策略和惰性刪除策略的一個折中。定期刪除策略每隔一段時間執行一次刪除過期鍵的操作,並通過限制刪除操作執行的時長頻率來減少刪除操作對CPU時間的影響
  • 優點:對CPU時間和內存空間的一種權衡,可以根據實際使用情況來調整刪除操作執行的時長頻率
  • 缺點:確定刪除操作執行的時長頻率很難。如果刪除操作執行的太頻繁,或者執行的時間太長,退化成定時刪除策略;如果刪除操作執行的太少,或者執行時間太短,退化成惰性刪除策略

Redis服務器實際使用的是惰性刪除和定期刪除兩種策略:通過配合使用這兩種刪除策略,服務器可以很好地在合理使用CPU時間和避免浪費內存空間之間取得平衡。Redis默認每隔100ms隨機抽取一些設置了過期時間的key,檢查是否過期,如果過期就刪除。

內存淘汰機制

如果Redis服務器打開了maxmemory選項,並且服務器占用的內存數超過了maxmemory選項所設置的上限值時,會進行內存淘汰,常見的淘汰策略如下:

  • volatile-lru:從已設置過期時間的數據集中挑選最近最少使用的數據淘汰

  • volatile-ttl:從已設置過期時間的數據集中挑選將要過期的數據淘汰

  • volatile-random:從已設置過期時間的數據集中任意選擇數據淘汰

  • volatile-lfu:從已設置過期時間的數據集挑選使用頻率最低的數據淘汰

  • allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰

  • allkeys-lfu:從數據集(server.db[i].dict)中挑選使用頻率最低的數據淘汰

  • allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰

  • no-enviction(驅逐):禁止驅逐數據,這也是默認策略。意思是當內存不足以容納新入數據時,新寫入操作就會報錯,請求可以繼續進行,線上任務也不能持續進行,采用no-enviction策略可以保證數據不被丟失。


免責聲明!

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



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