Redis系列1:深刻理解高效能Redis的本質
Redis系列2:資料持久化提高可用性
Redis系列3:高可用之主從架構
Redis系列4:高可用之Sentinel(哨兵模式)
Redis系列5:深入分析Cluster 叢集模式
追求效能極致:Redis6.0的多執行緒模型
追求效能極致:使用者端快取帶來的革命
Redis系列8:Bitmap實現億萬級資料計算
Redis系列9:Geo 型別賦能億級地圖位置計算
Redis系列10:HyperLogLog實現海量資料基數統計
通過前面的一些文章我們知道,Redis的各項能力是基於記憶體實現的,相對其他的持久化儲存(如MySQL、File等,資料持久化在磁碟上),效能會高很多,這也是快取記憶體的一個優勢。
但是問題來了,每一臺機器記憶體終歸是有限的,即使是叢集模式,總的記憶體空間也是有限的,不能無限制的消耗。而在Redis的使用過程中,很有可能出現使用消耗超過記憶體實際大小的情況。比如以下幾種情況:
所以,如果放任上面的那幾種情況,記憶體終歸會滿的,Redis自身有一套比較完善的記憶體淘汰策略來專門應對這個問題,在Redis Memory佔用超過我們設定的閾值的時候觸發策略執行。
# redis.conf 設定最大記憶體空間佔用為2gb,超過則執行記憶體淘汰策略
redis > CONFIG SET maxmemory 2gb
記憶體淘汰策略一共有8中,除了一種不執行淘汰策略之外,其他7種都是按照各自不一的演演算法對記憶體中現有的資料進行處理。
我們下面詳細來看一下這些淘汰策略,把他們分成三大類,8小類來逐一講解:
noeviction指的是即使資源超過 maxmemory 限制的值也不會執行淘汰,只是不允許建立新的快取了。
當Redis記憶體佔用達到我們上面的設定的閾值(比如 5gb)之後,就不允許新增快取key了,當有新的快取要建立的時候,Redis 直接返回error。
這邊僅針對設定了過期時間的資料進行淘汰
LRU(Least Recently Used)是按照最近最少使用原則來篩選資料,即最不常用的資料會被篩選出來。
如果我們的服務中有冷熱資料隔離需求,這無疑是一個比較好的辦法。可以將快取的一些不經常使用的冷資料,而且資料size比較大的,篩選出來清理掉。而近期頻繁被使用的key就被保留下來了。
常見的場景如下:
LRU演演算法的不足之處在於,一個本身很少被存取的key,只是剛剛被存取了1次,就被認為是最近有使用的熱點資料,導致短時間內不會被淘汰。
而LFU彌補了這個不足,LFU(Least Frequently Used)淘汰策略會根據key的最近存取頻率進行淘汰,解決上面說的這個不足。
常見的應用場景:
針對有設定過期時間,但沒有明顯的冷熱存取頻率區別,所有的查詢分佈比較均衡的資料。這時候就使用 allkeys-random 策略吧,讓它隨機選擇需要淘汰資料,也相對公平。
常見的使用場景有:
這個特性僅限於設定過期時間的場景,它是根據當前時間 跟 過期時間的差額進行由短到長的排序,較短的優先淘汰。
asc_sort(validate_time - current_time)
這種演演算法相對來說也不考慮快取的存取頻率和重要程度,僅按照建立的先後進行清理,越早的快取越早清理。
所以不具備明顯特徵的業務場景都適用。
業務場景有一些資料始終不需要刪除,比如置頂新聞、視訊,還有我們自己置頂的weibo。為了保障它們不被清理掉,就給這些資料不設定過期時間,這樣的話 volatile型別的淘汰策略就不會影響了。但如果是 allkeys 開頭的策略依舊會影響到。
無論是否設定了過期時間的資料均可進行淘汰。
從微服務拆分的角度說,不同的服務型別個方向的服務進行院子隔離會比較一點。這一點設計思維在快取上依舊適用。
我們可以將不需要過期時間的快取資訊 和 需強制設定過期時間的快取key分開。針對業務場景分別使用 volatile-xx策略 和 allkyes-xxx策略。
保留最近有使用的key,類似volatile-lru
最不經常使用的,類似volatile-lfu
無差別隨機刪除,volatile-random,為新增新資料騰出空間
# 獲取當前記憶體淘汰策略
redis > config get maxmemory-policy
# 獲取Redis能使用的最大記憶體大小:如果不設定最大記憶體大小或者設定最大記憶體大小為0,在64位元作業系統下不限制記憶體大小,在32位元作業系統下最多使用3GB記憶體。
redis > config get maxmemory
# 通過命令設定淘汰策略
redis > config set maxmemory-policy volatile-lru
# 設定Redis最大佔用記憶體大小,這邊最大佔用記憶體大小設定為2000M
redis > config set maxmemory 2000mb
一張圖總結