將Redis用作快取時, 如果記憶體空間用滿, 就會自動驅逐老的資料。預設情況下memcached就是這種方式, 大部分開發者都比較熟悉。 LRU是Redis唯一支援的回收演算法.
#驅逐策略(建議學習:Redis影片教學)
達到最大記憶體限制時(maxmemory), Redis 根據maxmemory-policy 配置的策略, 來決定具體的行為。
目前版本,Redis 3.0 支援的策略包括:
#noeviction: 不刪除策略, 達到最大記憶體限制時, 如果需要更多記憶體, 直接傳回錯誤訊息。大多數寫指令都會導致佔用更多的記憶體(有極少數會例外, 如 DEL )。
allkeys-lru: 所有key通用; 優先刪除最近最少使用(less recently used ,LRU) 的 key。
volatile-lru: 只限於設定了 expire 的部分; 優先刪除最近最少使用(less recently used ,LRU) 的 key。
allkeys-random: 所有key通用; 隨機刪除一部分 key。
volatile-random: 只限於設定了 expire 的部分; 隨機刪除一部分 key。
volatile-ttl: 只限於設定了 expire 的部分; 優先刪除剩餘時間(time to live,TTL) 短的key。
如果沒有設定 expire 的key, 不滿足先決條件(prerequisites); 那麼 volatile-lru, volatile-random 和 volatile-ttl 策略的行為, 和 noeviction(不刪除) 基本上一致。
您需要根據系統的特徵, 來選擇合適的驅逐策略。當然, 在運行過程中也可以透過命令動態設定驅逐策略, 並透過 INFO 指令監控快取的 miss 和 hit, 來進行調優。
一般來說:
如果分為熱資料與冷資料, 建議使用 allkeys-lru 策略。也就是, 其中一部分key經常被讀寫. 如果不確定具體的業務特徵, 那麼 allkeys-lru 是一個很好的選擇。
如果需要循環讀寫所有的key, 或各個key的存取頻率差不多, 可以使用 allkeys-random 策略, 即讀寫所有元素的機率差不多。
假如要讓 Redis 根據 TTL 來篩選需要刪除的key, 請使用 volatile-ttl 策略。
volatile-lru 和 volatile-random 策略主要應用場景是: 既有快取,又有持久key的實例中。一般來說, 像這類場景, 應該使用兩個單獨的 Redis 實例。
值得一提的是, 設定 expire 會消耗額外的記憶體, 所以使用 allkeys-lru 策略, 可以更有效率地利用記憶體, 因為這樣就可以不再設定過期時間了。
更多Redis相關技術文章,請造訪Redis資料庫使用入門教學欄位學習!
以上是redis快取策略哪幾種的詳細內容。更多資訊請關注PHP中文網其他相關文章!