3. 緩存 Redis-內(nèi)存淘汰策略

一 Redis 內(nèi)存配置

Redis是基于內(nèi)存的key-value數(shù)據(jù)庫,因為系統(tǒng)的內(nèi)存大小有限咖楣,所以我們在使用Redis的時候可以配置Redis能使用的最大的內(nèi)存大小。

1.1 通過配置文件配置

通過在Redis安裝目錄下面的redis.conf配置文件中添加以下配置設(shè)置內(nèi)存大小

  • redis的配置文件不一定使用的是安裝目錄下面的redis.conf文件,啟動redis服務(wù)的時候是可以傳一個參數(shù)指定redis的配置文件的
//設(shè)置Redis最大占用內(nèi)存大小為100M
maxmemory 100mb

1.2 通過命令修改

  • Redis支持運行時通過命令動態(tài)修改內(nèi)存大小
//設(shè)置Redis最大占用內(nèi)存大小為100M
127.0.0.1:6379> config set maxmemory 100mb
  • 獲取設(shè)置的Redis能使用的最大內(nèi)存大小
//獲取設(shè)置的Redis能使用的最大內(nèi)存大小
127.0.0.1:6379> config get maxmemory
  • 如果不設(shè)置最大內(nèi)存大小或者設(shè)置最大內(nèi)存大小為0舶斧,在64位操作系統(tǒng)下不限制內(nèi)存大小强缘,在32位操作系統(tǒng)下最多使用3GB內(nèi)存

二 redis 過期策略

  • redis 過期策略是:定期刪除+惰性刪除督惰。

定期刪除

所謂定期刪除,指的是 redis 默認(rèn)是每隔 100ms 就隨機(jī)抽取一些設(shè)置了過期時間的 key旅掂,檢查其是否過期赏胚,如果過期就刪除。

假設(shè) redis 里放了 10w 個 key商虐,都設(shè)置了過期時間觉阅,你每隔幾百毫秒,就檢查 10w 個 key秘车,那 redis 基本上就死了典勇,cpu 負(fù)載會很高的,消耗在你的檢查過期 key 上了叮趴。注意割笙,這里可不是每隔 100ms 就遍歷所有的設(shè)置過期時間的 key,那樣就是一場性能上的災(zāi)難眯亦。實際上 redis 是每隔 100ms 隨機(jī)抽取一些 key 來檢查和刪除的伤溉。
問題
定期刪除可能會導(dǎo)致很多過期 key 到了時間并沒有被刪除掉,
解決
使用惰性刪除妻率。

惰性刪除

在獲取某個 key 的時候乱顾,redis 會檢查一下 ,這個 key 如果設(shè)置了過期時間那么是否過期了宫静?如果過期了此時就會刪除走净,不會給你返回任何東西。

  • 獲取 key 的時候孤里,如果此時 key 已經(jīng)過期温技,就刪除,不會返回任何東西扭粱。
    問題
    如果定期刪除漏掉了很多過期 key舵鳞,然后你也沒及時去查,也就沒走惰性刪除琢蛤,此時會怎么樣蜓堕?如果大量過期 key 堆積在內(nèi)存里抛虏,導(dǎo)致 redis 內(nèi)存塊耗盡了,咋整套才?
    答案是:走內(nèi)存淘汰機(jī)制迂猴。

三 Redis的內(nèi)存淘汰

Redis是基于內(nèi)存的緩存框架,所以配置內(nèi)存是受限于物理機(jī)內(nèi)存的大小背伴,當(dāng)內(nèi)容使用完之后沸毁,如果繼續(xù)往Redis中寫數(shù)據(jù)redis沒有內(nèi)存可用了會如何處理?會宕機(jī)嗎傻寂?
事實上息尺,宕機(jī)是不太可能的,Redis定義了幾種策略用來處理上述情況的放生:

  • noeviction(默認(rèn)策略):不淘汰疾掰,對于寫請求不再提供服務(wù)搂誉,直接返回錯誤(DEL請求和部分特殊請求除外);
  • allkeys-lru:從所有key中使用LRU算法進(jìn)行淘汰静檬;
  • volatile-lru:從設(shè)置了過期時間的key中使用LRU算法進(jìn)行淘汰炭懊;
  • allkeys-random:從所有key中隨機(jī)淘汰數(shù)據(jù);
  • volatile-random:從設(shè)置了過期時間的key中隨機(jī)淘汰拂檩;
  • volatile-ttl:在設(shè)置了過期時間的key中侮腹,根據(jù)key的過期時間進(jìn)行淘汰,越早過期的越優(yōu)先被淘汰稻励。

