全國(guó)咨詢(xún)/投訴熱線:400-618-4000

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

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

更新時(shí)間:2021-05-19 來(lái)源:黑馬程序員 瀏覽量:

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

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

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

1、影響生存時(shí)間的一些操作

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

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

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

2、如何更新生存時(shí)間

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

最大緩存配置

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

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

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

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

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

volatile-random:從已設(shè)置過(guò)期時(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ī)定了是對(duì)已設(shè)置過(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ù)訪問(wèn)頻率高,一部分?jǐn)?shù)據(jù)訪問(wèn)頻率低,則使用allkeys-lru

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

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

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



猜你喜歡:

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

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

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

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

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

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

分享到:
在線咨詢(xún) 我要報(bào)名
和我們?cè)诰€交談!