筆者在線上使用redis緩存的時候發現即使某些查詢已經設置了無過期時間的緩存,但是查詢仍然非常耗時。經過排查,發現緩存確實已經不存在,導致了緩存擊穿,查詢直接訪問了mysql數據庫。因為我們用的是公司公共的redis緩存服務器,在和運維人員交流后發現可能是redis的內存淘汰策略引起。
1. 什么是內存淘汰
redis是基于內存的key-value數據庫,內存是有限的寶貴資源,當內存耗盡的時候,redis有如下5種處理方式來應對
No-eviction
在該策略下,如果繼續向redis中添加數據,那么redis會直接返回錯誤
Allkeys-lru
從所有的key中使用LRU算法進行淘汰
Volatile-lru
從設置了過期時間的key中使用LRU算法進行淘汰
Allkeys-random
從所有key中隨機淘汰數據
Volatile-random
從設置了過期時間的key中隨機淘汰
Volatile-ttl
從設置了過期時間的key中,選擇剩余存活時間最短的key進行淘汰
除上述6種淘汰策略外,Redis 4.0新增了兩種淘汰策略
Volatile-lfu
從設置了過期時間的key中選擇key進行淘汰
Allkeys-lfu
從所有的key中使用lfu進行淘汰
2. 內存淘汰算法選擇
上述總共談到了8種內存淘汰策略,但是如何選擇呢?
從緩存類型來說,其中名稱中帶volatile的策略確定了被淘汰的緩存僅從設置了過期時間的key中選擇,如果沒有任何key被設置過期時間,那么Volatile-lru,Vol