上一篇:https://blog.csdn.net/fengxianaa/article/details/124409684
redis中,key过期后并不会马上删除,而是同时使用了 3 种策略来删除这些key
- 惰性清除:访问key时,如果发现key已经过期,那么会将key删除
- 定时清理:每次清理会依次遍历所有DB,从db随机取出20个key,如果过期就删除
- 如果其中有5个key过期,那么就继续对这个db进行清理,否则开始清理下一个db
- 内存不足:内存不够,采用LRU策略清除
1. LRU 介绍
redis在数据达到一定程度之后,就会将数据进行清理,默认采用的是LRU策略
- LRU:Least Recently Used,最近最少使用算法
- 将最近一段时间内,最少使用的一些数据,给干掉。
- 比如说有一个key,在最近1个小时内,只被访问了一次; 还有一个key在最近1个小时内,被访问了1万次
- 这时候就会清除只访问了一次的key
2. 缓存清理配置
在 redis.conf 中也可以进行配置
- maxmemory:redis存放数据的最大内存,超出这个内存之后,就会立即使用LRU算法清理掉部分数据
- 64 bit的机器,如果maxmemory设置为0,那么就默认不限制内存的使用,直到耗尽机器中所有的内存为止;
- 32 bit的机器,有一个隐式的闲置就是3GB
- maxmemory-policy:内存达到最大限制后,采取什么策略来处理
- noeviction: 内存达到最大限制,client还要继续写入数据,直接报错给客户端
- allkeys-lru: 就是我们说的LRU算法,移除掉最近最少使用的数据
- allkeys-random: 随机选择一些key来删除掉
- volatile-lru: 采取LRU算法,仅仅对设置了存活时间(TTL)的key才会清理掉
- volatile-random: 随机选择一些设置了TTL的key来删除掉
- volatile-ttl: 选择那些TTL时间比较短的key,益处
- maxmemory_samples:随机选择的key的数量
3. Redis 的LRU算法
redis中使用的是LRU近似算法,也就是对keys进行采样,然后在采样结果中进行数据清理,之所以不使用 LRU 算法,是因为需要消耗大量的额外的内存
Redis 为实现近似 LRU 算法,它给每个 key 增加了一个额外的小字段,这个字段的长度是 24 个bit,也就是最后一次被访问的时间戳。
当 Redis 执行写操作时,发现内存超出 maxmemory,就会执行一次 LRU 淘汰算法。
- 就是随机采样出 5 个key(通过maxmemory_samples配置) ,然后淘汰掉最旧的 key
- 如果淘汰后内存还是超出 maxmemory,那就继续随机采样淘汰,直到内存低于 maxmemory 为止。
- 采样:通过 maxmemory-policy 的配置
- allkeys 就是从所有的 key 中随机
- volatile 就从带过期时间的 key 中随机