【教3妹學Redis】3.Redis的過期策略和內(nèi)存淘汰機制

3妹

3妹:2哥,我已經(jīng)學習了1.Redis概述2.Redis的底層數(shù)據(jù)結(jié)構(gòu),知道了Redis的數(shù)據(jù)key-value結(jié)構(gòu),是放在內(nèi)存里的?,F(xiàn)在有個問題,那如果一直增加key, 內(nèi)存不夠用了咋辦呢?
2哥:這個你想到了, Redis的設(shè)計者當然也想到了, Redis有過期策略和內(nèi)存淘汰策略的。
3妹:這樣啊, 那2哥給我講講唄。
2哥:可以是可以,就是口有點渴了,想喝杯咖啡。
3妹:可以,只要給我講明白了,保證星巴克伺候。
2哥:哈哈,一言為定啊。

講課

Redis的過期策略

我們都知道,Redis是key-value數(shù)據(jù)庫,我們可以設(shè)置Redis中緩存的key的過期時間。
expires字典會保存所有設(shè)置了過期時間的key的過期時間數(shù)據(jù),其中,key是指向鍵空間中的某個鍵的指針,value是該鍵的毫秒精度的UNIX時間戳表示的過期時間。鍵空間是指該Redis集群中保存的所有鍵。
Redis的過期策略就是指當Redis中緩存的key過期了,Redis如何處理。過期策略通常有以下三種:

  • 定時過期:每個設(shè)置過期時間的key都需要創(chuàng)建一個定時器,到過期時間就會立即清除。該策略可以立即清除過期的數(shù)據(jù),對內(nèi)存很友好;但是會占用大量的CPU資源去處理過期的數(shù)據(jù),從而影響緩存的響應時間和吞吐量。
  • 惰性過期只有當訪問一個key時,才會判斷該key是否已過期,過期則清除。該策略可以最大化地節(jié)省CPU資源,卻對內(nèi)存非常不友好。極端情況可能出現(xiàn)大量的過期key沒有再次被訪問,從而不會被清除,占用大量內(nèi)存。
  • 定期過期:每隔一定的時間,會掃描一定數(shù)量的數(shù)據(jù)庫的expires字典中一定數(shù)量的key,并清除其中已過期的key。該策略是前兩者的一個折中方案。通過調(diào)整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得CPU和內(nèi)存資源達到最優(yōu)的平衡效果

Redis中同時使用了惰性過期定期過期兩種過期策略。

Redis的內(nèi)存淘汰機制

既然可以設(shè)置Redis最大占用內(nèi)存大小,那么配置的內(nèi)存就有用完的時候。那在內(nèi)存用完的時候,還繼續(xù)往Redis里面添加數(shù)據(jù)不就沒內(nèi)存可用了嗎?實際上Redis定義了幾種策略用來處理這種情況:

noeviction(默認策略):對于寫請求不再提供服務,直接返回錯誤(DEL請求和部分特殊請求除外)

allkeys-lru:從所有key中使用LRU算法進行淘汰

volatile-lru:從設(shè)置了過期時間的key中使用LRU算法進行淘汰

allkeys-random:從所有key中隨機淘汰數(shù)據(jù)

volatile-random:從設(shè)置了過期時間的key中隨機淘汰

volatile-ttl:在設(shè)置了過期時間的key中,根據(jù)key的過期時間進行淘汰,越早過期的越優(yōu)先被淘汰

當使用volatile-lru、volatile-random、volatile-ttl這三種策略時,如果沒有key可以被淘汰,則和noeviction一樣返回錯誤

作為內(nèi)存數(shù)據(jù)庫,出于對性能和內(nèi)存消耗的考慮,Redis 的淘汰算法實際實現(xiàn)上并非針對所有 key,而是抽樣一小部分并且從中選出被淘汰的 key。
使用 Redis 緩存數(shù)據(jù)時,為了提高緩存命中率,需要保證緩存數(shù)據(jù)都是熱點數(shù)據(jù)??梢詫?nèi)存最大使用量設(shè)置為熱點數(shù)據(jù)占用的內(nèi)存量,然后啟用 allkeys-lru 淘汰策略,將最近最少使用的數(shù)據(jù)淘汰。
Redis 4.0 引入了 volatile-lfu 和 allkeys-lfu 淘汰策略,LFU 策略通過統(tǒng)計訪問頻率,將訪問頻率最少的鍵值對淘汰。

相關(guān)閱讀

1.Redis概述 http://www.itdecent.cn/p/41619e4a00b1
2.Redis的底層數(shù)據(jù)結(jié)構(gòu) http://www.itdecent.cn/p/f74697b90a4e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容