Redis過期鍵刪除和記憶體淘汰

2022-02-15 13:48:47 字數 2770 閱讀 7923

redis的鍵可以設定過期時間,時間一到,就會自動刪除。但是我們會不會這麼一種情景發生:會不會因為有這麼同一時刻太多的key過期,以至於忙不過來。同時因為 redis 是單執行緒的,收割的時間也會占用執行緒的處理時間,如果收割的太過於繁忙,會不會導致線上讀寫指令出現卡頓?

其實關於這個鍵過期刪除我們也是有策略的,所以並不會導致這個情況發生。

通過使用定時器(時間事件,採用無序鍊錶實現,),定時刪除資料。定時刪除策略可以保證過期的鍵會盡可能快的被刪除了,並釋放過期鍵鎖占用的記憶體。

優點:對記憶體是友好的,通過使用定時器,定時刪除策略可以保證過期鍵會盡可能快地被刪除,並釋放過期鍵鎖占用地記憶體。

缺點:對cpu時間是最不友好地:在過期鍵比較多的情況下,刪除過期鍵這一行為會占用相當一部分cpu時間,在記憶體不緊張但是cpu非常緊張的情況下,將cpu應用於刪除和當前任務無關的過期鍵上,無疑會對伺服器的響應時間和吞吐量造成影響。

程式在每次使用到鍵的時候去檢查是否過期,如果過期則刪除並返回空。

優點:對cpu時間是最友好的,程式只會在取出鍵的時候才對鍵進行過期檢查,所以不會在刪除其他無關的過期鍵上花費任何cpu時間。

缺點:對記憶體是不友好的,如果乙個鍵已經過期,而又保留在資料庫中,只要這個過期鍵沒有被刪除,那麼它所占有的記憶體就永遠不會釋放。而我們如果永遠沒有訪問到這些鍵的話,那麼這些記憶體就永遠不會被釋放,我們可以把這看成是一種記憶體洩漏

可以看成是兩種策略的整合和折中

我們可以發現不管是定時刪除還是惰性刪除,這兩種策略都有明顯的缺陷

所以通過使用定期刪除策略我們可以比較好的解決這些問題

優點:

缺點:

總結:如果採用定期刪除策略的話,伺服器必須根據情況,合理地設定刪除操作的執行時長和執行頻率。

定時掃瞄策略

上面我們定期刪除優點第一點提到了這個策略。redis 缺省會每秒進行十次過期掃瞄,過期掃瞄不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。

從過期字典中隨機 20 個 key;

刪除這 20 個 key 中已經過期的 key;

如果過期的 key 比率超過 1/4,那就重複步驟 1;

同時,為了保證過期掃瞄不會出現迴圈過度,導致執行緒卡死現象,演算法還增加了掃瞄時間的上限,預設不會超過 25ms。

​ 當 redis 記憶體超出物理記憶體限制時,記憶體的資料會開始和磁碟產生頻繁的交換 (swap)。交換會讓 redis 的效能急劇下降,對於訪問量比較頻繁的 redis 來說,這樣龜速的訪問效率基本上等於不可用。

​ 在生產環境中我們是不允許 redis 出現交換行為的,為了限制最大使用記憶體,redis 提供了配置引數maxmemory來限制記憶體超出期望大小。

​ 當實際記憶體超出maxmemory時,redis 提供了幾種可選策略(maxmemory-policy)來讓使用者自己決定該如何騰出新的空間以繼續提供讀寫服務。

關於記憶體淘汰策略有以下六種:

(1)noeviction不會繼續服務寫請求 (del 請求可以繼續服務),讀請求可以繼續進行。也就是當記憶體不足以容納新入資料時,新寫入操作就會報錯。這樣可以保證不會丟失資料,但是會讓線上的業務不能持續進行。這是預設的淘汰策略。

應用場景:目前預設使用的就是。

(2)volatile-lru嘗試淘汰設定了過期時間的 key,最少使用的 key 優先被淘汰。沒有設定過期時間的 key 不會被淘汰,這樣可以保證需要持久化的資料不會突然丟失。

應用場景:如果希望一些資料能長期被儲存,而一些資料可以被淘汰掉時

(3)volatile-ttl跟上面一樣,除了淘汰的策略不是 lru,而是 key 的剩餘壽命 ttl 的值,ttl

越小越優先被淘汰。

應用場景:如果研發者需要通過設定不同的ttl來判斷資料過期的先後順序,此時可以選擇volatile-ttl策略。

(4)volatile-random跟上面一樣,不過淘汰的 key 是過期 key 集合中隨機的 key。

應用場景:如果希望一些資料能長期被儲存,而一些資料可以被淘汰掉時。

(5)allkeys-lru區別於 volatile-lru,這個策略要淘汰的 key 物件是全體的 key 集合,而不只是過期的 key 集合。這意味著沒有設定過期時間的 key 也會被淘汰。

應用場景:

(6)allkeys-random跟上面一樣,不過淘汰的策略是隨機的 key。

應用場景:如果所有資料訪問概率大致相等時,可以選擇allkeys-random。

《redis設計與實現》

《redis深度歷險:核心原理與應用實踐》

redis記憶體淘汰策略,看這一篇就夠了!

Redis 過期刪除鍵策略和記憶體淘汰機制

expire key seconds 將key的生存時間設定為ttl秒 pexpire key milliseconds 將key的生成時間設定為ttl毫秒 expireat key timestamp s 將key的過期時間設定為timestamp所代表的的秒數的時間戳 pexpireat key...

Redis記憶體管理 鍵過期策略 記憶體淘汰策略

記憶體使用統計指標 可以參考文章 其中需要重點關注的指標 used memory redis使用的記憶體總量 used memory rss 系統分配的記憶體總量 mem fragmentation ratio 記憶體碎片率 used memory rss used memory 當 mem fra...

Redis過期鍵刪除策略及淘汰策略

redis的所有鍵都可以設定過期策略,redis的每個設定了過期時間的key都會被放在乙個獨立的字典中,用於遍歷刪除。1.先區分兩個概念,被動刪除與主動刪除 1 被動刪除 key再被操作時,redis主動檢查key是否過期,過期則刪除 優劣 對cpu友好,只有cpu在被操作時刪除,不浪費cpu時間 ...