Redis过期策略
Redis所有的数据结构都可以设置过期时间,时间一到就会被自动删除。
1.过期的key集合
Redis会将设置了过期时间的key放入一个独立的字典中,称为过期字典,与没有时间限制的key区分开来,后面会定时遍历这个独立字典来删除到期的key。
除了定时遍历之外,它还会使用惰性策略来删除过期的key。
2.定时删除策略
Redis默认每秒进行10次过期扫描,过期扫描不会遍历过期字典中所有的key,而是采用一种简单的贪心策略,步骤如下:
(1)从过期字典中随机选出20个key
(2)删除这20个key中已经过期的key
(3)如果过期的key的比例超过1/4,那就重复步骤(1)
为了保证过期扫描不会出现循环过度,导致线程卡死的现象,算法还增加了扫描时间的上限,默认不会超过25ms
显然,当一个大型的Redis实例中所有的key在同一时间过期了,按上述策略进行删除必然会进行长时间的循环,从而使得线上读写可能出现卡顿。
所以在设置过期时间的时候要注意当存在大批量的key会在同一时间过期时要尽量错开它们,设置一个随机时间范围,然后设置过期时间的时候都从这个随机范围取
3.惰性策略
惰性策略就是在客户端访问这个key的时候,Redis对key的过期时间进行检查,如果过期了就立即删除。
4.从节点的过期策略
从节点不会进行过期扫描,从节点对过期的处理是被动的。
主节点在key到期时,会从AOF文件里增加一条del指令,同步到所有的从节点,从节点通过执行这条del指令来删除过期的key。
因为指令同步是异步进行的,所以如果主节点过期的key的del指令没有及时同步到从节点的话,就会出现主从数据的不一致,主节点没有的数据在从节点里还存在。