更新時間:2021-05-19 來源:黑馬程序員 瀏覽量:
作為緩存系統(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)行淘汰。
猜你喜歡: