pull/1/head
595208882@qq.com 3 years ago
parent 7ec0c046a4
commit 45ab312089

@ -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清掉以腾出内存。

@ -3417,6 +3417,12 @@ API经济是基于API所产生经济活动的总和在当今发展阶段主
![最近最少使用算法LRU](images/Solution/最近最少使用算法LRU.png)
一个缓存被访问后,近期再被访问的可能性很大。可以记录每个缓存记录的最近访问时间,最近未被访问时间最长的数据会被首先淘汰。
优点:实现简单,能适应访问热点
缺点:对偶发的访问敏感,影响命中率
簿记开销:时间 `O(1)`,空间 `O(N)`
### 自适应缓存替换算法(ARC)
@ -3431,6 +3437,14 @@ FIFO是英文First In First Out 的缩写,是一种先进先出的数据缓存
![先进先出算法FIFO](images/Solution/先进先出算法FIFO.png)
越早进入缓存的数据,其不再被访问的可能性越大。因此在淘汰缓存时,应选择在内存中停留时间最长的缓存记录。使用队列即可实现该策略:
![缓存淘汰策略-FIFO](images/Solution/缓存淘汰策略-FIFO.png)
优点:实现简单,适合线性访问的场景
缺点:无法适应特定的访问热点,缓存的命中率差
簿记开销:时间 `O(1)`,空间 `O(N)`
### 最近最常使用算法(MRU)

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Loading…
Cancel
Save