Redis 所有的数据结构都可以设置过期时间,同时Redis 是单线程的。
在同一时刻如果有太多的key过期,删除的时间也会占用线程的处理时间,将有可能导致线上读写指令出现卡顿。
过期集合
redis 会将每个设置了过期时间的key存储到一个独立的字典中,定时遍历字典来删除到期的key。
同时,它还采用了惰性策略来删除过期的key,在客户端访问这个key时,对key进行过期校验,如果过期则删除。
定时删除策略
Redis默认会每秒进行十次过期扫描,每次扫描从过期字典中取20个key进行删除,如果过期的key比例超过现有key集合1/4将重复取过期key进行删除。
同时为了保证循环过多导致线程卡死,每次扫描过期字典最多25ms
所以这也就要求我们每次对redis的key值设置过期时间尽量分散一些