超出物理記憶體後的Redis應對策略

2021-10-24 22:07:20 字數 1467 閱讀 4166

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

為了限制最大使用記憶體,redis提供了配置引數maxmemory來限制記憶體超出期望大小。當實際記憶體超出maxmemory時,redis 提供了幾種可選策略來讓使用者自己決定該如何騰出新的空間以繼續提供讀寫服務:

1.noeviction不會繼續服務寫請求 (del請求可以繼續服務),讀請求可以繼續進行。這樣可以保證不會丟失資料,但是會讓線上的業務不能持續進行。這是預設的淘汰策略。

我們知道,redis設定配置檔案的maxmemory引數,可以控制其最大可用記憶體大小(位元組)。

那麼當所需記憶體,超過maxmemory怎麼辦?

這個時候就該配置檔案中的maxmemory-policy出場了。

其預設值是noeviction。

下面我將列出當可用記憶體不足時,刪除redis鍵具有的淘汰規則。

規則名稱

規則說明

noeviction

不刪除鍵,只返回錯誤

volatile-lru

使用lru演算法刪除乙個鍵(只對設定了生存時間的鍵)

allkeys-lru

使用lru演算法刪除乙個鍵

volatile-random

隨機刪除乙個鍵(只對設定了生存時間的鍵)

allkeys-random

隨機刪除乙個鍵

volatile-ttl

刪除生存時間最近的乙個鍵

lru演算法,least recently used,最近最少使用演算法。也就是說預設刪除最近最少使用的鍵。

但是一定要注意一點!redis中並不會準確的刪除所有鍵中最近最少使用的鍵,而是隨機抽取3個鍵,刪除這三個鍵中最近最少使用的鍵。

那麼3這個數字也是可以設定的,對應位置是配置檔案中的maxmeory-samples.

redis是怎麼設計這個策略的呢?

答:redis給每個key增加了乙個額外的小字段,這個欄位的長度是24個 bit,也就是最後一次被訪問的時間戳。

redis採取了近似於lru演算法,採用懶惰處理方式,當發現記憶體超出maxmemory,就會執行一次lru淘汰演算法。就是隨機取樣出5(可以配置)個key,然後淘汰掉最舊的key,如果淘汰後記憶體還是超出maxmemory,那就繼續隨機取樣淘汰,直到記憶體低於maxmemory為止。

如何取樣就是看 maxmemory-policy 的配置,如果是allkeys就是從所有的key字典中隨機,如果是volatile就從帶過期時間的 key 字典中隨機。每次取樣多少個key看的是 maxmemory_samples的配置,預設為5。

同時 redis3.0在演算法中增加了淘汰池,進一步提公升了近似 lru 演算法的效果。淘汰池是乙個陣列,它的大小是maxmemory_samples,在每一次淘汰迴圈中,新隨機出來的key列表會和淘汰池中的key 列表進行融合,淘汰掉最舊的乙個key之後,保留剩餘較舊的key列表放入淘汰池中留待下乙個迴圈。

超出物理記憶體後的Redis應對策略

當redis記憶體超出物理記憶體限制時,記憶體的資料會開始和磁碟產生頻繁的交換。交換會讓redis的效能急劇下降,對於訪問量比較頻繁的redis來說等於不可用。為了限制最大使用記憶體,redis提供了配置引數maxmemory來限制記憶體超出期望大小。當實際記憶體超出maxmemory時,redis...

記憶體耗盡後,Redis會發生什麼?

作為一台伺服器來說,記憶體並不是無限的,所以總會存在記憶體耗盡的情況,那麼當 redis 伺服器的記憶體耗盡後,如果繼續執行請求命令,redis 會如何處理呢?ps 不管使用哪乙個命令,最終 redis 底層都是使用 pexpireat 命令來實現的。另外,set 等命令也可以設定 key 的同時加...

Redis達到最大占用記憶體後的淘汰策略

1.查詢redis最大占用記憶體 查詢最大占用記憶體 config get maxmemory 為0時在64作業系統中不限制記憶體,在32位作業系統中最大為3gb2.redis設定最大占用記憶體 設定最大占用記憶體大小為100mb maxmemory 100mb 設定最大占用記憶體大小為100mb ...