|
|
|
@ -368,8 +368,6 @@ expires字典会保存所有设置了过期时间的key的过期时间数据,
|
|
|
|
|
|
|
|
|
|
## 内存淘汰策略
|
|
|
|
|
|
|
|
|
|
Redis达到最大内存限制时(`maxmemory`),Redis根据配置文件redis.conf中配置的 `maxmemory-policy` 的策略,来决定具体的行为。
|
|
|
|
|
|
|
|
|
|
```properties
|
|
|
|
|
# 配置最大内存限制
|
|
|
|
|
maxmemory 1000mb
|
|
|
|
@ -377,16 +375,33 @@ maxmemory 1000mb
|
|
|
|
|
maxmemory-policy volatile-lru
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
支持的淘汰策略包括:
|
|
|
|
|
当达到内存使用上限超过`maxmemory`时,可在配置文件`redis.conf`中指定 `maxmemory-policy` 的清理缓存:
|
|
|
|
|
|
|
|
|
|
- `volatile-lru`:从已设置过期时间的数据集中挑选**最近最少使用**的数据淘汰(淘汰**最长时间**没有被使用)
|
|
|
|
|
- `volatile-lfu`:从已设置过期时间的数据集中挑选某段时间内**最近最不经常**的数据淘汰(淘汰一段时间内**使用次数**最少)
|
|
|
|
|
- `volatile-ttl`:从已设置过期时间的数据集中挑选**将要过期**的数据淘汰
|
|
|
|
|
- `volatile-random`:从已设置过期时间的数据集中**任意选择**数据淘汰
|
|
|
|
|
- `allkeys-lru`:从所有数据集中挑选**最近最少使用**的数据淘汰
|
|
|
|
|
- `allkeys-lfu`:从所有数据集中选择某段时间内内**最近最不经常**的数据淘汰
|
|
|
|
|
- `allkeys-random`:从所有数据集中**任意选择数**据淘汰
|
|
|
|
|
- `noenviction(驱逐)`:当达到最大内存时直接返回错误,不覆盖或逐出任何数据
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**Redis为什么要有淘汰机制?**
|
|
|
|
|
|
|
|
|
|
Redis淘汰机制的存在是为了更好的使用内存,用一定的缓存丢失来换取内存的使用效率。
|
|
|
|
|
|
|
|
|
|
**Redis的过期策略?**
|
|
|
|
|
|
|
|
|
|
Redis有两种过期策略,定期删除和惰性删除
|
|
|
|
|
|
|
|
|
|
- - **定期删除**:Redis每个100ms随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。
|
|
|
|
|
- **惰性删除**:在获取某个key的时候,Redis检查一下,如果该key设置了过期时间则判断该过期时间是否已经过期,如果过期了就直接删掉并不返回任何东西。
|
|
|
|
|
|
|
|
|
|
**Redis的内存淘汰机制?**
|
|
|
|
|
|
|
|
|
|
- **volatile-lru**:从已设置过期时间的数据集中挑选**最近最少使用**的数据淘汰(淘汰**最长时间**没有被使用)
|
|
|
|
|
- **volatile-lfu**:从已设置过期时间的数据集中挑选某段时间内**最近最不经常**的数据淘汰(淘汰一段时间内**使用次数**最少)
|
|
|
|
|
- **volatile-ttl**:从已设置过期时间的数据集中挑选**将要过期**的数据淘汰
|
|
|
|
|
- **volatile-random**:从已设置过期时间的数据集中**任意选择**数据淘汰
|
|
|
|
|
- **allkeys-lru**:从所有数据集中挑选**最近最少使用**的数据淘汰
|
|
|
|
|
- **allkeys-lfu**:从所有数据集中选择某段时间内内**最近最不经常**的数据淘汰
|
|
|
|
|
- **allkeys-random**:从所有数据集中**任意选择数**据淘汰
|
|
|
|
|
- **noenviction(驱逐)**: 不删除策略,达到最大内存限制时,如果需要更多内存,直接返回错误信息
|
|
|
|
|
当Redis内存快耗尽时,Redis会启动内存淘汰机制,将部分key清掉以腾出内存。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|