2. Redis 基础回顾:数据结构、持久化机制、主从复制与哨兵架构
2.1 核心数据结构与适用场景
Redis 提供了多种高性能数据结构,理解其底层实现与适用场景是进行状态还原与安全配置的前提。下表总结了最常用的五种数据结构及其典型用途:
| 数据结构 | 底层编码 | 操作复杂度 | 典型应用场景 |
|---|---|---|---|
| String | int / embstr / raw | O(1) 读写 | 缓存、计数器、分布式锁、Session 共享 |
| Hash | ziplist / hashtable | O(1) 单字段 | 对象存储、用户属性、配置项分组 |
| List | quicklist | O(1) 头尾操作 | 消息队列、时间线、最新列表 |
| Set | intset / hashtable | O(1) 增删查 | 标签系统、去重、共同好友 |
| Sorted Set | ziplist / skiplist | O(log N) 范围查询 | 排行榜、延时队列、限流滑动窗口 |
状态还原关注点: 在集成环境回放中,Sorted Set 的 score 和 member 映射关系、Hash 的字段顺序(ziplist 编码下)都可能影响回放一致性。建议在快照前使用
DEBUG OBJECT 命令确认编码类型。
2.2 持久化机制:RDB 与 AOF
Redis 提供两种持久化方式,用于在进程重启后恢复数据。两者在数据完整性、性能影响和恢复速度上存在显著差异。
2.2.1 RDB(快照持久化)
- 触发方式: 手动
SAVE/BGSAVE,或自动根据save配置条件触发。 - 文件格式: 二进制压缩快照,默认
dump.rdb。 - 优点: 恢复速度快,文件体积小,适合全量备份。
- 缺点: 可能丢失最后一次快照后的所有写入数据。
2.2.2 AOF(追加文件持久化)
- 触发方式: 每次写操作追加到
appendonly.aof文件。 - 刷盘策略:
always(每次写)、everysec(每秒)、no(由操作系统决定)。 - 优点: 数据安全性高,最多丢失 1 秒数据(everysec 策略)。
- 缺点: 文件体积大,恢复速度慢,可能触发 AOF 重写。
生产建议: 同时开启 RDB 和 AOF。RDB 用于快速冷启动和全量备份,AOF 用于保证数据完整性。在集成环境回放场景中,优先使用 AOF + everysec 策略,确保回放点数据不丢失。
下图展示了 RDB 与 AOF 在数据写入和恢复流程上的核心差异:
2.3 主从复制架构
主从复制是 Redis 高可用的基础。主节点(Master)负责写操作,从节点(Slave)异步复制数据,提供读扩展和冷备能力。
2.3.1 复制流程
- 连接建立: 从节点发送
PSYNC命令,携带主节点 runid 和复制偏移量。 - 全量同步: 主节点生成 RDB 快照发送给从节点,同时缓冲增量命令。
- 增量同步: 从节点加载 RDB 后,主节点将缓冲的增量命令发送给从节点。
- 命令传播: 后续写操作实时异步复制到从节点。
安全风险: 默认情况下,从节点拥有与主节点相同的权限。若从节点被攻破,攻击者可获取所有数据。在集成环境回放中,建议对从节点启用
replica-read-only yes 并配置独立的 ACL 用户。
2.4 哨兵架构与高可用
Redis Sentinel 提供自动故障转移能力,当主节点宕机时,哨兵集群会选举新主节点并通知客户端。
2.4.1 哨兵核心功能
| 功能 | 说明 | 配置参数 |
|---|---|---|
| 监控 | 定期 PING 所有节点,检测主观下线(SDOWN)和客观下线(ODOWN) | sentinel monitor |
| 通知 | 通过 API 或脚本通知管理员节点状态变化 | sentinel notification-script |
| 故障转移 | 选举新主节点,更新从节点复制目标,重写配置 | sentinel failover-timeout |
| 配置提供 | 客户端通过哨兵获取当前主节点地址 | sentinel get-master-addr-by-name |
下图展示了哨兵架构中节点角色与故障转移的决策流程:
2.5 集成环境回放中的关键考量
状态还原要点:
- 持久化选择: 回放环境建议同时开启 RDB 和 AOF,RDB 用于快速初始化,AOF 用于增量回放。
- 复制偏移量: 主从切换后,新主节点的复制偏移量会重置,回放脚本需重新计算偏移量起点。
- 哨兵配置安全: 哨兵配置文件包含明文密码,需设置
sentinel auth-pass并限制文件权限为 600。 - ACL 兼容性: Redis 6.0+ 的 ACL 规则在故障转移后仍保留,但需确保新主节点加载了相同的 ACL 文件。