將redis當做使用LRU算法的緩存來使用

當Redis被當做緩存來使用,當你新增數據時,讓它自動地回收舊數據是件很方便的事情。這個行為在開發(fā)者社區(qū)非常有名铺坞,因為它是流行的memcached系統(tǒng)的默認行為。
LRU是Redis唯一支持的回收方法洲胖。本頁面包括一些常規(guī)話題济榨,Redis的maxmemory指令用于將可用內存限制成一個固定大小,還包括了Redis使用的LRU算法绿映,這個實際上只是近似的LRU擒滑。

Maxmemory配置指令

maxmemory配置指令用于配置Redis存儲數據時指定限制的內存大小。通過redis.conf可以設置該指令叉弦,或者之后使用CONFIG SET命令來進行運行時配置丐一。
例如為了配置內存限制為100mb,以下的指令可以放在redis.conf文件中淹冰。

maxmemory 100mb

設置maxmemory為0代表沒有內存限制库车。對于64位的系統(tǒng)這是個默認值,對于32位的系統(tǒng)默認內存限制為3GB樱拴。
當指定的內存限制大小達到時凝颇,需要選擇不同的行為,也就是策略疹鳄。 Redis可以僅僅對命令返回錯誤,這將使得內存被使用得更多芦岂,或者回收一些舊的數據來使得添加數據時可以避免內存限制瘪弓。

回收策略
當maxmemory限制達到的時候Redis會使用的行為由 Redis的maxmemory-policy配置指令來進行配置。
以下的策略是可用的:

*noeviction:返回錯誤當內存限制達到并且客戶端嘗試執(zhí)行會讓更多內存被使用的命令(大部分的寫入指令禽最,但DEL和幾個例外)

  • allkeys-lru: 嘗試回收最少使用的鍵(LRU)腺怯,使得新添加的數據有空間存放袱饭。
  • volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的數據有空間存放呛占。
  • allkeys-random: 回收隨機的鍵使得新添加的數據有空間存放虑乖。
  • volatile-random: 回收隨機的鍵使得新添加的數據有空間存放,但僅限于在過期集合的鍵晾虑。
  • volatile-ttl: 回收在過期集合的鍵疹味,并且優(yōu)先回收存活時間(TTL)較短的鍵,使得新添加的數據有空間存放。

如果沒有鍵滿足回收的前提條件的話帜篇,策略volatile-lru, volatile-random以及volatile-ttl就和noeviction 差不多了糙捺。
選擇正確的回收策略是非常重要的,這取決于你的應用的訪問模式笙隙,不過你可以在運行時進行相關的策略調整洪灯,并且監(jiān)控緩存命中率和沒命中的次數,通過RedisINFO命令輸出以便調優(yōu)竟痰。

一般的經驗規(guī)則:

  • 使用allkeys-lru策略:當你希望你的請求符合一個冪定律分布签钩,也就是說,你希望部分的子集元素將比其它其它元素被訪問的更多坏快。如果你不確定選擇什么铅檩,這是個很好的選擇。.
  • 使用allkeys-random:如果你是循環(huán)訪問假消,所有的鍵被連續(xù)的掃描柠并,或者你希望請求分布正常(所有元素被訪問的概率都差不多)。
  • 使用volatile-ttl:如果你想要通過創(chuàng)建緩存對象時設置TTL值富拗,來決定哪些對象應該被過期臼予。

allkeys-lruvolatile-random策略對于當你想要單一的實例實現(xiàn)緩存及持久化一些鍵時很有用。不過一般運行兩個實例是解決這個問題的更好方法啃沪。
為了鍵設置過期時間也是需要消耗內存的粘拾,所以使用allkeys-lru這種策略更加高效,因為沒有必要為鍵取設置過期時間當內存有壓力時创千。

回收進程如何工作
理解回收進程如何工作是非常重要的:

  • 一個客戶端運行了新的命令缰雇,添加了新的數據。
  • Redis檢查內存使用情況追驴,如果大于maxmemory的限制, 則根據設定好的策略進行回收械哟。
  • 一個新的命令被執(zhí)行,等等殿雪。
  • 不斷地穿越內存限制的邊界暇咆,通過不斷達到邊界然后不斷地回收回到邊界以下。

近似LRU算法

