如何避免用户从Redis只读从节点读取到未同步的过期数据?
Redis主从复制读取一致性问题解答
你已明确的基础规则整理如下:
- 默认情况下从节点为只读模式
- 所有写操作都必须在主节点执行
- 主节点将变更写入内部缓冲区后,再将变更同步给从节点
- 从节点接收到缓冲区的变更信息后,写入自身内存
问题结论
会读取到未同步的旧数据
原因说明
Redis默认采用异步主从复制机制,主节点完成本地写入、将变更写入缓冲区后就会向写请求方返回成功,不会阻塞等待从节点完成同步。主节点向从节点同步变更、从节点执行变更写入内存的整个过程存在毫秒级到秒级不等的延迟,延迟大小受网络带宽、服务器负载、同步数据量等因素影响。
你提到的场景中,在从节点接收到name键的变更指令并完成本地更新之前,从节点内存中存储的仍然是旧值rishi,此时发到从节点的读请求会直接返回本地存储的旧值,出现短时间的主从数据不一致。
如果业务对数据一致性要求极高,无法容忍这种不一致,可以使用Redis提供的WAIT命令,强制要求写操作等待指定数量的从节点完成同步后再返回成功,但该方案会显著增加写操作的耗时,需要结合业务场景权衡使用。
内容的提问来源于stack exchange,提问作者Rishi Prakash
相关产品推荐
相关产品推荐

