首頁技術(shù)文章正文

redis的緩存失效策略和主鍵失效機(jī)制【java面試常問】

更新時間:2021-05-19 來源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif

作為緩存系統(tǒng)都要定期清理無效數(shù)據(jù),就需要一個主鍵失效和淘汰策略。

在Redis當(dāng)中,有生存期的key被稱為volatile。在創(chuàng)建緩存時,要為給定的key設(shè)置生存期,當(dāng)key過期的時候(生存期為0),它可能會被刪除。

1、影響生存時間的一些操作

生存時間可以通過使用DEL命令來刪除整個key來移除,或者被SET和GETSET命令覆蓋原來的數(shù)據(jù),也就是說,修改key對應(yīng)的value和使用另外相同的key和value來覆蓋以后,當(dāng)前數(shù)據(jù)的生存時間不同。

比如說,對一個key執(zhí)行INCR命令,對一個列表進(jìn)行LPUSH命令,或者對一個哈希表執(zhí)行HSET命令,這類操作都不會修改key 本身的生存時間。另一方面,如果使用RENAME 對一個key 進(jìn)行改名,那么改名后的key的生存時間和改名前一樣。

RENAME 命令的另一種可能是,嘗試將一個帶生存時間的key 改名成另一個帶生存時間的another_key,這時舊的another_key(以及它的生存時間)會被刪除,然后舊的key會改名為another_key,因此,新的another_key的生存時間也和原本的key一樣。使用PERSIST命令可以在不刪除key的情況下,移除key的生存時間,讓key 重新成為一個persistent key 。

2、如何更新生存時間

可以對一個已經(jīng)帶有生存時間的key 執(zhí)行EXPIRE 命令,新指定的生存時間會取代舊的生存時間。過期時間的精度已經(jīng)被控制在1ms 之內(nèi),主鍵失效的時間復(fù)雜度是O(1),EXPIRE 和TTL 命令搭配使用,TTL 可以查看key 的當(dāng)前生存時間。設(shè)置成功返回1;當(dāng)key 不存在或者不能為key 設(shè)置生存時間時,返回0 。

最大緩存配置

在redis中,允許用戶設(shè)置最大使用內(nèi)存大小server.maxmemory 默認(rèn)為0,

沒有指定最大緩存,如果有新的數(shù)據(jù)添加,超過最大內(nèi)存,則會使redis崩潰,所以一定要設(shè)置。redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候,就會實行數(shù)據(jù)淘汰策略。

redis提供6 種數(shù)據(jù)淘汰策略:

volatile-lru:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰

volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰

volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰

allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰

allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰

no-enviction(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)注意這里的6 種機(jī)制,volatile 和allkeys 規(guī)定了是對已設(shè)置過期時間的數(shù)據(jù)集淘汰數(shù)據(jù)還是從全部數(shù)據(jù)集淘汰數(shù)據(jù),后面的lru、ttl以及random是三種不同的淘汰策略,再加上一種no-enviction永不回收的策略。

使用策略規(guī)則:

1、如果數(shù)據(jù)呈現(xiàn)冪律分布,也就是一部分?jǐn)?shù)據(jù)訪問頻率高,一部分?jǐn)?shù)據(jù)訪問頻率低,則使用allkeys-lru

2、如果數(shù)據(jù)呈現(xiàn)平等分布,也就是所有的數(shù)據(jù)訪問頻率都相同,則使用allkeys-random

三種數(shù)據(jù)淘汰策略:

ttl 和random 比較容易理解,實現(xiàn)也會比較簡單。主要是Lru 最近最少使用淘汰策略,設(shè)計上會對key 按失效時間排序,然后取最先失效的key 進(jìn)行淘汰。



猜你喜歡:

Redis的優(yōu)缺點有哪些?

Redis的存儲結(jié)構(gòu)有哪些?

Redis集群方案怎么做?Redis集群有哪些方案?

redis可以做緩存的優(yōu)勢有哪些?

redis緩存原理與實現(xiàn):為什么redis可以做緩存?

黑馬程序員Java發(fā)培訓(xùn)課程

分享到:
在線咨詢 我要報名
和我們在線交談!