Redis通过主从复制机制、哨兵模式和集群模式确保读写一致性。主要实现包括:异步复制结合全量+增量同步、主从间数据同步使用repl_backlog缓冲区避免数据丢失、读写分离时从节点使用wait命令等待主节点复制完成、并发安全由单线程模型和Lua脚本原子性保证、多节点并发通过分布式锁Redlock实现。数据同步流程:主节点记录写操作到RDB/AOF,从节点全量同步后增量replication stream同步;并发安全:Redis单线程避免锁竞争,复杂场景用MULTI/EXEC事务或WATCH乐观锁。
主从复制一致性保障
Redis的主从复制采用异步复制机制,主库将写操作写入repl_backlog缓冲区,从库通过全量同步(RDB快照)+增量同步(repl_stream)保持数据一致。全量同步时,主库生成RDB文件传输给从库,从库加载后发送PSYNC命令请求增量部分,repl_backlog记录最近的写命令序列,确保从库追上主库即使短暂断开。wait命令可阻塞从库直到主库复制指定字节数,实现强一致读。
读写分离下的同步机制
在读写分离架构中,主库负责写,从库负责读。为确保一致性,使用redis-replicate-wait或自定义wait脚本:从库执行wait
并发安全与事务支持
Redis单线程模型天然避免并发读写冲突,所有命令原子执行。事务用MULTI/EXEC包围命令队列,保证原子性;WATCH实现乐观锁,监控key变化若发生则事务回滚。Lua脚本EVAL命令在服务器端单线程执行,确保原子性。分布式并发用Redlock算法:获取多数节点锁(N/2+1),带TTL自动释放,避免单点故障。
集群模式一致性
Redis Cluster使用16384槽位哈希分片,写操作路由到slot主节点,主从异步复制。Gossip协议维护集群状态,一致性通过wait和异步复制结合。为强一致,可在客户端实现两阶段提交:先写多数节点,再确认。故障时从节点提升为主,结合仲裁确保数据不丢失。
实际工程实践
工程中,确保一致性:1)repl-diskless-sync启用无盘复制加速全量同步;2)min-replicas-to-write配置拒绝写如果从库不足;3)AOF+RDB双持久化,主从间repl-timeout监控延迟;4)读请求加版本戳或时间戳过滤旧数据;5)热点key用本地缓存分流。测试用redis-assertion工具验证offset一致性。
FAQ
Q: Redis主从复制如何处理网络分区导致的数据丢失?
A: repl_backlog预留缓冲区记录历史命令,从库重连时从offset回放,避免短暂断开丢失数据,但长时分区仍可能丢失。
Q: wait命令如何保证读写一致性?
A: 从库执行wait后阻塞直到主库确认复制字节数达到阈值,确保后续读操作看到最新写。
Q: Redis事务并发冲突怎么解决?
A: 用WATCH监控key,若其他客户端改动则DISCARD回滚,重试事务。
Q: Redlock相比SETNX锁的优势?
A: Redlock多节点多数派投票,容忍少数节点故障,比单节点锁更可靠。