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为止。
网友评论