之前給大家講解過黍图,多級緩存架構厨喂,緩存數(shù)據(jù)生產(chǎn)服務和措,監(jiān)聽各個數(shù)據(jù)源服務的數(shù)據(jù)變更的消息,得到消息之后蜕煌,然后調用接口拉去數(shù)據(jù)
將拉去到的數(shù)據(jù)派阱,寫入本地ehcache緩存一份,spring boot整合斜纪,演示過
數(shù)據(jù)寫入redis分布式緩存中一份颁褂,你不斷的將數(shù)據(jù)寫入redis,寫入redis傀广,然后redis的內存是有限的颁独,每個redis實例最大一般也就是設置給10G
那如果你不斷的寫入數(shù)據(jù),當數(shù)據(jù)寫入的量超過了redis能承受的范圍之后伪冰,改該怎么玩兒呢誓酒??贮聂?
redis是會在數(shù)據(jù)達到一定程度之后靠柑,超過了一個最大的限度之后,就會將數(shù)據(jù)進行一定的清理吓懈,從內存中清理掉一些數(shù)據(jù)
只有清理掉一些數(shù)據(jù)之后歼冰,才能將新的數(shù)據(jù)寫入內存中
1、LRU算法概述
redis默認情況下就是使用LRU策略的耻警,因為內存是有限的隔嫡,但是如果你不斷地往redis里面寫入數(shù)據(jù),那肯定是沒法存放下所有的數(shù)據(jù)在內存的
所以redis默認情況下甘穿,當內存中寫入的數(shù)據(jù)很滿之后腮恩,就會使用LRU算法清理掉部分內存中的數(shù)據(jù),騰出一些空間來温兼,然后讓新的數(shù)據(jù)寫入redis緩存中
LRU:Least Recently Used秸滴,最近最少使用算法
將最近一段時間內,最少使用的一些數(shù)據(jù)募判,給干掉荡含。比如說有一個key,在最近1個小時內届垫,只被訪問了一次; 還有一個key在最近1個小時內释液,被訪問了1萬次
這個時候比如你要將部分數(shù)據(jù)給清理掉,你會選擇清理哪些數(shù)據(jù)岸厍弧均澳?肯定是那個在最近小時內被訪問了1萬次的數(shù)據(jù)
2、緩存清理設置
redis.conf
maxmemory符衔,設置redis用來存放數(shù)據(jù)的最大的內存大小找前,一旦超出這個內存大小之后,就會立即使用LRU算法清理掉部分數(shù)據(jù)
如果用LRU判族,那么就是將最近最少使用的數(shù)據(jù)從緩存中清除出去
對于64 bit的機器躺盛,如果maxmemory設置為0,那么就默認不限制內存的使用形帮,直到耗盡機器中所有的內存為止; 但是對于32 bit的機器槽惫,有一個隱式的閑置就是3GB
maxmemory-policy,可以設置內存達到最大閑置后辩撑,采取什么策略來處理
(1)noeviction: 如果內存使用達到了maxmemory界斜,client還要繼續(xù)寫入數(shù)據(jù),那么就直接報錯給客戶端
(2)allkeys-lru: 就是我們常說的LRU算法合冀,移除掉最近最少使用的那些keys對應的數(shù)據(jù)
(3)volatile-lru: 也是采取LRU算法各薇,但是僅僅針對那些設置了指定存活時間(TTL)的key才會清理掉
(4)allkeys-random: 隨機選擇一些key來刪除掉
(5)volatile-random: 隨機選擇一些設置了TTL的key來刪除掉
(6)volatile-ttl: 移除掉部分keys,選擇那些TTL時間比較短的keys
在redis里面君躺,寫入key-value對的時候峭判,是可以設置TTL,存活時間棕叫,比如你設置了60s林螃。那么一個key-value對,在60s之后就會自動被刪除
redis的使用俺泣,各種數(shù)據(jù)結構疗认,list,set伏钠,等等
allkeys-lru
這邊拓展一下思路侮邀,對技術的研究,一旦將一些技術研究的比較透徹之后贝润,就喜歡橫向對比底層的一些原理
storm绊茧,科普一下
玩兒大數(shù)據(jù)的人搞得,領域打掘,實時計算領域华畏,storm
storm有很多的流分組的一些策略,按shuffle分組尊蚁,global全局分組亡笑,direct直接分組,fields按字段值hash后分組
分組策略也很多横朋,但是仑乌,真正公司里99%的場景下,使用的也就是shuffle和fields,兩種策略
redis晰甚,給了這么多種亂七八糟的緩存清理的算法衙传,其實真正常用的可能也就那么一兩種,allkeys-lru是最常用的
3厕九、緩存清理的流程
(1)客戶端執(zhí)行數(shù)據(jù)寫入操作
(2)redis server接收到寫入操作之后蓖捶,檢查maxmemory的限制,如果超過了限制扁远,那么就根據(jù)對應的policy清理掉部分數(shù)據(jù)
(3)寫入操作完成執(zhí)行
4俊鱼、redis的LRU近似算法
科普一個相對來說稍微高級一丟丟的知識點
redis采取的是LRU近似算法,也就是對keys進行采樣畅买,然后在采樣結果中進行數(shù)據(jù)清理
redis 3.0開始并闲,在LRU近似算法中引入了pool機制,表現(xiàn)可以跟真正的LRU算法相當谷羞,但是還是有所差距的帝火,不過這樣可以減少內存的消耗
redis LRU算法,是采樣之后再做LRU清理的洒宝,跟真正的购公、傳統(tǒng)、全量的LRU算法是不太一樣的
maxmemory-samples雁歌,比如5宏浩,可以設置采樣的大小,如果設置為10靠瞎,那么效果會更好比庄,不過也會耗費更多的CPU資源