當(dāng)使用volatile-lru父阻、volatile-randomvolatile-ttl這三種策略時钉迷,如果沒有key可以被淘汰,則和noeviction一樣返回錯誤钠署。

查詢Redis的內(nèi)存淘汰策略

127.0.0.1:6379> config get maxmemory-policy

配置Redis的內(nèi)存淘汰策略

  1. 通過配置文件設(shè)置淘汰策略(修改redis.conf文件):
maxmemory-policy allkeys-lru
  1. 通過命令修改淘汰策略:
127.0.0.1:6379> config set maxmemory-policy allkeys-lru

LRU

什么是LRU算法

LRU(Least Recently Used)糠聪,即最近最少使用,是一種緩存置換算法谐鼎。在使用內(nèi)存作為緩存的時候舰蟆,緩存的大小一般是固定的。當(dāng)緩存被占滿狸棍,這個時候繼續(xù)往緩存里面添加數(shù)據(jù)身害,就需要淘汰一部分老的數(shù)據(jù),釋放內(nèi)存空間用來存儲新的數(shù)據(jù)草戈。這個時候就可以使用LRU算法了塌鸯。其核心思想是:如果一個數(shù)據(jù)在最近一段時間沒有被用到,那么將來被使用到的可能性也很小唐片,所以就可以被淘汰掉丙猬。

LRU在Redis中的實現(xiàn)

1. 近似LRU算法

Redis使用的是近似LRU算法涨颜,它跟常規(guī)的LRU算法還不太一樣。近似LRU算法通過隨機(jī)采樣法淘汰數(shù)據(jù)茧球,每次隨機(jī)出5(默認(rèn))個key庭瑰,從里面淘汰掉最近最少使用的key。

  • 可以通過maxmemory-samples參數(shù)修改采樣數(shù)量:例:maxmemory-samples 10 maxmenory-samples配置的越大抢埋,淘汰的結(jié)果越接近于嚴(yán)格的LRU算法弹灭。

Redis為了實現(xiàn)近似LRU算法,給每個key增加了一個額外增加了一個24bit的字段揪垄,用來存儲該key最后一次被訪問的時間穷吮。

2. Redis3.0對近似LRU的優(yōu)化

Redis3.0對近似LRU算法進(jìn)行了一些優(yōu)化。新算法會維護(hù)一個候選池(大小為16)福侈,池中的數(shù)據(jù)根據(jù)訪問時間進(jìn)行排序酒来,第一次隨機(jī)選取的key都會放入池中,隨后每次隨機(jī)選取的key只有在訪問時間小于池中最小的時間才會放入池中肪凛,直到候選池被放滿堰汉。當(dāng)放滿后,如果有新的key需要放入伟墙,則將池中最后訪問時間最大(最近被訪問)的移除翘鸭。

當(dāng)內(nèi)存不足需要淘汰的時候,則直接從池中選取最近訪問時間最写量(最久沒被訪問)的key淘汰掉就行就乓。

3. ##### LRU算法的對比

通過一個實驗對比各LRU算法的準(zhǔn)確率,先往Redis里面添加一定數(shù)量的數(shù)據(jù)n拱烁,使Redis可用內(nèi)存用完生蚁,再往Redis里面添加n/2的新數(shù)據(jù),這個時候就需要淘汰掉一部分的數(shù)據(jù)戏自,如果按照嚴(yán)格的LRU算法邦投,應(yīng)該淘汰掉的是最先加入的n/2的數(shù)據(jù)。生成如下各LRU算法的對比圖

  • 淺灰色是被淘汰的數(shù)據(jù)
  • 灰色是沒有被淘汰掉的老數(shù)據(jù)
  • 綠色是新加入的數(shù)據(jù)
對比圖

