美文网首页
redis key过期策略和淘汰策略

redis key过期策略和淘汰策略

作者: 摸摸脸上的胡渣 | 来源:发表于2020-03-04 11:17 被阅读0次

    redis集群key分类

    redis集群中的key统分为两类,分别是设置了过期时间的key和未设置过期时间的key。其中过期策略只涉及设置了过期时间的key,淘汰策略涉及了两者。

    1. 过期策略

    过期策略只对设置了过期时间的key生效。
    过期策略可以分为两种,主动过期和被动过期。

    1.1 主动过期

    redis追求的是高效率,所以不能做到精准过期,因为精准过期涉及到大量状态的存储和监听,势必会带来性能损耗,所以redis提出了一种近似过期策略:
    redis将所有设置了过期时间的key放入一个字典中,然后隔段时间(1秒10次)去字典中随机挑选20个key,查看是否过期,如果过期的比例超过了25%,那么就认为当前字典中需要被过期key十分稠密,就会循环以上操作,直到降到25%以下。每一次循环操作有耗时上限,25ms,避免一次循环阻塞redis过长时间。
    如果某一时刻出现了大量的key过期,就会导致redis出现明显的卡顿,并且在slow log中无法发现慢查询,因为慢查询指的是查询过程,并不包含等待过程。
    为了避免以上问题,应该对同一批key的过期时间在一定的基础上进行随机化,比如

    redis.setExpireTime(key, baseExpireTime+randomTime)
    

    1.2 被动过期

    以上的近似过期策略无法做到精准过期,所以redis还增加了被动过期,当redis client访问key时,redis server会检查此key是否过期,如果过期了删除该key并返回nil,反之返回对应的key。

    2. 淘汰策略

    当内存超过了maxmemory时,会对key进行淘汰。
    淘汰的对象分为两类,分别是allkeys(设置了过期时间+未设置过期时间的key,也就是全部key)和volatile(设置了过期时间的key)。
    每类都有几种不同的策略(maxmemory-policy),LRU、random和TTL。因为redis的性能要求,也不会实现严格的淘汰策略,而是实现了近似的淘汰策略。
    近似的淘汰策略依赖于redis对每个key增加的一个时间戳域,这个域记录了key被访问过的最新时期。
    根据maxmemory-policy确定要被淘汰key的总集合,在总集合中随机选出大小为5的子集,根据时间戳域,对子集中最晚被访问过的key进行淘汰,直至内存容量小于maxmemory为止。

    相关文章

      网友评论

          本文标题:redis key过期策略和淘汰策略

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