Redis内存回收策略
Redis 也會因為內存不足而產生錯誤,也可能因為回收過久而導致系統(tǒng)長期的停頓,因此掌握執(zhí)行回收策略十分有必要。在 Redis 的配置文件中,當 Redis 的內存達到規(guī)定的最大值時,允許配置 6 種策略中的一種進行淘汰鍵值,并且將一些鍵值對進行回收,讓我們來看看它們的特點。
首先,Redis 的配置文件放在 Redis 的安裝目錄下,在 Windows 中是 redis.windows.conf,在 Lunix/Unix 中則是 redis.conf。Redis 對其中的一個配置項——maxmemory-policy,提供了這樣的一段描述:
# volatile-lru -> remove the key with an expire set using an LRU algorithm # allkeys-lru -> remove any key according to the LRU algorithm # volatile-random -> remove a random key 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 expire at all, just return an error on write operations進一步理解。
maxmemory-policy 說明
| volatile-lru | 采用最近使用最少的淘汰策略,Redis 將回收那些超時的(僅僅是超時的)鍵值對,也就是它只淘汰那些超時的鍵值對。 |
| allkeys-lru | 采用淘汰最少使用的策略,Redis 將對所有的(不僅僅是超時的)鍵值對采用最近使用最少的淘汰策略。 |
| volatile-random | 采用隨機淘汰策略刪除超時的(僅僅是超時的)鍵值對。 |
| allkeys-random | 采用隨機淘汰策略刪除所有的(不僅僅是超時的)鍵值對,這個策略不常用。 |
| volatile-ttl | 采用刪除存活時間最短的鍵值對策略。 |
| noeviction | 根本就不淘汰任何鍵值對,當內存已滿時,如果做讀操作,例如 get 命令,它將正常工作,而做寫操作,它將返回錯誤。也就是說,當 Redis 采用這個策略內存達到最大的時候,它就只能讀而不能寫了。 |
Redis 在默認情況下會采用 noeviction 策略。換句話說,如果內存已滿,則不再提供寫入操作,而只提供讀取操作。顯然這往往并不能滿足我們的要求,因為對于互聯(lián)網系統(tǒng)而言,常常會涉及數以百萬甚至更多的用戶,所以往往需要設置回收策略。
這里需要指出的是:LRU 算法或者 TTL 算法都是不是很精確算法,而是一個近似的算法。Redis 不會通過對全部的鍵值對進行比較來確定最精確的時間值,從而確定刪除哪個鍵值對,因為這將消耗太多的時間,導致回收垃圾執(zhí)行的時間太長,造成服務停頓。
而在 Redis 的默認配置文件中,存在著參數 maxmemory-samples,它的默認值為 3,假設采取了 volatile-ttl 算法,讓我們去了解這樣的一個回收的過程,假設當前有 5 個即將超時的鍵值對,如下表所示。
volatile-ttl 樣本刪除方式
由于配置 maxmemory-samples 的值為 3,如果 Redis 是按表中的順序探測,那么它只會取到樣本 A1、A2、A3,然后進行比較,因為 A2 過期剩余秒數最少,所以決定淘汰 A2,因此 A2 是最先被刪除的。
注意:此時即將過期且剩余超時秒數最短的 A4 卻還在內存中,因為它不屬于探測樣本。這就是 Redis 中采用的近似算法。當設置 maxmemory-samples 越大,則 Redis 刪除的就越精確,但是與此同時帶來不利的是,Redis 也就需要花更多的時間去計算和匹配更為精確的值。
回收超時策略的缺點是必須指明超時的鍵值對,這會給程序開發(fā)帶來一些設置超時的代碼,無疑增加了開發(fā)者的工作量。
對所有的鍵值對進行回收,有可能把正在使用的鍵值對刪掉,增加了存儲的不穩(wěn)定性。對于垃圾回收的策略,還需要注意的是回收的時間,因為在 Redis 對垃圾的回收期間,會造成系統(tǒng)緩慢。
因此,控制其回收時間有一定好處,只是這個時間不能過短或過長。過短則會造成回收次數過于頻繁,過長則導致系統(tǒng)單次垃圾回收停頓時間過長,都不利于系統(tǒng)的穩(wěn)定性。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Redis内存回收策略的全部內容,希望文章能夠幫你解決所遇到的問題。