記憶體淘汰策略分類
早期版本的 redis 有以下 6 種淘汰策略:
noeviction:不淘汰任何資料,當記憶體不足時,新增操作會報錯,redis 預設記憶體淘汰策略;
allkeys-lru:淘汰整個鍵值中最久未使用的鍵值;
allkeys-random:隨機淘汰任意鍵值;
volatile-lru:淘汰所有設定了過期時間的鍵值中最久未使用的鍵值;
volatile-random:隨機淘汰設定了過期時間的任意鍵值;
volatile-ttl:優先淘汰更早過期的鍵值。
在 redis 4.0 版本中又新增了 2 種淘汰策略:
volatile-lfu:淘汰所有設定了過期時間的鍵值中,最少使用的鍵值;
allkeys-lfu:淘汰整個鍵值中最少使用的鍵值。
修改 redis 記憶體淘汰策略
設定記憶體淘汰策略有兩種方法,
lru 演算法
lru 全稱是 least recently used 譯為最近最少使用,是一種常用的頁面置換演算法,選擇最近最久未使用的頁面予以淘汰。
1. lru 演算法實現
lru 演算法需要基於鍊錶結構,鍊錶中的元素按照操作順序從前往後排列,最新操作的鍵會被移動到表頭,當需要記憶體淘汰時,只需要刪除鍊錶尾部的元素即可。
2. 近 lru 演算法
redis 使用的是一種近似 lru 演算法,目的是為了更好的節約記憶體,它的實現方式是給現有的資料結構新增乙個額外的字段,用於記錄此鍵值的最後一次訪問時間,redis 記憶體淘汰時,會使用隨機取樣的方式來淘汰資料,它是隨機取 5 個值(此值可配置),然後淘汰最久沒有使用的那個。
3. lru 演算法缺點
lru 演算法有乙個缺點,比如說很久沒有使用的乙個鍵值,如果最近被訪問了一次,那麼它就不會被淘汰,即使它是使用次數最少的快取,那它也不會被淘汰,因此在 redis 4.0 之後引入了 lfu 演算法,下面我們一起來看。
lfu 演算法
lfu 全稱是 least frequently used 翻譯為最不常用的,最不常用的演算法是根據總訪問次數來淘汰資料的,它的核心思想是「如果資料過去被訪問多次,那麼將來被訪問的頻率也更高」。
lfu 解決了偶爾被訪問一次之後,資料就不會被淘汰的問題,相比於 lru 演算法也更合理一些。
在 redis 中每個物件頭中記錄著 lfu 的資訊
typedef struct redisobject robj;
在 redis 中 lfu 儲存分為兩部分,16 bit 的 ldt(last decrement time)和 8 bit 的 logc(logistic counter)。
logc 是用來儲存訪問頻次,8 bit 能表示的最大整數值為 255,它的值越小表示使用頻率越低,越容易淘汰;
ldt 是用來儲存上一次 logc 的更新時間。
redis記憶體淘汰策略
lru least recently used,最近很少使用 思想 越最近使用過的資料,接下來使用的機會越大,越應該保留,剔除哪些很久之前使用過的資料 新資料插入到列表頭部 每當快取命中 即快取資料被訪問 則將資料移到列表頭部 當列表滿的時候,將列表尾部的資料丟棄。lfu least frequen...
redis 記憶體淘汰策略配置
在配置檔案有一行 maxmemory policy volatile lru 對應的策略 noeviction 當記憶體使用達到閾值的時候,所有引起申請記憶體的命令會報錯。volatile lru 在設定了過期時間的鍵空間中,優先移除最近未使用的key。allkeys random 在主鍵空間中,隨...
Redis 記憶體資料淘汰策略
no eviction 預設策略。禁止驅逐,保證資料不會丟失 allkeys lru 針對所有key,優先刪除最近最少使用 less recently used 的key volatile lru 針對設定了過期時間的key,優先刪除最近最少使用 less recently used 的key al...