當redis記憶體超出物理記憶體限制時,記憶體的資料會開始和磁碟產生頻繁的交換。交換會讓redis的效能急劇下降,對於訪問量比較頻繁的redis來說等於不可用。
為了限制最大使用記憶體,redis提供了配置引數maxmemory來限制記憶體超出期望大小。當實際記憶體超出maxmemory時,redis 提供了幾種可選策略來讓使用者自己決定該如何騰出新的空間以繼續提供讀寫服務:
1.noeviction不會繼續服務寫請求 (del請求可以繼續服務),讀請求可以繼續進行。這樣可以保證不會丟失資料,但是會讓線上的業務不能持續進行。這是預設的淘汰策略。
2.volatile-lru 嘗試淘汰設定了過期時間的key,最少使用的 key優先被淘汰。沒有設定過期時間的key不會被淘汰,這樣可以保證需要持久化的資料不會突然丟失。
3.volatile-ttl 跟上面一樣,除了淘汰的策略是key的剩餘壽命ttl的值,ttl越小越優先被淘汰。
4.volatile-random跟上面一樣,不過淘汰的key是過期key集合中隨機的key。
5.allkeys-lru區別於volatile-lru是要淘汰的key物件是全體的key集合,而不只是過期的key集合。這意味著沒有設定過期時間的key也會被淘汰。
6.allkeys-random跟上面一樣,不過淘汰的策略是隨機的key。
總之,volatile-***策略只會針對帶過期時間的key進行淘汰,allkeys-***策略會對所有的key進行淘汰。
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 ...