Redis的內存回收機制主要體如今一下兩個方面:算法
- 刪除過時鍵對象
:多行刪除用於當客戶端讀取帶有超市屬性的鍵時,若是已經超過鍵設置的過時時間,會執行刪除操做並返回空。數據庫
2.定時任務刪除dom
:Redis內部維護一個定時任務,默認每秒運行10次。定時任務中刪除過時鍵邏輯採用了自適應算法,根據鍵的過時比例,使用快慢兩種速率回收鍵,流程以下:對象
流程說明:事件
- 定時任務在每一個數據庫空間隨機檢查20個鍵,當發現過時時刪除對應的鍵
- 若是超過檢查書的25%的鍵過時,循環執行回收邏輯知道不足25%或運行超時爲止,慢模式下超時時間爲25毫秒
- 若是以前回收鍵邏輯超時,則在Redis觸發內部事件以前再次以快模式運行回收過時鍵任務,快模式下超時時間爲1毫秒且2秒內只能運行1次
- 快慢兩種模式內部刪除邏輯相同,只是執行的超時時間不一樣。
- 內存使用到達maxmemory上限時觸發內存溢出控制策略
當Redis所用內存打到maxmemory上限時會觸發響應的溢出控制策略,具體策略受maxmemory-policy參數控制,Redis支持6中策略,以下所示:內存
- noeviction:默認策略,不會刪除任何數據,拒絕全部寫入操做並返回客戶端錯誤信息,此時Redis只響應讀操做。
- volatitle-rlu:根據LRU算法刪除設置了超時屬性的鍵,知道騰出足夠空間爲止。若是沒有可刪除的鍵對象,回退到noeviction策略。
- allkeys-lru:根據LRU算法刪除鍵,無論數據有沒有設置超時屬性,直到騰出足夠空間爲止。
- allkeys-random:隨機刪除全部鍵,知道騰出足夠空間爲止。
- volatitle-random:隨機刪除過時鍵,知道騰出足夠空間爲止。
- volatitle-ttl:根據鍵值對象的ttl屬性,刪除最近將要過時數據。若是沒有,回退到noeviction策略