redis緩存淘汰策略


緩存淘汰策略

介紹

  • 當 Redis 內存超出物理內存限制時,內存的數據會開始和磁盤產生頻繁的交換 (swap)。交換會讓 Redis 的性能急劇下降,對於訪問量比較頻繁的 Redis 來說,這樣龜速的存取效率基本上等於不可用。
  • 在生產環境中我們是不允許 Redis 出現交換行為的,為了限制最大使用內存,Redis 提供了配置參數 maxmemory 來限制內存超出期望大小。
  • 當實際內存超出 maxmemory 時,Redis 提供了幾種可選策略 (maxmemory-policy) 來讓用戶自己決定該如何騰出新的空間以繼續提供讀寫服務。
noeviction # 不會繼續服務寫請求 (DEL 請求可以繼續服務),讀請求可以繼續進行。這樣可以保證不會丟失數據,但是會讓線上的業務不能持續進行。這是默認的淘汰策略。
volatile-lru # 嘗試淘汰設置了過期時間的 key,最少使用的 key 優先被淘汰。沒有設置過期時間的 key 不會被淘汰,這樣可以保證需要持久化的數據不會突然丟失。
volatile-ttl # 跟上面一樣,除了淘汰的策略不是 LRU,而是 key 的剩余壽命 ttl 的值,ttl 越小越優先被淘汰。
volatile-random # 跟上面一樣,不過淘汰的 key 是過期 key 集合中隨機的 key。
# volatile策略只會針對帶過期時間的 key 進行淘汰
allkeys-lru 區別於 volatile-lru,這個策略要淘汰的 key 對象是全體的 key 集合,而不只是過期的 key 集合。這意味着沒有設置過期時間的 key 也會被淘汰。
allkeys-random 跟上面一樣,不過淘汰的策略是隨機的 key。
# allkeys策略會對所有的 key 進行淘汰

使用

  • 修改redis.conf的maxmemory,設置最大使用內存:

    maxmemory 1024000

  • 修改redis.conf的maxmemory-policy,設置redis緩存淘汰機制:

    maxmemory-policy noeviction

使用場景

  • 如果你只是拿 Redis 做緩存,那應該使用 allkeys下的淘汰策略,客戶端寫緩存時不必攜帶過期時間。
  • 如果你還想同時使用 Redis 的持久化功能,那就使用 volatile下的淘汰策略,這樣可以保留沒有設置過期時間的 key,它們是永久的 key 不會被 LRU 算法淘汰。


免責聲明!

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



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