美文网首页
redis的key过期策略+内存淘汰策略

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

作者: java后端领域 | 来源:发表于2023-02-16 16:47 被阅读0次

    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%就触发告警,评估是否需要进行扩容,避免出现超过最大内存。
    
    本文由[mdnice](https://mdnice.com/?platform=6)多平台发布

    相关文章

      网友评论

          本文标题:redis的key过期策略+内存淘汰策略

          本文链接:https://www.haomeiwen.com/subject/qmbpkdtx.html