redis key过期策略和淘汰策略

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为止。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容