Redis的數據刪除介紹
前言
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命中率。可以進行調優。