Redis的LRU算法
2019獨角獸企業重金招聘Python工程師標準>>>
整理自官方文檔:將redis當做使用LRU算法的緩存來使用
當Redis被當做緩存來使用,當你新增數據時,讓它自動地回收舊數據是件很方便的事情。這個行為在開發者社區非常有名,因為它是流行的memcached系統的默認行為。
LRU是Redis唯一支持的回收方法。
回收策略
當maxmemory限制達到的時候Redis會使用的行為由 Redis的maxmemory-policy配置指令來進行配置。
以下的策略是可用的:
- noeviction:返回錯誤當內存限制達到并且客戶端嘗試執行會讓更多內存被使用的命令(大部分的寫入指令,但DEL和幾個例外)
- allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數據有空間存放。
- volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的數據有空間存放。
- allkeys-random: 回收隨機的鍵使得新添加的數據有空間存放。
- volatile-random: 回收隨機的鍵使得新添加的數據有空間存放,但僅限于在過期集合的鍵。
- volatile-ttl: 回收在過期集合的鍵,并且優先回收存活時間(TTL)較短的鍵,使得新添加的數據有空間存放。
如果沒有鍵滿足回收的前提條件的話,策略volatile-lru,?volatile-random以及volatile-ttl就和noeviction 差不多了。
回收進程如何工作
理解回收進程如何工作是非常重要的:
- 一個客戶端運行了新的命令,添加了新的數據。
- Redi檢查內存使用情況,如果大于maxmemory的限制, 則根據設定好的策略進行回收。
- 一個新的命令被執行,等等。
- 所以我們不斷地穿越內存限制的邊界,通過不斷達到邊界然后不斷地回收回到邊界以下。
如果一個命令的結果導致大量內存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內存限制就會被這個內存使用量超越。
近似LRU算法
Redis的LRU算法并非完整的實現。這意味著Redis并沒辦法選擇最佳候選來進行回收,也就是最久未被訪問的鍵。相反它會嘗試運行一個近似LRU的算法,通過對少量keys進行取樣,然后回收其中一個最好的key(被訪問時間較早的)。
不過從Redis 3.0算法已經改進為回收鍵的候選池子。這改善了算法的性能,使得更加近似真是的LRU算法的行為。
Redis LRU有個很重要的點,你通過調整每次回收時檢查的采樣數量,以實現調整算法的精度。
?
Redis為什么不使用真實的LRU實現是因為這需要太多的內存。不過近似的LRU算法對于應用而言應該是等價的。
轉載于:https://my.oschina.net/fusublog/blog/3028603
總結
以上是生活随笔為你收集整理的Redis的LRU算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Boot 简单集成 Liq
- 下一篇: MySQL数据库同步小工具(Java实现