redis 的幾種數據淘汰策略

1.redis 的數據淘汰策略

最爲大家所熟悉的,就是我們在進行 redis 存值的時候,可以針對每個 key-value 設置過期時間,時間到,數據自動刪除。但是,當我們每個 key-value 都設置不過期的話,redis 是不是就會被撐爆了呢?答案是不太會的,爲什麼這樣說?是因爲當我們的 redis 內存達到設置的 maxmemory 的時候,就會使用數據淘汰策略來保證 redis 的高可用性。

redis 的六種淘汰策略:

volatile-lru:從已設置過期的數據中中隨機挑選最近最少使用的多個key進行數據淘汰。
volatile-ttl:從已設置過期的數據中挑選即將要過期的數據進行淘汰。
volatile-random:從已設置過期的數據中任意淘汰數據。
allkeys-lru:從數據集中挑選最近最少使用的數據淘汰。
allkeys-random:從數據集中任意選擇數據淘汰。
noeviction: 不進行刪除,達到最大內存時,直接返回錯誤信息。

以上六點的配置是在 redis 的配置是文件中 maxmemory-policy 來決定具體使用哪種淘汰策略。我們可以根據業務場景的不同使用不同的淘汰策略。

2.redis 數據淘汰策略中的 lru 算法

LRU(less recently used)的意思是最少最近使用的。這種算法在 redis 的淘汰策略中經常遇到,淘汰最少最近使用的數據先淘汰。舉例:比如 redis 中存了三個用戶 張三、李四、王五。張三每天登陸一次系統、李四每兩天登陸一次系統、王五每一週登陸一次系統三者登陸的時候都設置過期時間爲當前時間加一週。當 redis 內存即將要滿的時候,會隨機挑選幾個 key(這裏幾個是根據配置文件中的 maxmemory-samples 配置而定)算出哪個 key 最近最不常使用的 key 進行淘汰。爲什麼不遍歷所有的 key,數量太大的話,佔內存和消耗 CPU 的性能。在 redis3.0 版本進行了優化升級:首先第一次隨機選取的 key 都會放入一個 pool 中 (pool 的大小爲 16),pool 中的 key 是按 lru 大小順序排列的。接下來每次隨機選取的 keylru 值必須小於 pool 中最小的 lru 纔會繼續放入,直到池子滿足 16 個。如果放滿以後的話,每次如果有新的 key 需要放入,就會將 pool 中 lru 最大的一個 key 取出。淘汰的時候,直接從 pool 中選取一個 lru 最小的值然後將其淘汰。

3. 總結

由上面分析我們可以知道,redis 的幾種淘汰策略的使用和在特定場景下使用特定的淘汰策略。

在這裏我們需要說明:即使我們設置了過期時間,但是當數據量大的時候,redis 是每 100ms 隨機取出幾個 key 判斷有沒有過期,如果過期的話進行刪除。還有就是我們在取數據的時候先判斷這個 key 有沒有過期,過期的話進行刪除。因爲,數據量太大,不可能遍歷所有 key-value,這樣會影響系統性能。所以說:當我們有大量的 key 在同一時間過期的話,如果內存佔比沒有下降的話,不用擔心,這是 redis 設置機制的問題。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/xojw9O7BOecFLqTuQ3iqyg