Redis快取逐出策略

2021-08-17 17:47:55 字數 1820 閱讀 7869

把 redis 當做快取使用時,有時你可以方便的讓它在新資料時自動逐出舊資料。這一點大家都比較清楚,因為 memcached 預設也會這麼幹。redis 僅支援 lru 逐出策略。下文主要講述 redis maxmemory 指令,這個指令用於限定記憶體使用量,以及講述了redis 使用到的 lru 演算法,這是一種近似lru演算法。

maxmemory 指令用於限定記憶體使用量。可以在 redis.conf 檔案中設定,也可以通過 config set 命令在執行時設定。例如在 redis.conf 檔案中新增如下指令將記憶體限定在 100m 以內maxmemory 100mb。

設定成 0 時表示無限制。64位系統下預設無限制,32位系統則強制指定為 3gb

當記憶體使用達到限定值時,可以選擇幾種不同的策略。例如 redis 可以在呼叫指令時直接返回錯誤(這些指令會導致更多記憶體使用),或者是逐出老資料,給新資料納出空間,讓記憶體占用保持在限定一下。

具體的逐出策略通過 maxmemory-policy 指令進行配置,主要有如下策略:

noeviction:當記憶體使用達到閾值的時候,所有引起申請記憶體的命令會報錯。

allkeys-lru:在主鍵空間中,優先移除最近未使用的key。

volatile-lru:在設定了過期時間的鍵空間中,優先移除最近未使用的key。

allkeys-random:在主鍵空間中,隨機移除某個key。

volatile-random:在設定了過期時間的鍵空間中,隨機移除某個key。

volatile-ttl:在設定了過期時間的鍵空間中,具有更早過期時間的key優先移除。

volatile-* 系列指令在無鍵值滿足條件時(例如未設定過期時間),表現為 noeviction

這裡補充一下主鍵空間和設定了過期時間的鍵空間,舉個例子,假設我們有一批鍵儲存在redis中,則有那麼乙個雜湊表用於儲存這批鍵及其值,如果這批鍵中有一部分設定了過期時間,那麼這批鍵還會被儲存到另外乙個雜湊表中,這個雜湊表中的值對應的是鍵被設定的過期時間。設定了過期時間的鍵空間為主鍵空間的子集。

我們了解了redis大概提供了這麼幾種淘汰策略,那麼如何選擇呢?淘汰策略的選擇可以通過下面的配置指定: # maxmemory-policy noeviction

但是這個值填什麼呢?為解決這個問題,我們需要了解我們的應用請求對於redis中儲存的資料集的訪問方式以及我們的訴求是什麼。同時redis也支援runtime修改淘汰策略,這使得我們不需要重啟redis例項而實時的調整記憶體淘汰策略。

另外,volatile-lru策略和volatile-random策略適合我們將乙個redis例項既應用於快取和又應用於持久化儲存的時候,然而我們也可以通過使用兩個redis例項來達到相同的效果,值得一提的是將key設定過期時間實際上會消耗更多的記憶體,因此我們建議使用allkeys-lru策略從而更有效率的使用記憶體。

最好從以下幾個方面來了解逐出過程

客戶端執行了乙個消耗記憶體的指令;

redis 檢查記憶體占用後發現超限,執行逐出策略;

執行乙個新的指令,如此迴圈;

即反覆的讓 redis 的記憶體占用在限定值上下波動,來觀察和驗證逐出策略;

當乙個指令消耗較多記憶體時,一定時間範圍內可以觀察到明顯的記憶體超限;

redis 使用的 lru 演算法是乙個近似實現,即逐出key並不一定真正訪問最少的鍵。它採用的方式是,對逐出範圍內的鍵進行取樣,然後對樣本進行逐出。什麼鬼。

在 redis 3.0中有了一些改進,在提公升效能的同時,讓近似lru的結果更加接近真實lru。

redis lru挺重要的一點是,你可以調整演算法精度,即調整每次逐出時的取樣數。可以通過這個指令進行調整:

redis 使用 近似lru 的目的主要還是為了節省記憶體,對於應用來說,近似與真實,實際上是等效的。

Redis 刪除策略與逐出演算法

逐出演算法 參考 優點 節約記憶體,到時就刪除,快速釋放掉不必要的記憶體占用 缺點 cpu壓力很大,無論cpu此時負載量多高,均占用cpu,會影響redis伺服器響應時間和指令吞吐量 總結 用處理器效能換取儲存空間 拿時間換空間 優點 節約cpu效能,發現必須刪除的時候才刪除 缺點 記憶體壓力很大,...

Redis刪除策略和逐出演算法

redis中的資料特徵 redis是一種記憶體級資料庫,所有資料均存放在記憶體中,記憶體中的資料可以通過ttl指令獲取其狀態 xx 具有時效性的資料 1 永久有效的資料 2 已經過期的資料 或 被刪除的資料 或 未定義的資料 資料刪除策略 1.定時刪除 2.惰性刪除 3.定期刪除 時效性資料的儲存結...

Redis入門 刪除策略與逐出演算法

redis是一種記憶體級別的資料庫,所有資料均存放在記憶體中。redis中資料可分為具有時效性的資料 永久有效的資料 已經 過期的資料或被刪除的資料或未定義的資料。我們可以通過redis的ttl指令查詢資料的狀態 xx 具有時效性的資料 1 永久有效的資料 2 已經過期的資料 或 被刪除的資料 或未...