Redis 双向同步如何避免循环?
· 阅读需 5 分钟
在跨机房高可用、主备切换、混合云架构中,Redis 双向同步是一个常见需求。要实现数据库的双向同步,最大的挑战就是如何避免数据在两个实例之间无限循环。
本文将从问题入手,带你了解双向同步防循环方案,并介绍一种更加高效、轻量的解决方式:基于事务标记的防循环模式,最后通过一个简单的实操演示,帮你快速上手。
为什么双向同步会陷入循环
我们以两个 Redis 实例 A 和 B 为例,同时配置了 A→B 和 B→A 的同步任务:
A 上的数据写入,会同步到 B。B 收到后,又会被同步回 A。如果没有循环检测机制,事件就会在 A、B 之间“打乒乓球”,循环往复。
在实现 MySQL、PostgreSQL 的双向同步功能中,CloudCanal 分别采用增量事件标记和事务记录实现循环事件过滤。任一方向的同步链路在收到新事件时都会判断事务中是否存在相应的标记,以此来选择是否过滤这一事件,从而打破数据循环。

相较于 PostgreSQL 等传统数据库,Redis 本身的特点让其双向同步的实现变得复杂:
- Redis 命令粒度小(如
INCR key),并不总是事务 - Redis 的事务(
MULTI/EXEC)和传统关系型数据库事务不同,不具备完整的原子性
那么,该如何实现 Redis 的双向同步呢?
