淺析Redis緩存中的8種淘汰策略

本篇文章帶大家來聊聊redis緩存中的8種淘汰策略,看看應該怎么使用它們,希望對大家有所幫助!

淺析Redis緩存中的8種淘汰策略

我們知道redis緩存使用內存來保存數據,但內存大小畢竟有限,隨著要緩存的數據量越來越大,有限的緩存空間不可避免地會被寫滿。這時候就需要緩存的淘汰策略去刪除數據。【相關推薦:redis

Redis緩存的淘汰策略

Redis的淘汰策略,根據是否會進行數據淘汰可以把它們分成兩類:

  • 不進行數據淘汰的策略,只有 noeviction 這一種。
  • 會進行淘汰的 7 種其他策略。

會進行淘汰的 7 種策略,我們可以再進一步根據淘汰候選數據集的范圍把它們分成兩類:

  • 在設置了過期時間的數據中進行淘汰,包括 volatile-random、volatile-ttl、volatile-lru、volatile-lfu(Redis 4.0 后新增)四種。

  • 在所有數據范圍內進行淘汰,包括 allkeys-lru、allkeys-random、allkeys-lfu(Redis 4.0 后新增)三種。

淺析Redis緩存中的8種淘汰策略

redis3.0之前,默認是volatile-lru;在redis3.0之后(包括3.0),默認淘汰策略則是noeviction

noeviction 策略

noeviction表示不淘汰數據,當緩存數據滿了,有新的寫請求進來,Redis不再提供服務,而是直接返回錯誤。

根據過期時間的淘汰策略

volatile-random、volatile-ttl、volatile-lru、volatile-lfu 四種策略是針對已經設置了過期時間的鍵值對。到鍵值對的到期時間到了或者Redis內存使用量達到了maxmemory閾值,Redis會根據這些策略對鍵值對進行淘汰;

  • volatile-ttl 在篩選時,會針對設置了過期時間的鍵值對,根據過期時間的先后進行刪除,越早過期的越先被刪除。
  • volatile-random 就像它的名稱一樣,在設置了過期時間的鍵值對中,進行隨機刪除。
  • volatile-lru 會使用 LRU 算法篩選設置了過期時間的鍵值對。
  • volatile-lfu 會使用 LFU 算法選擇設置了過期時間的鍵值對。

所有數據范圍內的淘汰策略

allkeys-lru、allkeys-random、allkeys-lfu 這三種策略淘汰的數據范圍擴大到所有的鍵值對,無論這些鍵值對是否設置了過期時間,篩選數據進行淘汰的規則是:

  • allkeys-random 策略,從所有鍵值對中隨機選擇并刪除數據;

  • allkeys-lru 策略,使用 LRU 算法在所有數據中進行篩選。

  • allkeys-lfu 策略,使用 LFU 算法在所有數據中進行篩選。

關于LRU算法

LRU算法即是最近最常使用算法,由于LRU會使用一個鏈表去維護使用的數據列表,當使用的數據越多,其移動元素時就會越耗時,這不可避免地會影響到Redis主線程。為此Redis對lru算法做了些簡化。

LRU 策略的核心思想:如果一個數據剛剛被訪問,那么這個數據肯定是熱數據,還會被再次訪問。

按照這個核心思想,Redis 中的 LRU 策略,會在每個數據對應的 RedisObject 結構體中設置一個 lru 字段,用來記錄數據的訪問時間戳。在進行數據淘汰時,LRU 策略會在候選數據集中淘汰掉 lru 字段值最小的數據(也就是訪問時間最久的數據)。

所以,在數據被頻繁訪問的業務場景中,LRU 策略的確能有效留存訪問時間最近的數據。而且,因為留存的這些數據還會被再次訪問,所以又可以提升業務應用的訪問速度。

具體做法是,在訪問鍵值對時,redis會記錄最近一次訪問的時間戳。在redis決定淘汰數據時,會隨機挑選N個數據,把它們作為一個候選集合,把最小的時間戳給篩選出去。當下一次要淘汰數據時,會挑選比第一次挑選的候選集合時間戳值要小的數據進入新的候選集合。當數據達到maxmemory-samples 時,將最小的值給淘汰掉。

通過該命令可以設置挑選的候選集合數CONFIG SET maxmemory-samples N

使用建議

依據策略的特性,可以針對不同場景選擇不同的策略去淘汰數據。

  • 當緩存數據沒有明顯的冷熱之分,即數據的訪問頻率差距不大,建議使用allkeys-random 隨機策略淘汰數據;
  • 當數據有明顯的冷熱之分,建議使用allkeys-lru 或者volatile-lru 算法,將最近最常訪問的數據留在緩存數據中;
  • 當業務中存在置頂需求,即不會過期的數據,這類一般不會設置過期時間,可以采用volatile-lru策略。這樣這類數據就不會被淘汰,而其它數據可以根據lru規則進行淘汰。

更多編程相關知識,請訪問:redis!!

? 版權聲明
THE END
喜歡就支持一下吧
點贊6 分享