1. 程式人生 > 資料庫 >redis key 的過期策略

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策略可以保證資料不被丟失。