標籤:
作為緩衝系統都要定期清理無效資料,就需要一個主鍵失效和淘汰策略.
在Redis當中,有生存期的key被稱為volatile。在建立緩衝時,要為給定的key設定生存期,當key到期的時候(生存期為0),它可能會被刪除。
1、影響存留時間的一些操作
存留時間可以通過使用 DEL 命令來刪除整個 key 來移除,或者被 SET 和 GETSET 命令覆蓋原來的資料,也就是說,修改key對應的value和使用另外相同的key和value來覆蓋以後,當前資料的存留時間不同。
比如說,對一個 key 執行INCR命令,對一個列表進行LPUSH命令,或者對一個雜湊表執行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 執行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規定了是對已設定到期時間的資料集淘汰資料還是從全部資料集淘汰資料,後面的lru、ttl以及random是三種不同的淘汰策略,再加上一種no-enviction永不回收的策略。
使用原則規則:
1、如果資料呈現冪律分布,也就是一部分資料訪問頻率高,一部分資料訪問頻率低,則使用allkeys-lru
2、如果資料呈現平等分布,也就是所有的資料訪問頻率都相同,則使用allkeys-random
三種資料淘汰策略:
ttl和random比較容易理解,實現也會比較簡單。主要是Lru最近最少使用淘汰策略,設計上會對key 按失效時間排序,然後取最先失效的key進行淘汰
原文請參見:https://yq.aliyun.com/articles/38441?spm=5176.100239.blogrightarea.11.yP0aqU
Redis的緩衝策略和主鍵失效機制