Redis系列02 - 數據的刪除策略和淘汰策略

前言

Redis體系學習整理,點我點我
問題1:數據過期,怎麼樣才能最有效的刪除過期數據??
問題2:內存滿了,新數據進來,怎麼處理?

數據刪除

redis中setEx是我們用的最多的指令。我們享受着他自動過期的遍歷。
但是過期(刪除)數據,到底是怎麼做的呢? 難道有計時器一直在後臺跑嘛?還是說有其他更好策略。如果你也有這種疑惑,就來看看今天的文章吧。

先舉個例子:和Redis類似,日常生活中,我們也會有扔垃圾的需求。這樣我們就有幾種常見的選擇。
1:每天早上下樓時帶上。(定期刪除)
2:一直不扔,直到滿出來了,再扔 (惰性刪除)
3:隨時隨地,到點就扔(定時刪除)
所有的程序,也是人設計出來的,源於生活,高於生活。
所以redis也使用了類似的策略。

過期刪除 - 3種策略

定時刪除

簡而言之,到點立刻刪除。
使用時間換空間的思想,節約內存,無過期佔用,但是會消耗CPU資源。

惰性刪除

下次訪問的時候,如果過期了就刪除。
這屬於邏輯刪除,節省CPU,消耗內存,如果沒有跑到對應的邏輯,會存在泄漏的情況。

定期刪除

設定一定的頻率如:
server hz:10. (每秒運行10次)
Redis定時定評率,抽查內存情況,方式是【隨機挑選樣本檢測】。如果單次刪除的數據多。證明廢棄數據佔比高了,會再次檢測和刪除。
這種方式,每秒花費固定的CPU資源,進行內存維護。比較可控。

在日常企業開發中,選擇呢惰性刪除,配合定期刪除,是個不錯的選擇~

逐出算法(淘汰機制)

說完expire的刪除機制,順道講一講相關的逐出算法。

觸發場景

新增Key時進行判斷,如果內存達到閾值(maxmemory中設置)並且開啓了數據逐出。就會觸發逐出。 (代碼:新增時調用 freeMemoryIfNeeded())

8種策略

直接看配置,共有8種策略可供選擇。
截圖redis.conf文件在這裏插入圖片描述

給大家分分類。

  • 會過期的數據
    • volatile-lru :採用LRU策略,最久未使用的刪除
    • volatile-lfu:採用LFU策略,最近最少使用的刪除
    • volatile-ttl:過期時間最近的刪除
    • volatile-random:隨機挑選刪除
  • 全DB的數據
    • allkeys-lru:採用LRU策略
    • allkeys-lfu:採用LFU策略
    • allkeys-random:隨機挑選刪除
  • 不逐出
    -noevication:可以看到配置中,redis4.0以上,這已經是默認策略了。未了安全。

具體Lru+Lfu不熟悉的小夥伴,可以自行了解。

具體的策略選擇,大家可以 查看redis info 查看具體情況進行調優
一般關注 hits 命中次數和misses命中率。可以進行調優。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章