内存回收机制主要体现在两个方面
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算法实现原理**
![](https://box.kancloud.cn/bcf7b7074bb035715f27c8b3305ddeef_759x577.png)