网上众说纷纭,加上版本迭代的原因,说的有点乱,我重新整理一下思路。
首先要区分master主节点和slave从节点。
为什么呢?因为slave过期key的删除策略和master过期key的删除策略是不同的。
一,redis主节点过期key的删除策略
1,定时删除:在设置键的过期时间的同时,创建一个timer,让定时器在键的过期时间到达时,立即执行对键的删除操作。(主动删除)
优缺点:对内存友好,但是对cpu时间不友好,有较多过期键的而情况下,删除过期键会占用相当一部分cpu时间。
2,定期删除:每隔一段时间就对数据库进行一次检查,删除里面的过期键。(主动删除)
优缺点:采用对内存和cpu时间折中的方法,每个一段时间执行一次删除过期键操作,并通过限制操作执行的时长和频率来减少对cpu时间的影响。难点在于,选择一个好的策略来设置删除操作的时长和执行频率。
3,惰性删除:放任过期键不管,但是每次从键空间中获取键时,都检查取到的键是否过去,如果过期就删除,如果没过期就返回该键。(被动删除)
优缺点:对cpu时间友好,程序只会在取出键的时候才会对键进行过期检查,这不会在删除其他无关过期键上花费任何cpu时间,但是如果一个键已经过期,而这个键又保留在数据库中,那么只要这个过期键不被删除,他所占用的内存就不会释放,对内存不友好。
二,redis从节点过期key的删除策略
从节点过期key是如何删除的呢?主节点在key到期时,会在AOF文件里增加一条del指令。AOF文件被同步到从节点以后,从节点根据AOF中的这个del指令来执行删除过期key的操作。
从节点的这个过期key的处理策略,会导致一个问题,主节点已经删除的key,在从节点还是存在的。因为AOF同步del指令是异步的。
还有一个关键点,《redis深度》历险那本书这样写的:从节点不会过期扫描,从节点对过期的处理是被动的。