在Redis主从架构中,从节点读到已过期的数据是一个非常经典的“脏读”问题。导致这个问题的原因主要与Redis的版本以及服务器的时钟同步有关。 以下是详细的原因分析和相应的解决方案: --- 一、 原因分析 1. Redis 3.2 以下版本的历史遗留问题 在 Redis 3.2 版本之前,Redis 的过期键删除策略在主从架构下存在缺陷: 主节点全权负责: Redis 的从节点不会主动去检查和删除过期的 key。只有当主节点通过定时扫描(Active)或被动访问(Lazy)发现 key 过期时,主节点才会执行删除,并向从节点发送一个 命令同步删除动作。 从节点不校验 TTL: 在 3.2 之前的版本中,当业务端直接读取从节点时,从节点即使发现该 key 的 TTL 已经小于 0,也不会返回空,而是直接把还在内存中的脏数据返回给客户端,直到收到主节点发来的 命令才会真正删除并返回空。 主从延迟放大问题: 由于主从同步是异步的,主节点生成 命令到从节点执行 命令存在网络延迟;加上主节点的后台定时清理并不总是能立刻发现过期键,这就导致了从节点会长时间返回已过期的数据。 2. 主从服务...