將redis用作快取時,如果記憶體空間用滿,就會自動驅逐老的資料。預設情況下 memcached就是這就方式。
lru是redis唯一支援的**演算法,本文講解限制最大記憶體使用量的maxmemory指令,並深入講解redis所使用的近似lru演算法。
maxmemory用於指定redis能使用的最大記憶體。既可以在redis.conf檔案中設定,也可以在執行過程中通過config set命令動態修改。
如:config set maxmemory 200mb
比如,要設定100mb的記憶體限制,可以在redis.conf中設定
將maxmemory設定為0,則表示不進行記憶體限制。
當記憶體使用達到最大限制時,如果需要儲存新資料,根據配置的策略的不同,redis可能直接返回錯誤資訊,或者刪除部分老的資料。根據maxmemory-policy配置的策略,來決定具體的行為。redis.conf配置如下:
allkeys-lru:所有key通用;優先刪除最少(less recently used, lru)使用的key
volatile-lru:只限於設定了expire的部分;優先刪除最近最少使用的key。
allkeys-random:所有key通用;隨機刪除一部分key.
volatile-random:只限於設定了expire的部分;隨機刪除一部分key
volatile-ttl:只限於設定了expire的部分;優先刪除剩餘時間(time to live, ttl)短的key
如果沒有設定expire的key,不滿足先決條件;則volatile-lru、volatile-random、volatile-ttl策略的行為和noeviction基本一致
設定淘汰策略時需要根據系統的特徵選擇合適的策略,在執行時也可以通過命令動態設定驅逐策略,並通過info命令監控快取的miss和hit來進行調優。
一般來說:
(1)如果分為熱資料與冷資料,推薦使用allkey-lru策略。也就是,其中一部分key經常被讀寫。如果不確定具體的業務特徵,那麼allkeys-lru時乙個很好的選擇。
(2)如果需要迴圈讀寫所有的key,或者各個key的訪問頻率差不多,可以使用allkeys-random策略,即讀寫所有元素的概率差不多。
(3)假如要讓redis根據ttl來篩選需要刪除的key,使用volatile-ttl策略
volatile-lru和volatile-random策略只要應用場景是:既有快取,又有持久key的例項中。
驅逐的內部實現
驅逐過程可以理解為:
客戶端執行乙個命令,導致redis中的資料增加,占用更多記憶體。
redis檢查記憶體使用量,如果超出maxmemory限制,根據策略清除部分key
繼續執行下一條命令,以此類推。
近似lru演算法
redis使用的並不是完全lru演算法。自動驅逐的key,並不一定是最滿足lru特徵的那個。而是通過近似lru演算法,抽取少量的key樣本,然後刪除其中訪問時間最老的那個key。
在redis中可以通過修改redis.conf檔案中的如下配置,修改樣本數量來調優演算法精度。
Redis六種淘汰策略
將 redis 用作快取時,如果記憶體空間用滿,就會自動驅逐老的資料。預設情況下 memcached 就是這種方式,大部分開發者都比較熟悉。lru是redis唯一支援的 演算法.本文詳細介紹用於限制最大記憶體使用量的 maxmemory 指令,並深入講解 redis 所使用的近似lru演算法。max...
Redis的六種淘汰策略
將 redis 用作快取時,如果記憶體空間用滿,就會自動驅逐老的資料,淘汰那些老的或者不常用的部分keys,以保證新的資料寫入成功。maxmemory配置指令 maxmemory配置指令用於配置redis儲存資料時指定限制的記憶體大小。通過redis.conf可以設定該指令,或者之後使用config...
配置Redis作為快取(六種淘汰策略)
將 redis 用作快取時,如果記憶體空間用滿,就會自動驅逐老的資料。預設情況下 memcached 就是這種方式,大部分開發者都比較熟悉。lru是redis唯一支援的 演算法.本文詳細介紹用於限制最大記憶體使用量的maxmemory指令,並深入講解 redis 所使用的近似lru演算法。maxme...