java后端领域

V1

2023/02/17阅读:14主题:默认主题

redis的key过期策略+内存淘汰策略

redis的 key 过期策略是怎么样的

redis 的过期策略主要是定期删除和懒删除来实现的

定期删除

redis 定时每间隔大约100ms进行随机抽选择1批key,对过期的key进行删除,并且根据过期key的占比以及执行的实现来是否继续循环。为了就是在可控的时间内尽可能删除过期的key并且尽量不占用太多CPU资源影响业务请求。 具体步骤:

1. 从过期字典最近抽取20个key
2. 将这个20个key中过期的key进行删除,如果过期的key占比抽样的个数占比超过25%,重复1步骤;同时避免一致循环,执行时间超过25ms退出循环;

懒删除

通过定期删除,可以在一定程度上删除过期的key,但是可能删除不及时,又被请求访问到,所以在请求访问到过期key时,会触发删除,并且返回空给业务,保证过期的语义准确性。

  • 问:发现key过期时进行删除时,是异步删除还是同步删除?可能存在什么问题
  • 答:4.0之前是同步删除,如果是big key,同步删除会导致执行时间长,导致命令超时已经后续命令的执行超时等;4.0之后,为了解决删除 big key 带来的阻塞问题,提供了异步删除机制,如果判断是big key,将其扔到队列就返回,有专门的后台线程进行删除。

redis 的内存淘汰策略

redis 为了应对内存不足的场景,定制了8种策略给使用方进行配置选择,具体如下:

  1. Redis 4.0 之前有以下 6 种淘汰策略:
  • noeviction:不淘汰任何数据,当内存不足时,新增操作会报错,读请求不受影响,Redis 默认内存淘汰策略;
  • allkeys-lru:淘汰整个键值中最久未使用的键值;
  • allkeys-random:随机淘汰任意键值;
  • volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值;
  • volatile-random:随机淘汰设置了过期时间的任意键值;
  • volatile-ttl:优先淘汰更早过期的键值。
  1. 在 Redis 4.0 版本中又新增了 2 种淘汰策略:
  • volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值;
  • allkeys-lfu:淘汰整个键值中最少使用的键值。 其中 allkeys-xxx 表示从所有的键值中淘汰数据,而 volatile-xxx 表示从设置了过期键的键值中淘汰数据。
实战建议:生产实战中,使用最多的是 volatile-lru。同时听过配置使用容量阈值告警,一般超过60~80%就触发告警,评估是否需要进行扩容,避免出现超过最大内存。

分类:

后端

标签:

后端

作者介绍

java后端领域
V1

研发过亿日活的app,java 8年+