淺談Redis中的內存淘汰策略和過期鍵刪除策略

redis是我們現在最常用的一個工具,幫助我們建設系統的高可用,高性能。

而且我們都知道redis是一個完全基於內存的工具,這也是redis速度快的一個原因,當我們往redis中不斷緩存數據的時候,其內存總有滿的時候(而且內存是很貴的東西,盡量省著點用),所以盡可能把有用的數據,或者使用頻繁的數據緩存在redis中,物盡其用。

那麼如果正在使用的redis內存用完瞭,我們應該怎麼取舍redis中已存在的數據和即將要存入的數據呢,我們要怎麼處理呢?

redis官方提供瞭8種不同的淘汰策略

redis.conf 是個好東西,幾乎redis的所有配置都可以在這裡找到,根據conf中的說明也就能操作瞭

我們看下redis.conf中關於8中淘汰策略的說明(本文使用redis版本是4.0.9)

volatile-lru -> Evict using approximated LRU among the keys with an expire set.
allkeys-lru -> Evict any key using approximated LRU.
volatile-lfu -> Evict using approximated LFU among the keys with an expire set.
allkeys-lfu -> Evict any key using approximated LFU.
volatile-random -> Remove a random key among the ones with an expire set.
allkeys-random -> Remove a random key, any key.
volatile-ttl -> Remove the key with the nearest expire time (minor TTL)
noeviction -> Don't evict anything, just return an error on write operations.

# LRU means Least Recently Used(最近最少使用的,時間)
# LFU means Least Frequently Used(最不經常使用的,次數)
# The default is:
maxmemory-policy noeviction

上文是從redis.conf中摘出來關於淘汰策略的8種配置以及設置說明,其中maxmemory-policy noeviction 代表瞭淘汰策略默認的是noeviction,我們可以根據自己的業務需求修改合適的策略。
英文看不懂的看下面的中文

8種淘汰策略

  • volatile-lru:在設置過期時間的數據中淘汰最少使用的數據。
  • allkeys-lru:在所有的數據中淘汰最少使用的數據。
  • volatile-lfu:在設置過期時間的數據中淘汰使用頻率最低的數據。
  • allkeys-lfu:在所有的數據中淘汰使用使用頻率最低的數據。
  • volatile-random:在設置過期時間的數據中淘汰任意隨機數據。
  • allkeys-random:在所有的數據中隨機淘汰數據。
  • volatile-ttl:在設置過期時間的數據中淘汰最早過期的數據。
  • noeviction:默認策略,不淘汰數據,新增或者修改數據會拋異常,但是讀操作正常進行,不受影響

上面是內存不足的淘汰策略,還有一種是過期鍵的刪除策略,兩者是不同,不要搞混瞭

過期鍵的刪除策略

  • 定時過期:每個設置過期時間的key都需要創建一個定時器,到過期時間就會立即清除。該策略可以立即清除過期的數據,對內存很友好;但是會占用大量的CPU資源去處理過期的數據,從而影響緩存的響應時間和吞吐量。
  • 惰性過期:隻有當訪問一個key時,才會判斷該key是否已過期,過期則清除。該策略可以最大化地節省CPU資源,卻對內存非常不友好。極端情況可能出現大量的過期key沒有再次被訪問,從而不會被清除,占用大量內存。
  • 定期過期:每隔一定的時間,會掃描一定數量的數據庫的expires字典中一定數量的key,並清除其中已過期的key。該策略是前兩者的一個折中方案。通過調整定時掃描的時間間隔和每次掃描的限定耗時,可以在不同情況下使得CPU和內存資源達到最優的平衡效果。

expires字典會保存所有設置瞭過期時間的key的過期時間數據,其中,
key是指向鍵空間中的某個鍵的指針,
value是該鍵的毫秒精度的UNIX時間戳表示的過期時間。
鍵空間是指該Redis集群中保存的所有鍵。

總結

Redis的內存淘汰策略的選取並不會影響過期的key的處理。內存淘汰策略用於處理內存不足時的需要申請額外空間的數據;過期策略用於處理過期的緩存數據。

到此這篇關於淺談Redis中的內存淘汰策略和過期鍵刪除策略的文章就介紹到這瞭,更多相關Redis內存淘汰和過期鍵刪除內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: