面试题答案
一键面试数据结构创新
- 复制偏移量(Replication Offset):在Redis源码中,通过维护复制偏移量来记录主从节点间的数据同步进度。例如在
server.h
文件中定义的struct redisServer
结构体里,有repl_offset
字段记录主节点已发送数据的偏移量,从节点也有类似字段记录已接收数据偏移量。这一创新数据结构使得主从节点能精准定位同步位置,高效进行数据复制。 - 复制积压缓冲区(Replication Backlog):是一个环形缓冲区,在
server.c
的initServer()
函数中初始化。它允许主节点在一定时间内保存已发送的数据,若从节点短暂断开重连,可利用此缓冲区快速同步数据,而无需全量复制,提升了复制效率。
算法创新
- 部分重同步算法:从节点断开重连时,主从节点会交换
runid
和偏移量。若从节点保存的runid
与主节点一致且偏移量在复制积压缓冲区范围内,主节点就只发送从节点缺失的数据,而非全量数据。这一算法实现于replication.c
的replicationFeedSlave()
等函数,大大减少了网络传输量和同步时间。
控制流程创新
- 异步复制:主节点在将数据发送给从节点后,不会等待从节点确认就继续处理客户端请求,实现了主节点与从节点间的异步操作。在
replication.c
的replicationFeedSlave()
函数中,主节点只是将数据写入套接字缓冲区就返回,从节点异步接收处理。这种异步方式提升了主节点的并发处理能力,使得Redis在大规模复制场景下仍能保持高性能。 - 心跳机制:主从节点间通过定期发送PING/PONG消息来维持连接状态,在
replication.c
的replicationCron()
函数中实现。这确保了即使没有数据传输,连接也不会因长时间空闲而断开,同时能及时发现连接异常并进行相应处理,保证了复制功能的稳定性。