能看到Redis3.0采樣數(shù)是10生成的圖最接近于嚴(yán)格的LRU擅笔。而同樣使用5個采樣數(shù)志衣,Redis3.0也要優(yōu)于Redis2.8。

LFU算法

什么是LFU算法

LFU算法是Redis4.0里面新加的一種淘汰策略猛们。它的全稱是Least Frequently Used念脯,它的核心思想是根據(jù)key的最近被訪問的頻率進(jìn)行淘汰,很少被訪問的優(yōu)先被淘汰弯淘,被訪問的多的則被留下來绿店。

LFU算法能更好的表示一個key被訪問的熱度。假如你使用的是LRU算法庐橙,一個key很久沒有被訪問到惯吕,只剛剛是偶爾被訪問了一次惕它,那么它就被認(rèn)為是熱點數(shù)據(jù),不會被淘汰废登,而有些key將來是很有可能被訪問到的則被淘汰了淹魄。如果使用LFU算法則不會出現(xiàn)這種情況,因為使用一次并不會使一個key成為熱點數(shù)據(jù)堡距。

LFU一共有兩種策略:

  • volatile-lfu:在設(shè)置了過期時間的key中使用LFU算法淘汰key甲锡;
  • allkeys-lfu:在所有的key中使用LFU算法淘汰數(shù)據(jù)

設(shè)置使用這兩種淘汰策略跟前面講的一樣,不過要注意的一點是這兩周策略只能在Redis4.0及以上設(shè)置羽戒,如果在Redis4.0以下設(shè)置會報錯缤沦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市易稠,隨后出現(xiàn)的幾起案子缸废,更是在濱河造成了極大的恐慌,老刑警劉巖驶社,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件企量,死亡現(xiàn)場離奇詭異,居然都是意外死亡亡电,警方通過查閱死者的電腦和手機(jī)届巩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來份乒,“玉大人恕汇,你說我怎么就攤上這事』蛳剑” “怎么了瘾英?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颂暇。 經(jīng)常有香客問我缺谴,道長,這世上最難降的妖魔是什么蟀架? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任瓣赂,我火速辦了婚禮榆骚,結(jié)果婚禮上片拍,老公的妹妹穿的比我還像新娘。我一直安慰自己妓肢,他們只是感情好捌省,可當(dāng)我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著碉钠,像睡著了一般纲缓。 火紅的嫁衣襯著肌膚如雪卷拘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天祝高,我揣著相機(jī)與錄音栗弟,去河邊找鬼。 笑死工闺,一個胖子當(dāng)著我的面吹牛乍赫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播陆蟆,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼雷厂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了叠殷?” 一聲冷哼從身側(cè)響起改鲫,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體双泪,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡氓英,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了沮翔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖避除,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胸嘁,我是刑警寧澤瓶摆,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站性宏,受9級特大地震影響群井,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毫胜,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一书斜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酵使,春花似錦荐吉、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春痪欲,著一層夾襖步出監(jiān)牢的瞬間悦穿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工业踢, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留栗柒,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓知举,卻偏偏與公主長得像傍衡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子负蠕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Redis占用內(nèi)存大小 我們知道Redis是基于內(nèi)存的key-value數(shù)據(jù)庫蛙埂,因為系統(tǒng)的內(nèi)存大小有限,所以我們在...
    全能程序員閱讀 204評論 0 0
  • Expire Redis的數(shù)據(jù)可以采用expire命令 設(shè)置過期時間遮糖,到了過期時間之后reids并不是立即將過期的...
    xupengzhang閱讀 1,122評論 0 0
  • 目標(biāo) 分析redis的內(nèi)存淘汰策略, lru算法簡介 lru算法簡介 Least recently used(LR...
    愛編程的凱哥閱讀 429評論 0 1
  • 讀書的農(nóng)民工兄弟 文/魯先圣 城市的文化市場經(jīng)過一陣子的清理绣的,沉寂了幾個月,最近又繁榮起來了欲账。賣鳥的賣花...
    魯先圣閱讀 393評論 2 5
  • 第一次看見你們屡江,曾以為會像我剛讀書那樣,被獨立赛不,被嫌棄惩嘉,未曾想我開始了不一樣的旅途…… 你們頑皮經(jīng)常...
    獨孤淑羽閱讀 161評論 0 0