Redis 是如何实现主从同步的

replica 在配置 replicaof 参数之后,会发送 PSYNC 命令到 master。

PSYNC replicationid offset

这里分为两种情况:

  1. replica 希望做全量同步,那就可以发送 PSYNC ? -1 ,然后 master 会把执行 save 的结果,也就是 RDB 文件发送给 replica,然后 master 不断将新的命令同步给 replica,这个同步是 RESP 格式的。
  2. replica 希望做增量,那就可以将 replicaid 和当前的 offset 发送到 master,这个时候不能保证发生增量同步,还得看 master 是否有 offset 之后的数据,Redis 把这个叫做 backlog,backlog 可以通过 info replication 查看。如果需要的增量数据不在 backlog 中,master 会通知 replica 进行全量同步,这个就和 1 相同了,如果在的话会将 offset 之后的数据以 RESP 格式发送给 replica。

如果对这个流程感兴趣,可以看看:使用 Go 模拟 replica,从 master 同步数据

Key 过期是如何实现的

key 过期的时候(包括被驱逐),master 会发送 del key 到 replica,这样就可以保持数据一致。

除此之外,replica 实现了如果检测到 key 过期,对于客户端的读操作就视作 key 不存在,然后等待 master 的删除命令。

一旦 replica 提升为 master,自身会开始控制 key 的过期,不会依赖之前的 master。