Redis密钥以两种方式过期:被动方式和主动方式。
当某个客户端尝试访问密钥时,密钥被动过期,并且密钥被发现超时。
当然这还不够,因为有过期的密钥永远不会被再次访问。这些密钥无论如何都应该过期,所以周期性地Redis会在具有过期集的密钥中随机测试几个密钥。已经过期的所有密钥都将从密钥空间中删除。
具体来说,这就是Redis每秒做10次的事情:
- 从具有相关过期的密钥集中测试20个随机密钥。
- 删除找到的所有密钥已过期。
- 如果超过25%的密钥已过期,请从步骤1重新开始。
这是一个简单的概率算法,基本上假设我们的样本代表整个密钥空间,我们继续到期,直到可能过期的密钥百分比低于25%
这意味着在任何给定时刻,使用内存的已经过期的最大键数量最大等于每秒最大写入操作量除以4。
如何在复制链接和AOF文件中处理过期
为了在不牺牲一致性的情况下获得正确的行为,当密钥到期时,在AOF文件中合成DEL操作并获得所有附加的副本节点。这样,到期过程集中在主实例中,并且不存在一致性错误。
但是,虽然连接到主服务器的副本不会独立到期密钥(但会等待来自主服务器的DEL),但它们仍将采用数据集中存在的过期的完整状态,因此当副本被选为主服务器时它将能够独立地使密钥到期,充分充当主人。