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策略可以保證資料不被丟失,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/145065.html
標籤:Java
下一篇:Redis中漸進式rehash
