Redis面试题笔记

1. Redis主从复制的原理 【主从复制的原理】 同步:从节点向主节点发送psync命令进行同步,从节点保存主节点返回的 runid 和 offset 全量复制:如果是第一次连接或者连接失败且repl_backlog_buffer 缓存区不包含slave_repl_offset, 则生成主节点的数据快照(RDB文件)发给从节点 增量复制:全量复制完毕后,主从节点之间会保持长连接。如果连接没有断开或者slave_repl_offset仍然在repl_backlog_buffer中,则将后续的写操作传递给从节点,让数据保持一致。 【全量复制细节】 全量复制的过程是基于TCP长连接的,主要流程如下 从节点发送psync ? -1表示需要建立连接进行同步,主节点返回主节点ID runid 和 复制进度offset (第一次同步用 -1 表示)。从节点接受之后,保存主节点的信息。 主节点执行bgsave命令生成数据快照RDB文件,然后将RDB文件发送给从节点。从节点接受文件后,清除现有的所有数据,然后加载RDB文件 如果在制作数据快照RDB文件的过程当中,主节点接收到了新的写操作,主节点会将其记录在repl buffer 里面。然后将repl buffer当中的写操作发给从节点,让其数据保持一致。 【增量复制细节】 如果主从节点意外断开连接,为了保持数据的一致性,必须重新同步数据。如果使用全量复制来保持一致性的话,开销太大,所以采用增量复制。 增量复制的具体流程如下: 连接恢复后,从节点会发送psync {runid} {offset}, 其中主节点ID runid 和 复制进度offset用于标识是哪一个服务器主机和复制进度。 主节点收到psync 命令之后,会用conitnue响应告知从节点,采用增量复制同步数据 最后,主节点根据offset查找对应的进度,将短线期间未同步的写命令,发送给从节点。同时,主节点将所有的写命令写入repl_backlog_buffer, 用于后续判断是采用增量复制还是全量复制。 【注意】从节点 psync 携带的 offset 为 slave_repl_offset。如果 repl_backlog_buffer包含slave_repl_offset 对应的部分,则采用增量复制,否则采用全量复制。repl_backlog_buffer的默认缓冲区大小为1M 【为什么要主从复制】 备份数据:主从复制实现了数据的热备份,是持久化之外的数据冗余方式 故障恢复:当主节点宕机之后,可以采用从节点提供服务。 负载均衡: 主从复制实现了读写分离,只有主节点支持读写操作,从节点只有都操作。在读多写少的场景下,可以提高Redis服务器的并发量。 2. Redis集群的实现原理是什么? 【Redis集群基本知识】 定义: Redis集群由多个实例组成,每个实例存储部分数据 (每个实例之间的数据不重复) 。 【注】集群和主从节点不是一个东西,集群的某一个实例当中可能包含一个主节点 + 多个从节点 为什么用 问题 解决方案 容量不足 数据分片,将数据分散不存到不同的主节点 高并发写入 数据分片,将写入请求分摊到多个主节点 主机宕机问题 自动切换主从节点,避免影响服务, 不需要手动修改客户端配置 节点通信协议:Redis集群采用Gossip协议, 支持分布式信息传播、延迟低、效率高。采用去中心化思想,任意实例(主节点)都可以作为请求入口,节点间相互通信。 分片原理: 采用哈希槽(Hash Slot)机制来分配数据,整个空间可以划分为16384 (16 * 1024)个槽。 每个Redis负责一定范围的哈希槽,数据的key经过哈希函数计算之后对16384取余可定位到对应的节点。 ...

February 20, 2025 · 2 min · SwimmingLiu