Redis刪除策略

2022-08-03 22:39:24 字數 2940 閱讀 4049

redis中有個設定時間過期的功能,即對儲存在redis資料庫中的值可以設定乙個過期時間。作為乙個快取資料庫,這是非常實用的。如我們一般專案中的token或者一些登入資訊,尤其是簡訊驗證碼都是有時間限制的,按照傳統的資料庫處理方式,一般都是自己判斷過期,這樣無疑會嚴重影響專案效能

set key的時候,都可以給乙個expire time,就是過期時間,通過過期時間就可以指定這個key可以存活的時間

過期資料:redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態

xx:具有時效性的資料     -1:永久有效的資料     -2:已經過期的資料或被刪除的資料或未定義的資料

時效資料的儲存結構

資料刪除策略的目標:在記憶體占用與cpu占用之間尋找一種平衡,顧此失彼都會造成整體redis效能的下降,甚至引發伺服器宕機或記憶體洩漏

資料刪除策略:定時刪除+定期刪除+惰性刪除

優點:節約記憶體,到時就刪除,快速釋放掉不必要的記憶體占用

缺點:cpu壓力很大,無論cpu此時負載量多高,均占用cpu,會影響redis伺服器響應時間和指令吞吐量

總結:用處理器效能換空間

定期刪除:redis預設是每隔100ms就隨機抽取一些設定了過期時間的key,檢查其是否過期,如果過期就刪除。注意這裡是隨機抽取的。為什麼要隨機呢?假如redis存了幾十萬個key,每隔100ms就遍歷所有的設定過期時間的key的話,就會給cpu帶來很大的負載。

expires[i]  i代表庫  

redis啟動伺服器初始化時,讀取配置server.hz的值,預設為10

每秒鐘執行server.hz次servercron()-->databasescron()-->activeexpirecycle()

activeexpirecycle()對每個expires[*]逐一進行檢測,每次執行250ms/server.hz 

對某個expires[*]檢測時,隨機挑選w個key檢測:如果key超時,刪除key;如果一輪中刪除的key的數量》w*25%,迴圈該過程;如果一輪中刪除的key的數量<=w*25%,檢查下乙個expires[*],0-15迴圈(預設值設定為16的話)

w取值=active_expire_cycle_lookups_per_loop屬性值

引數curret_db用於記錄activeexpirecycle()進入哪個expires[*]執行

如果activeexpirecycle()執行時間到期,下次從current_db繼續向下執行

週期性輪詢redis庫中的時效性資料,採用隨機抽取的策略,利用過期資料佔比的方式控制刪除頻度

特點1:cpu效能占用設定有峰值,檢測頻度可自定義設定

特點2:記憶體壓力不是很大,長期占用記憶體的冷資料會被持續清理

總結:週期性抽查儲存空間

惰性刪除:定期刪除可能會導致很多過期key到了時間並沒有被刪除掉。所以就有了惰性刪除。假如你的過期key,靠定期刪除沒有被刪除掉,還停留在記憶體裡,除非你的系統去查一下那個key,才會被redis給刪除掉。這就是所謂的惰性刪除。expireifneeded(),檢查資料是否過期,執行get的時候呼叫

優點:節約cpu效能,發現必須刪除的時候才刪除

缺點:記憶體壓力很大,出現長期占用記憶體的資料

總結:用儲存空間換取處理器效能(隨機抽查,重點抽查)

逐出演算法

新資料進入檢測:當新資料進入redis時,如果記憶體不足怎麼辦?

redis使用記憶體儲存資料,在執行每乙個命令前,會呼叫freememoryifneeded()檢測記憶體是否充足。如果記憶體不滿足新加入資料的最低儲存要求,redis要臨時刪除一些資料為當前指令清理儲存空間。清理資料的策略稱為逐出演算法。

注意:逐出資料的過程不是100%能夠清理出足夠的可使用的記憶體空間,如果不成功則反覆執行。當對所有資料嘗試完畢後,如果不能達到記憶體清理的要求,將出現錯誤資訊。

(err)oom command not allowed when used memory > 'maxmemory'

最大可使用記憶體maxmemory:占用物理記憶體的比例,預設值為0,表示不限制。通常設定在50%以上

每次選取待刪除資料的個數:maxmemory-samples  選取資料時並不會全庫掃瞄,導致嚴重的效能損耗,降低讀寫效能。因此採用隨機獲取資料的方式作為待檢測刪除資料

刪除策略:maxmemory-policy 達到最大記憶體後,對被選出來的資料進行刪除的策略

redis記憶體淘汰機制    redis提供6種資料淘汰策略:

配置:maxmemory-policy volatile-lru

檢測易失性資料(可能會過期的資料集server.db[i].expires)

volatile-lru  -->  從已設定過期時間的資料集中挑選最近最少使用的資料淘汰

volatile-lfu-->從已設定過期時間的資料集中挑選最不經常使用的資料淘汰

volatile-ttl-->從已設定過期時間的資料集中挑選將要過期的資料淘汰

volatile-random -->從已設定過期時間的資料集中任意選擇資料淘汰

檢測全庫資料(所有資料集server.db[i].dict)

allkeys-lru  -->  當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key(最常用)

allkeys-random-->從資料集中任意選擇資料淘汰

allkeys-lfu-->當記憶體不足以容納新寫入資料時,在鍵空間中,移除最不經常使用的key

放棄資料驅逐

no-eviction-->禁止驅逐資料(redis4.0預設策略),也就是說當記憶體不足以容納新寫入資料時,新寫入操作或報錯,回引發oom(out of memory)

可以通過info命令檢視快取命中次數

Redis刪除策略

目錄 1.過期資料 2.資料刪除策略 2.1 定時刪除 2.2 惰性刪除 2.3 定期刪除 2.4 三種資料刪除策略對比 3.逐出演算法 redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 對於過期資料,redis內部是否真正釋放了其記憶體空間?目標...

Redis 刪除策略

redis中的資料特徵 redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 資料刪除策略 定時刪除 惰性刪除 定期刪除 資料刪除策略 資料刪除策略的目標 在記憶體占用與cpu占用之間尋找一種平衡,顧此失彼都會造成整體redis效能的下降,甚至引發伺服...

Redis刪除策略

redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 時效性資料的儲存結構 刪除策略是對expires的維護。定時刪除當前時間和expires中對過期時間一致時,定時器觸發刪除。優點 節省記憶體,到時間就刪除,快速釋放不必要的記憶體占用。缺點 cpu壓...