Redis 过期删除策略和内存淘汰策略有什么区别?
过期删除策略
Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略。 每当我们对一个 key 设置了过期时间时,Redis 会把该 key 带上过期时间存储到一个过期字典中(不是直接存在数据里面),查询key时
- 如果key不在过期字典中,正常读取
- 如果在,需要判定过期时间和当前系统的时间,如果过期了,需要处理
过期删除策略:
- 定时删除;
- 设置过期时间后,创建定时事件,当时间达到,自动执行删除key
- 可以保证过期key尽快删除,内存释放快
- 经常中断删除,CPU占用高,且如果同一时间大量key失效,可能引起redis服务器阻塞
- 惰性删除;
- 不主动删除过期key,每次访问时发现过期,进行删除
- CPU占用相对低
- 但是过期key不被访问会一直放在内存,内存占用高
- 如果过期了,返回null给客户端,否则返回正常值
- 定期删除;
- 每隔一段时间,从数据库读取一定量的key检查,删除其中过期的
- CPU占用相对低,内存占用相对低
- 但是有点不上不下,且操作时长和频率需要比较好
- Redis 每秒进行 10 次过期检查(可配置),每次抽取数量是20
- 如果本轮过期key 占比超过25%,继续抽查,否则结束,但是总长度不会超过25ms,避免过度循环
所以, Redis 选择「惰性删除 + 定期删除」这两种策略配和使用,以求在合理使用 CPU 时间和避免内存浪费之间取得平衡。
内存淘汰
当 Redis 的运行内存已经超过 Redis 设置的最大内存之后,则会使用内存淘汰策略删除符合条件的 key,以此来保障 Redis 高效的运行。
- 1、不进行数据淘汰的策略
- 不淘汰任何数据,如果新数据写入,触发OOM,不写入没事儿
- 是默认策略
- *2、在设置了过期时间的数据中进行淘汰:
- volatile-random:随机淘汰设置了过期时间的任意键值;
- volatile-ttl:优先淘汰更早过期的键值。
- volatile-lru(Redis3.0 之前,默认的内存淘汰策略):淘汰所有设置了过期时间的键值中,最久未使用的键值;
- volatile-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰所有设置了过期时间的键值中,最少使用的键值;
- 3、在所有数据范围内进行淘汰:
- allkeys-random:随机淘汰任意键值;
- allkeys-lru:淘汰整个键值中最久未使用的键值;
- allkeys-lfu(Redis 4.0 后新增的内存淘汰策略):淘汰整个键值中最少使用的键值。
