redis key 的過期策略
阿新 • • 發佈:2020-11-19
Key的過期策略
Redis的Key有3種過期刪除策略,具體如下:
1. 定時刪除
- 原理:在設定鍵的過期時間的同時,建立一個定時器(timer),讓定時器在鍵的過期時間來臨時,立即執行對鍵的刪除操作
- 優點:能夠很及時的刪除過期的Key,能夠最大限度的節約記憶體
- 缺點:對CPU時間不友好,如果過期的Key比較多時,可能會佔用相當一部分CPU時間,對伺服器的響應時間和吞吐量造成影響
2. 惰性刪除
- 原理:在取出鍵時才對鍵進行過期檢查,如果發現過期了就會被刪除
- 優點:對CPU友好,能夠最大限度的節約CPU時間
- 缺點:對記憶體不友好,過期的Key會佔用記憶體,造成浪費
3. 定期刪除
- 原理:定期刪除策略是定時刪除策略和惰性刪除策略的一個折中。定期刪除策略每隔一段時間執行一次刪除過期鍵的操作,並通過限制刪除操作執行的時長
- 優點:對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策略可以保證資料不被丟失。