redis資料淘汰機制
概述
在 redis 中,允許使用者設定最大使用記憶體大小 server.maxmemory,在記憶體限定的情況下是很有用的。譬如,在一台 8g 機子上部署了 4 個 redis 服務點,每乙個服務點分配 1g 的記憶體大小,減少記憶體緊張的情況,由此獲取更為穩健的服務。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(驅逐):禁止驅逐資料 ,不淘汰資料,直接報錯
預設使用:no-enviction
redis 確定驅逐某個鍵值對後,會刪除這個資料,並將這個資料變更訊息發布到本地(aof 持久化)和從機(主從連線)。
lru 資料淘汰機制
每乙個 redis 物件都會設定相應的 lru,即最近訪問的時間。可以想象的是,每一次訪問資料的時候,會更新 redisobject.lru。
淘汰原理:
在資料集中隨機挑選幾個鍵值對,取出其中 lru 最大的鍵值對淘汰。所以,你會發現,redis 並不是保證取得所有資料集中最近最少使用(lru)的鍵值對,而只是隨機挑選的幾個鍵值對中的。
ttl 資料淘汰機制
redis 資料集資料結構中儲存了鍵值對過期時間的表,即 redisdb.expires,在使用 set 命令的時候,就有乙個鍵值對超時時間的選項。
淘汰原理:
從過期時間 redisdb.expires 表中隨機挑選幾個鍵值對,取出其中 ttl 最大的鍵值對淘汰。同樣你會發現,redis 並不是保證取得所有過期時間的表中最快過期的鍵值對,而只是隨機挑選的幾個鍵值對中的。
什麼時候開始淘汰資料
redis 每服務客戶端執行乙個命令的時候,會檢測使用的記憶體是否超額。如果超額,即進行資料淘汰。
資料淘汰策略其實只是其中一種資料的刪除策略,從大方向上看,應該看看redis資料刪除策略
資料刪除策略有三種:
被動刪除:只有key被操作時(如get),redis才會被動檢查該key是否過期,如果過期則刪除之並且返回nil。
主動刪除:定期刪除過期的資料,可以配置
當前已用記憶體超過maxmemory限定時,觸發資料淘汰策略
被動刪除特點:
這種刪除策略對cpu是友好的,刪除操作只有在不得不的情況下才會進行,不會其他的expire key上浪費無謂的cpu時間。
但是這種策略對記憶體不友好,乙個key已經過期,但是在它被操作之前不會被刪除,仍然佔據記憶體空間。如果有大量的過期鍵存在但是又很少被訪問到,那會造成大量的記憶體空間浪費。expireifneeded(redisdb *db, robj *key)函式位於src/db.c。
參考
redis資料淘汰機制
在redis中,redis允許使用者更改設定最大記憶體maxmemory,在每次寫入或更新等操作時候,redis會檢查使用的記憶體,當記憶體達到最大值得時候,就會進行資料淘汰策略,從而換取記憶體出來 redis資料淘汰策略有6種 volatile lru 從已設定過期時間的資料集 server.db...
Redis 資料淘汰機制
為了更好的利用記憶體,使redis儲存的都是快取的熱點資料,redis設計了相應的記憶體淘汰機制 也叫做快取淘汰機制 通過maxmemory 配置項來設定允許使用者使用的最大記憶體大小,當記憶體資料集大小達到一定的大小時,就會根據maxmemory policy noeviction配置項配置的策略...
Redis 資料淘汰機制
為了更好的利用記憶體,使redis儲存的都是快取的熱點資料,redis設計了相應的記憶體淘汰機制 也叫做快取淘汰機制 通過maxmemory 配置項來設定允許使用者使用的最大記憶體大小,當記憶體資料集大小達到一定的大小時,就會根據maxmemory policy noeviction配置項配置的策略...