Redis的LRU算法并非完整的實現(xiàn)。這意味著Redis并沒辦法選擇最佳候選來進行回收爸业,也就是最久未被訪問的鍵其骄。相反它會嘗試運行一個近似LRU的算法,通過對少量keys進行取樣扯旷,然后回收其中一個最好的key(被訪問時間較早的)拯爽。
不過從Redis 3.0算法已經改進為回收鍵的候選池子。這改善了算法的性能钧忽,使得更加近似真是的LRU算法的行為毯炮。
Redis LRU有個很重要的點,你通過調整每次回收時檢查的采樣數量惰瓜,以實現(xiàn)調整算法的精度否副。這個參數可以通過以下的配置指令調整:

maxmemory-samples 5

Redis為什么不使用真實的LRU實現(xiàn)是因為這需要太多的內存。不過近似的LRU算法對于應用而言應該是等價的崎坊。使用真實的LRU算法與近似的算法可以通過下面的圖像對比备禀。

Paste_Image.png

用于生成圖像的Redis服務被填充了指定數量的鍵。這些鍵將被從頭到尾訪問奈揍,所以當使用LRU算法時第一個鍵是最佳的回收候選鍵曲尸。接著添加超過50%的鍵,用于強制舊鍵被回收男翰。
你可以看到三種點在圖片中, 形成了三種帶.

  • 淺灰色帶是已經被回收的對象另患。
  • 灰色帶是沒有被回收的對象。
  • 綠色帶是被添加的對象蛾绎。
  • 在LRU實現(xiàn)的理論中昆箕,我們希望的是,在舊鍵中的第一半將會過期租冠。Redis的LRU算法則是概率的過期舊的鍵鹏倘。

你可以看到,在都是五個采樣的時候Redis 3.0比Redis 2.8要好顽爹,Redis2.8中在最后一次訪問之間的大多數的對象依然保留著纤泵。使用10個采樣大小的Redis 3.0的近似值已經非常接近理論的性能。

注意LRU只是個預測鍵將如何被訪問的模型镜粤。另外捏题,如果你的數據訪問模式非常接近冪定律,大部分的訪問將集中在一個鍵的集合中肉渴,LRU的近似算法將處理得很好公荧。
在模擬實驗的過程中,我們發(fā)現(xiàn)如果使用冪定律的訪問模式同规,則真實的LRU算法和近似的Redis算法幾乎沒有差別稚矿。
當然你可以提升采樣大小到10庸诱,消耗更多的CPU時間以實現(xiàn)更真實的LRU算法,同時查看下是否讓你的緩存命中率有差別晤揣。
通過CONFIG SET maxmemory-samples命令在生產環(huán)境上設置不同的采樣大小是非常簡單的。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末朱灿,一起剝皮案震驚了整個濱河市昧识,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌盗扒,老刑警劉巖跪楞,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異侣灶,居然都是意外死亡甸祭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門褥影,熙熙樓的掌柜王于貴愁眉苦臉地迎上來池户,“玉大人,你說我怎么就攤上這事凡怎⌒=梗” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵统倒,是天一觀的道長寨典。 經常有香客問我,道長房匆,這世上最難降的妖魔是什么耸成? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮浴鸿,結果婚禮上井氢,老公的妹妹穿的比我還像新娘。我一直安慰自己赚楚,他們只是感情好毙沾,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宠页,像睡著了一般左胞。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上举户,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天烤宙,我揣著相機與錄音,去河邊找鬼俭嘁。 笑死躺枕,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播拐云,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼罢猪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叉瘩?” 一聲冷哼從身側響起膳帕,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薇缅,沒想到半個月后危彩,有當地人在樹林里發(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡泳桦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年汤徽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸撰。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡谒府,死狀恐怖,靈堂內的尸體忽然破棺而出梧奢,到底是詐尸還是另有隱情狱掂,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布亲轨,位于F島的核電站趋惨,受9級特大地震影響,放射性物質發(fā)生泄漏惦蚊。R本人自食惡果不足惜器虾,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蹦锋。 院中可真熱鬧兆沙,春花似錦、人聲如沸莉掂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憎妙。三九已至库正,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間厘唾,已是汗流浹背褥符。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抚垃,地道東北人喷楣。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓趟大,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铣焊。 傳聞我的和親對象是個殘疾皇子逊朽,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容