Redis的內存回收策略和內存上限(阿里)


還有一篇文章 講解guava如何刪除過期數據的,與redis不同,guava沒有維護線程刪除過期key,只是在設置 key 或者 讀取key的時候,順帶刪除參考:GuavaCache簡介(一)是輕量級的框架 少量數據,並且 過期時間相同 可以用 GuavaCache

內存上限
Redis可以通過 maxmemory 參數來限制最大可用內存,主要為了避免Redis內存超過操作系統內存,從而導致服務器響應變慢甚至死機的情況。

maxmemory 參數限制的是Redis的對象內存大小,也就是 used_memory 對應的內存大小。由於內存碎片的存在,所以Redis服務器實際占用的內存是要超過 maxmemory 的。

所以我們在設置Redis內存上限的時候要預留一部分內存出來,比如說一台32GB內存的機器,可以啟動 3 台8GB內存的Redis,預留8GB給機器其他進程、內存碎片、fork子進程等。

可以通過 config set maxmemory 命令來動態修改Redis內存上限:

192.168.1.4>config set maxmemory 2GB
"OK"

內存回收策略

Redis的內存回收策略主要體現在兩個方面:
- 刪除到達過期時間的鍵對象
- 內存達到 maxmemory 后的淘汰機制

刪除過期鍵對象
由於Redis進程內保存了大量的鍵,維護每個鍵的過期時間去刪除鍵會消耗大量的CPU資源,對於單線程的Redis來說成本很高。所以Redis采用惰性刪除 + 定時任務刪除機制來實現過期鍵的內存回收。

惰性刪除:當客戶端讀取鍵時,如果鍵帶有過期時間並且已經過期,那么會執行刪除操作並且查詢命令返回空。這種機制是為了節約CPU成本,不需要單獨維護一個TTL鏈表來處理過期的鍵。但是這種刪除機制會導致內存不能及時得到釋放,所以將結合下面的定時任務刪除機制一起使用。
定時任務刪除:Redis內部維護一個定時任務,用於隨機獲取一些帶有過期屬性的鍵,並將其中過期的鍵刪除。來刪除一些過期的冷數據。
在兼顧CPU和內存的的考慮下,Redis使用惰性刪除 + 定時任務刪除機制相結合,來刪除過期鍵對象。

淘汰機制
當Redis所使用的內存達到 maxmemory 之后會觸發相應的溢出控制策略,Redis支持 6 種策略:
- noeviction:當內存使用達到閾值的時候,所有引起申請內存的命令會報錯。
- allkeys-lru:在所有鍵中采用lru算法刪除鍵,直到騰出足夠內存為止。
- volatile-lru:在設置了過期時間的鍵中采用lru算法刪除鍵,直到騰出足夠內存為止。
- allkeys-random:在所有鍵中采用隨機刪除鍵,直到騰出足夠內存為止。
- volatile-random:在設置了過期時間的鍵中隨機刪除鍵,直到騰出足夠內存為止。
- volatile-ttl:在設置了過期時間的鍵空間中,具有更早過期時間的key優先移除。

lru是Least Recently Used的縮寫,即最近最少使用。

內存的溢出控制策略可以采用 config set maxmemory-policy {policy} 命令來動態配置:

192.168.1.4>config set maxmemory-policy volatile-lru
"OK"

 


 
頻繁執行回收內存成本很高,每次都要去查找可回收鍵和刪除鍵,所以合理設置Redis的 maxmenory 很重要,不合理的Redis溢出控制策略可能會導致一些不可預知的問題。


 參考:Redis的內存上限和內存回收策略


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM