【专栏简介】
随着数据需求的迅猛增长,持久化和数据查询技术的重要性日益凸显。关系型数据库已不再是唯一选择,数据的处理方式正变得日益多样化。在众多新兴的解决方案与工具中,Redis凭借其独特的优势脱颖而出。
【技术大纲】
为何Redis备受瞩目?原因在于其学习曲线平缓,短时间内便能对Redis有初步了解。同时,Redis在处理特定问题时展现出卓越的通用性,专注于其擅长的领域。深入了解Redis后,您将能够明确哪些任务适合由Redis承担,哪些则不适宜。这一经验对开发人员来说是一笔宝贵的财富。
在这个专栏中,我们将专注于Redis的6.2版本进行深入分析和介绍。Redis 6.2不仅是我个人特别偏爱的一个版本,而且在实际应用中也被广泛认为是稳定性和性能表现都相当出色的版本。
【专栏目标】
本专栏深入浅出地传授Redis的基础知识,旨在助力读者掌握其核心概念与技能。深入剖析了Redis的大多数功能以及全部多机功能的实现原理,详细展示了这些功能的核心数据结构和关键算法思想。读者将能够快速且有效地理解Redis的内部构造和运作机制,这些知识将助力读者更好地运用Redis,提升其使用效率。
将聚焦于Redis的五大数据结构,深入剖析各种数据建模方法,并分享关键的管理细节与调试技巧。
【目标人群】
Redis技术进阶之路专栏:目标人群与受众对象,对于希望深入了解Redis实现原理底层细节的人群。
1. Redis爱好者与社区成员
Redis技术有浓厚兴趣,经常参与社区讨论,希望深入研究Redis内部机制、性能优化和扩展性的读者。
2. 后端开发和系统架构师
在日常工作中经常使用Redis作为数据存储和缓存工具,他们在项目中需要利用Redis进行数据存储、缓存、消息队列等操作时,此专栏将为他们提供有力的技术支撑。
3. 计算机专业的本科生及研究生
对于学习计算机科学、软件工程、数据分析等相关专业的在校学生,以及对Redis技术感兴趣的教育工作者,此专栏可以作为他们的学习资料和教学参考。
无论是初学者还是资深专家,无论是从业者还是学生,只要对Redis技术感兴趣并希望深入了解其原理和实践,都是此专栏的目标人群和受众对象。
让我们携手踏上学习Redis的旅程,探索其无尽的可能性!
Redis复制机制(replicate)
在 Redis 里,用户能够借助执行 SLAVEOF
命令,或者设置 slaveof
选项,使一台服务器对另一台服务器进行数据复制。我们把被复制的服务器称作主服务器(master ),而执行复制操作的服务器则被叫做从服务器(slave )。
案例介绍
目前存在两个Redis服务器,地址分别是 127.0.0.1:6379
和 127.0.0.1:12345
。若登录Redis服务器 127.0.0.1:12345
执行以下命令:127.0.0.1:12345> SLAVEOF 127.0.0.1 6379
,会得到 OK
的响应。
- 服务器
127.0.0.1:12345
会成为127.0.0.1:6379
的从服务器,而127.0.0.1:6379
则会成为127.0.0.1:12345
的主服务器。
数据库状态一致
在复制过程中,主从服务器的数据库会保存相同的数据,这种现象在概念上被称为"数据库状态一致",简称"一致"。
接下来我们演示一下效果,比如说,如果我们在主服务器上执行以下命令:
bash
127.0.0.1:6379> SET msg "hello world"
OK
那么我们应该既可以在主服务器上获取msg
键的值:
bash
127.0.0.1:6379> GET msg
"hello world"
此时,我们又可以在从服务器上获取msg
键的值:
bash
127.0.0.1:12345> GET msg
"hello world"
另一方面,如果我们在主服务器中删除了键msg
:
bash
127.0.0,1:6379>DEL msg
(integer) 1
那么不仅主服务器上的msg
键会被删除:
bash
127.0.0.1:6379> EXISTS msg
(integer) 0
从服务器上的msg
键也应该会被删除:
bash
127.0,0.1:12345>EXISTS msg
(integer)0
旧版复制功能的实现
Redis 复制功能主要由同步(Sync)和命令传播(Command Propagate)两个操作组成。
同步操作
同步操作 用于将从服务器 的数据库状态 更新至主服务器当前所处的数据库状态。
- 从服务器启动时,会向主服务器发送一个
SYNC
命令 - 主服务器收到命令,开始在后台执行
BGSAVE
命令,创建数据快照(RDB
文件),并将在此期间接收到的所有写命令缓存起来。 - 当快照创建完成后,主服务器将
RDB
文件和缓存的命令发送给从服务器。 - 从服务器接收并加载这些数据后,其数据库状态即与主服务器同步完成。
整个过程确保了从服务器在初始时刻与主服务器数据完全一致。
在同步操作执行完毕之后,主从服务器两者的数据库将达到一致状态,但这种一致并不是一成不变的,每当主服务器执行客户端发送的写命令时,主服务器的数据库就有可能会被修改,并导致主从服务器状态不再一致。
命令传播
在主从复制建立后,主服务器会持续将所有新的写命令传播给从服务器
当主服务器接收到并执行完客户端发出的写命令后,该命令会被发送给从服务器,由从服务器执行,从而保证两者数据的一致性。
注意,持续传播机制确保了即使在主从服务器之间断开连接后,当从服务器重新连接时,能够快速恢复到最新的数据状态,而无需进行完整的数据重同步。
案例说明
经历过上面的案例分析之后,主服务器和一个从服务器刚刚完成同步操作,它们的数据库都保存了相同的五个键K1 至K5。

处于不一致状态的主从服务器
如果这时,客户端向主服务器发送命令DEL K3
,那么主服务器在执行完这个DEL
命令之后,主从服务器的数据库将出现不一致:主服务器的数据库已经不再包含键K3
,但这个键却仍然包含在从服务器的数据库里面。

为了让主从服务器再次回到一致状态,主服务器需要对从服务器执行命令传播操作:
主服务器会将自己执行的写命令,也即是造成主从服务器不一致的那条写命令,发送给从服务器执行,当从服务器执行了相同的写命令之后,主从服务器将再次回到一致状态。

所以,DEL K3
而导致主从服务器不一致,所以主服务器将向从服务器发送相同的命令DEL K3
。
旧版复制功能的缺陷
在Redis中,从服务器对主服务器的复制可以分为以下两种情况:
- 初次复制:从服务器以前没有复制过任何主服务器,或者从服务器当前要复制的主服务器和上一次复制的主服务器不同。
- 断线后重复制:命令传播阶段的主从服务器因为网络原因而中断了复制,但从服务器通过自动重连接重新连上了主服务器,并继续复制主服务器。
对于初次复制来说,旧版复制功能能够很好地完成任务,但对于断线后重复制来说,旧版复制功能虽然也能让主从服务器重新回到一致状态,但效率却非常低。
案例分析说明
从服务器终于重新连接上主服务器,因为这时主从服务器的状态已经不再一致,所以从服务器将向主服务器发送SYNC命令,而主服务器会将包含键K1至键A的RDB 文件发送给从服务器,从服务器通过接收和载人这个RDB文件来将自己的数据库更新至主服务器数据库当前所处的状态。 主从服务器断开的时间越短,主服务器在断线期间执行的写命令就越少,而执行少量写命令所产生的数据量通常比整个数据库的数据量要少得多,在这种情况下,为了让从服务器补足一小部分缺失的数据,却要让主从服务器重新执行一次SYNC命令,这种做法无疑是非常低效的。