內存回收機制主要體現在兩個方面
1. 刪除過期鍵和鍵對象
2. 內存占用達到maxmemory時(內存溢出)觸發的內存回收策略
### **刪除過期鍵的對象**
1. 惰性刪除 - 根據key獲取value的時候,首先判斷key是否過期,過期的情況下刪除該key和對應的value,并返回nil。
* 節省了CPU消耗
* 存在內存泄漏,過期鍵一直沒被訪問導致內存無法釋放
2. 定時任務刪除 - Redis維護定時任務
### **內存溢出控制策略 - 共6種**
1. noeviction:默認策略,寫入返回錯誤,不會刪除數據。
2. volatile-lru:刪除范圍是全局+過期,根據LRU算法刪除超時的鍵對象,直倒騰出足夠空間。找不到過期的鍵對象時,切換到默認策略
3. allkeys-lru:刪除范圍是全局,根據LRU算法,直倒騰出足夠空間
4. allkeys-random:刪除范圍是全局,隨機刪除
5. volatile-random:刪除范圍是全局+過期,刪除策略是隨機
6. volatile-ttl:刪除范圍是過期,刪除策略是所有最近數據,如果不存在,回退到默認策略
#### 備注
不同內存控制策略表現在數據范圍和刪除策略方面
* 范圍:
1. 全局數據
2. 僅局限在超時數據
* 策略
1. 隨機
2. LRU算法(在數據集合中,剔除熱度最低的數據)
| 策略 | 對應數據范圍 | 內容 |
| --- | --- | --- |
| noeviction | 全局 | 默認策略,寫入數據時返回錯誤 |
| volatile-lru | 過期的鍵對象集合 | 根據LRU算法刪除過期的鍵對象,直倒騰出足夠空間,沒有可刪除對象時切換到默認策略 |
| volatile-random | 過期的鍵對象集合 | 隨機刪除 |
| allkeys-lru | 全局 | 根據LRU算法刪除 |
| allkeys-random | 全局 | 隨機刪除 |
| volatile-ttl | 過期的鍵對象集合 | 根據ttl屬性,刪除最近的數據 |
*****
## **LRU算法實現原理**
