天天看點

redis幾種記憶體淘汰政策

Redis作為目前最常用的開源記憶體資料庫,讀寫性能都十分高,據官方資料表示Redis讀的速度是110000次/秒,寫的速度是81000次/秒。

redis記憶體淘汰政策

redis配置參數 maxmemory限制記憶體大小Redis就會根據使用者配置的淘汰政策選出無用的key;

那麼Redis記憶體淘汰政策是如何工作的呢?

首先,用戶端會發起需要更多記憶體的申請;

其次,Redis檢查記憶體使用情況,如果實際使用記憶體已經超出maxmemory,Redis就會根據使用者配置的淘汰政策選出無用的key;

最後,确認選中資料沒有問題,成功執行淘汰任務。

目前Redis3.0版本支援的淘汰政策有6種:

1. volatile-lru:從設定過期時間的資料集(server.db[i].expires)中挑選出最近最少使用的資料淘汰。沒有設定過期時間的key不會被淘汰,這樣就可以在增加記憶體空間的同時保證需要持久化的資料不會丢失。

2. volatile-ttl:除了淘汰機制采用LRU,政策基本上與volatile-lru相似,從設定過期時間的資料集(server.db[i].expires)中挑選将要過期的資料淘汰,ttl值越大越優先被淘汰。

3. volatile-random:從已設定過期時間的資料集(server.db[i].expires)中任意選擇資料淘汰。當記憶體達到限制無法寫入非過期時間的資料集時,可以通過該淘汰政策在主鍵空間中随機移除某個key。

4. allkeys-lru:從資料集(server.db[i].dict)中挑選最近最少使用的資料淘汰,該政策要淘汰的key面向的是全體key集合,而非過期的key集合。

5. allkeys-random:從資料集(server.db[i].dict)中選擇任意資料淘汰。

6. no-enviction:禁止驅逐資料,也就是當記憶體不足以容納新入資料時,新寫入操作就會報錯,請求可以繼續進行,線上任務也不能持續進行,采用no-enviction政策可以保證資料不被丢失,這也是系統預設的一種淘汰政策。

LRU淘汰

LRU(Least recently used,最近最少使用)算法根據資料的曆史通路記錄來進行淘汰資料,其核心思想是“如果資料最近被通路過,那麼将來被通路的幾率也更高”。

在伺服器配置中儲存了 lru 計數器 server.lrulock,會定時(redis 定時程式 serverCorn())更新,server.lrulock 的值是根據 server.unixtime 計算出來進行排序的,然後選擇最近使用時間最久的資料進行删除。另外,從 struct redisObject 中可以發現,每一個 redis 對象都會設定相應的 lru。每一次通路資料,會更新對應redisObject.lru

在Redis中,LRU算法是一個近似算法,預設情況下,Redis會随機挑選5個鍵,并從中選擇一個最久未使用的key進行淘汰。在配置檔案中,按maxmemory-samples選項進行配置,選項配置越大,消耗時間就越長,但結構也就越精準。

TTL淘汰

Redis 資料集資料結構中儲存了鍵值對過期時間的表,即 redisDb.expires。與 LRU 資料淘汰機制類似,TTL 資料淘汰機制中會先從過期時間的表中随機挑選幾個鍵值對,取出其中 ttl 最大的鍵值對淘汰。同樣,TTL淘汰政策并不是面向所有過期時間的表中最快過期的鍵值對,而隻是随機挑選的幾個鍵值對。

随機淘汰:

在随機淘汰的場景下擷取待删除的鍵值對,随機找hash桶再次hash指定位置的dictEntry即可。

繼續閱讀