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