前言:這八種算法是基於redis5.0版之後的,他新增了新增allkeys-lfu,volatile-lfu這兩種算法,也就是多了LFU算法,而LFU與LRU算法不同在於;LRU是淘汰最近最長時間未使用的頁面進行淘汰,而LFU是要求在頁置換時置換引用計數最小的頁,因爲經常使用的頁應該有一個較大的引用次數。但是有些頁在開始時使用次數很多,但以後就不再使用,這類頁將會長時間留在內存中,因此可以將引用計數寄存器定時右移一位,形成指數衰減的平均使用次數。
1. Redis內存策略
1.1 內存使用情況說明
Redis將數據都保存到內存中,如果一直往內存中存儲數據,而不維護.將來可能導致內存數據存不下.內存溢出.
-
1.主動淘汰
在redis賦值操作執行時,可以添加超時時間.當時間一到則數據自動刪除. -
2.採用算法進行淘汰
1.2 Redis中內存優化算法
1.2.1LRU算法
LRU是Least Recently Used的縮寫,即最近最少使用,是一種常用的頁面置換算法,選擇最近最久未使用的頁面予以淘汰。該算法賦予每個頁面一個訪問字段,用來記錄一個頁面自上次被訪問以來所經歷的時間 t,當須淘汰一個頁面時,選擇現有頁面中其 t 值最大的,即最近最少使用的頁面予以淘汰。
以時間T爲維度,刪除不使用的數據,實現內存的清空。
1.2.2LFU算法
LFU(least frequently used (LFU) page-replacement algorithm)。即最不經常使用頁置換算法,要求在頁置換時置換引用計數最小的頁,因爲經常使用的頁應該有一個較大的引用次數。但是有些頁在開始時使用次數很多,但以後就不再使用,這類頁將會長時間留在內存中,因此可以將引用計數寄存器定時右移一位,形成指數衰減的平均使用次數。
1.2.3具體八種算法
-
1.volatile-lru 設定了超時時間數據,之後採用LRU算法進行刪除.
-
2.allkeys-lru 全部數據,採用LRU算法進行內存數據的優化.
-
3.volatile-lfu 設定了超時時間的數據,採用LFU算法進行刪除
-
4.allkeys-lfu 所有的數據採用LFU算法實現數據刪除.
-
5.volatile-random 爲設定超時時間的數據採用隨機算法.
-
6.allkeys-random 所有數據採用隨機算法實現刪除.
-
7.volatile-ttl 將所有設定了超時時間的數據,利用ttl方式進行排序,將還沒有超時的數據提前刪除.
-
8.noeviction (默認策略)不採用任何的算法刪除數據.如果將來內存溢出則報錯返回.
1.2.4修改redis內存策略
設定redis中的內存優化策略.
597 maxmemory-policy volatile-lru
608 maxmemory-samples 5 lru算法取值個數
問題:如果redis中有100萬的數據,都要採用LRU算法進行優化,則計算100萬數據的時間性能太低了.
優化:隨機篩選5個數據. 在5個數據中執行lru算法.優化1個數據.
一般默認值爲5,表示性能最優.篩選的個數可以調整 最大不要超過10.
據官方的統計,如果篩選的個數爲10 ,則接近真實的LRU算法.但是會增加內存的開銷.