redis 過期數(shù)據(jù)清理機(jī)制

Redis 使用一個(gè) HashTable 存儲(chǔ)數(shù)據(jù)的過期時(shí)間,把數(shù)據(jù)的 key 與過期時(shí)間相關(guān)聯(lián)鳄虱,這樣就可以通過 key 來查詢數(shù)據(jù)的過期時(shí)間了趣席。

但 Redis 并不會(huì)每時(shí)每刻去檢查數(shù)據(jù)是否過期,因?yàn)檫@樣做效率太低醇蝴。Redis 清除過期數(shù)據(jù)分兩個(gè)階段進(jìn)行,第一個(gè)階段在定時(shí)器中進(jìn)行(serverCron)想罕,第二個(gè)階段在用戶獲取數(shù)據(jù)時(shí)進(jìn)行悠栓。 階段一對內(nèi)存友好,對 CPU 不友好按价。如果過期刪除的鍵比較多的時(shí)候惭适,刪除鍵這一行為會(huì)占用相當(dāng)一部分 CPU 性能,會(huì)對 Redis 的吞吐量造成一定影響楼镐。階段二對 CPU 友好癞志,內(nèi)存不友好。如果很多鍵過期了框产,但在將來很長一段時(shí)間內(nèi)沒有很多客戶端訪問該鍵導(dǎo)致過期鍵不會(huì)被刪除凄杯,占用大量內(nèi)存空間。

在 Redis 的定時(shí)器中秉宿,每隔 100 毫秒便會(huì)調(diào)用 src/redis.c 的 activeExpireCycle 函數(shù)清理過期數(shù)據(jù)戒突。
activeExpireCycle 函數(shù)隨機(jī)獲取一些數(shù)據(jù)的過期時(shí)間,如果當(dāng)前時(shí)間大于數(shù)據(jù)設(shè)定的過期時(shí)間描睦,就把此數(shù)據(jù)從內(nèi)存中刪除膊存。Redis 每次隨機(jī)獲取 10 個(gè)數(shù)據(jù)的過期時(shí)間,如果這 10 個(gè)數(shù)據(jù)中有超過 25% 的數(shù)據(jù)到達(dá)過期時(shí)間(也就是大于等于 3 個(gè)),這個(gè)清理過程會(huì)一直進(jìn)行下去隔崎。目地是可能刪除更多的過期數(shù)據(jù)今艺,節(jié)省內(nèi)存的空間。

用戶使用 get爵卒、hget 等命令獲取數(shù)據(jù)時(shí)虚缎,Redis 調(diào)用 expireIfNeeded 函數(shù)刪除過期的數(shù)據(jù)(但僅限于當(dāng)前獲取的數(shù)據(jù))。該函數(shù)判斷當(dāng)前獲取的數(shù)據(jù)是否過期技潘,如果已經(jīng)過期遥巴,調(diào)用 dbDelete 函數(shù)把它從數(shù)據(jù)庫中刪除。dbDelete函數(shù)除了刪除數(shù)據(jù)外享幽,還會(huì)把數(shù)據(jù)的過期時(shí)間信息刪除铲掐。

因?yàn)樵诙〞r(shí)器中只是隨機(jī)刪除一些過期數(shù)據(jù),不可能把所有的過期數(shù)據(jù)完全刪除值桩。所以在獲取數(shù)據(jù)時(shí)還需要對數(shù)據(jù)進(jìn)行過期判斷摆霉。

當(dāng)內(nèi)存達(dá)到 maxmemory 配置時(shí)候,也會(huì)觸發(fā) Key 的刪除操作奔坟。
———————————————————————————————————

總結(jié)

如果 Redis 中每天過期大量 Key(比如幾千萬)携栋,那么必須得考慮過期 Key 的清理:
增加 Redis 主動(dòng)清理的頻率(通過調(diào)大hz參數(shù));
手動(dòng)清理過期 Key咳秉,最簡單的方法是進(jìn)行 scan 操作婉支,scan 操作會(huì)觸發(fā)第一種被動(dòng)刪除,scan 操作時(shí)候別忘了加 count澜建;
dbsize 命令返回的 Key 數(shù)量向挖,包含了過期 Key;
randomkey 命令返回的 Key炕舵,不包含過期 Key何之;
scan 命令返回的 Key,包含過期 Key咽筋;
info 命令返回的# Keyspace:
db6:keys=1034937352,expires=994731489,avg_ttl=507838502
keys 對應(yīng)的 Key 數(shù)量等同于 dbsize溶推;(因?yàn)?Redis的特性單線程慷丽, keys 指令會(huì)導(dǎo)致線程阻塞一段時(shí)間窃蹋,線上服務(wù)會(huì)停頓,直到指令執(zhí)行完畢身冀,服務(wù)才能恢復(fù)睹耐。這個(gè)時(shí)候可以使用 scan 指令舰褪,scan 指令可以無阻塞的提取出指定模式的key 列表,但是會(huì)有一定的重復(fù)概率疏橄,在客戶端做一次去重就可以了占拍,但是整體所花費(fèi)的時(shí)間會(huì)比直接用 keys 指令長略就。)
expires 指的是設(shè)置了過期時(shí)間的 Key 數(shù)量;
avg_ttl 指設(shè)置了過期時(shí)間的 Key 的平均過期時(shí)間(單位:毫秒)晃酒;

———————————————————————————————————


image.png

最后再附上一些參考文章:
http://lxw1234.com/archives/2017/07/874.htm

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末表牢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子贝次,更是在濱河造成了極大的恐慌崔兴,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛔翅,死亡現(xiàn)場離奇詭異敲茄,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)山析,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門堰燎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人笋轨,你說我怎么就攤上這事秆剪。” “怎么了爵政?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵仅讽,是天一觀的道長。 經(jīng)常有香客問我钾挟,道長洁灵,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任掺出,我火速辦了婚禮徽千,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蛛砰。我一直安慰自己,他們只是感情好黍衙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布泥畅。 她就那樣靜靜地躺著,像睡著了一般琅翻。 火紅的嫁衣襯著肌膚如雪位仁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天方椎,我揣著相機(jī)與錄音聂抢,去河邊找鬼。 笑死棠众,一個(gè)胖子當(dāng)著我的面吹牛琳疏,可吹牛的內(nèi)容都是我干的有决。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼空盼,長吁一口氣:“原來是場噩夢啊……” “哼书幕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揽趾,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤台汇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后篱瞎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體苟呐,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年俐筋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牵素。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡校哎,死狀恐怖两波,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情闷哆,我是刑警寧澤腰奋,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抱怔,受9級特大地震影響劣坊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屈留,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一局冰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧灌危,春花似錦康二、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至味混,卻和暖如春产雹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翁锡。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工蔓挖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人馆衔。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓瘟判,卻偏偏與公主長得像怨绣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子荒适,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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

  • NOSQL類型簡介鍵值對:會(huì)使用到一個(gè)哈希表梨熙,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù),如redis刀诬,volde...
    MicoCube閱讀 3,984評論 2 27
  • 使用緩存是系統(tǒng)性能優(yōu)化的第一黃金法則咽扇。 緩存的設(shè)計(jì)和使用對一個(gè)系統(tǒng)的性能至關(guān)重要,平時(shí)接觸到項(xiàng)目無論多少也都會(huì)在某...
    刀刃丿閱讀 1,343評論 0 6
  • 制定Redis過期策略陕壹,是整個(gè)Redis緩存策略的關(guān)鍵之一质欲,因?yàn)閮?nèi)存來說,公司不可能無限大糠馆,所以就要對key進(jìn)行一...
    JackFrost_fuzhu閱讀 4,841評論 1 10
  • 1. Redis數(shù)據(jù)庫介紹 1.1 介紹 了解NoSQL數(shù)據(jù)庫為什么要拋棄關(guān)系型數(shù)據(jù)庫嘶伟?為什么NoSQL數(shù)據(jù)庫的讀...
    nimw閱讀 841評論 0 2
  • 未到的時(shí)候 我沒有抱有太大期望 可到了以后 才發(fā)現(xiàn) 這里 真的好溫暖 沒有傳說中的那么多的爾虞我詐 沒有什么人情世...
    乂氼W閱讀 385評論 0 3