更新時間:2021-05-19 來源:黑馬程序員 瀏覽量:
作為緩存系統(tǒng)都要定期清理無效數據,就需要一個主鍵失效和淘汰策略。
在Redis當中,有生存期的key被稱為volatile。在創(chuàng)建緩存時,要為給定的key設置生存期,當key過期的時候(生存期為0),它可能會被刪除。
1、影響生存時間的一些操作
生存時間可以通過使用DEL命令來刪除整個key來移除,或者被SET和GETSET命令覆蓋原來的數據,也就是說,修改key對應的value和使用另外相同的key和value來覆蓋以后,當前數據的生存時間不同。
比如說,對一個key執(zhí)行INCR命令,對一個列表進行LPUSH命令,或者對一個哈希表執(zhí)行HSET命令,這類操作都不會修改key 本身的生存時間。另一方面,如果使用RENAME 對一個key 進行改名,那么改名后的key的生存時間和改名前一樣。
RENAME 命令的另一種可能是,嘗試將一個帶生存時間的key
改名成另一個帶生存時間的another_key,這時舊的another_key(以及它的生存時間)會被刪除,然后舊的key會改名為another_key,因此,新的another_key的生存時間也和原本的key一樣。使用PERSIST命令可以在不刪除key的情況下,移除key的生存時間,讓key
重新成為一個persistent key 。
2、如何更新生存時間
可以對一個已經帶有生存時間的key 執(zhí)行EXPIRE 命令,新指定的生存時間會取代舊的生存時間。過期時間的精度已經被控制在1ms
之內,主鍵失效的時間復雜度是O(1),EXPIRE 和TTL 命令搭配使用,TTL 可以查看key 的當前生存時間。設置成功返回1;當key
不存在或者不能為key 設置生存時間時,返回0 。
最大緩存配置
在redis中,允許用戶設置最大使用內存大小server.maxmemory 默認為0,
沒有指定最大緩存,如果有新的數據添加,超過最大內存,則會使redis崩潰,所以一定要設置。redis
內存數據集大小上升到一定大小的時候,就會實行數據淘汰策略。
redis提供6 種數據淘汰策略:
volatile-lru:從已設置過期時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過期時間的數據集(server.db[i].expires)中挑選將要過期的數據淘汰
volatile-random:從已設置過期時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-enviction(驅逐):禁止驅逐數據注意這里的6 種機制,volatile 和allkeys
規(guī)定了是對已設置過期時間的數據集淘汰數據還是從全部數據集淘汰數據,后面的lru、ttl以及random是三種不同的淘汰策略,再加上一種no-enviction永不回收的策略。
使用策略規(guī)則:
1、如果數據呈現冪律分布,也就是一部分數據訪問頻率高,一部分數據訪問頻率低,則使用allkeys-lru
2、如果數據呈現平等分布,也就是所有的數據訪問頻率都相同,則使用allkeys-random
三種數據淘汰策略:
ttl 和random 比較容易理解,實現也會比較簡單。主要是Lru 最近最少使用淘汰策略,設計上會對key 按失效時間排序,然后取最先失效的key 進行淘汰。
猜你喜歡: