Redis 持久化与高可用方案详解
Redis 作为高性能内存数据库,在缓存、会话管理、消息队列等场景被广泛使用。但内存数据的持久化和高可用保障是生产环境不可忽视的核心问题。本文深入解析 Redis 的持久化机制和高可用方案。
一、RDB 持久化
RDB(Redis Database)将内存数据以快照形式保存到磁盘,生成 .rdb 文件。
触发方式:配置 save 条件(如 save 900 1:900秒内有1次写操作)或手动执行 SAVE/BGSAVE。
原理:BGSAVE 通过 fork() 创建子进程,子进程将数据写入临时 RDB 文件,写完后替换旧文件。利用 Copy-On-Write(COW)机制,父进程正常服务,互不影响。
优点:文件紧凑、恢复速度快;缺点:两次快照之间的数据可能丢失(最多丢失几分钟数据)。
二、AOF 持久化
AOF(Append Only File)将每条写命令追加到日志文件,重启时回放日志恢复数据。
刷盘策略:
- appendfsync always:每条命令立即刷盘,最安全但性能最差
- appendfsync everysec:每秒刷盘一次(默认),丢失最多1秒数据,推荐
- appendfsync no:由 OS 决定刷盘时机,性能最好但不可控
AOF 重写:AOF 文件会越来越大,通过 BGREWRITEAOF 命令压缩,只保留最终状态的命令。
三、RDB vs AOF 选择
- 数据不能丢失:AOF + everysec
- 快速恢复:RDB(或混合持久化)
- 生产推荐:开启混合持久化(aof-use-rdb-preamble yes),文件小且恢复快
四、Redis Sentinel(哨兵)
Sentinel 实现 Redis 主从切换的自动化,解决单点故障:
- 多个 Sentinel 节点持续监控 Master 和 Slave
- Master 宕机后,Sentinel 投票选出新 Master(需要超过半数同意)
- 自动通知客户端新的 Master 地址
- 最少部署 3 个 Sentinel 节点,避免脑裂
五、Redis Cluster(集群)
Redis Cluster 在提供高可用的同时,实现水平扩展:
- 将数据分片到 16384 个 slot,每个节点负责部分 slot
- 每个主节点配置至少一个从节点,主节点宕机后从节点自动接管
- 最少 6 个节点(3主3从)
- 客户端通过 MOVED 和 ASK 重定向找到正确节点
redis-cli --cluster create 192.168.1.1:6379 192.168.1.2:6379 192.168.1.3:6379 192.168.1.4:6379 192.168.1.5:6379 192.168.1.6:6379 --cluster-replicas 1
六、缓存常见问题
- 缓存穿透:查询不存在的 key 绕过缓存直打数据库。解决:布隆过滤器 + 空值缓存
- 缓存击穿:热点 key 过期瞬间大量请求涌入数据库。解决:互斥锁 + 永不过期
- 缓存雪崩:大量 key 同时过期。解决:随机过期时间 + 限流降级
总结
生产环境 Redis 必须开启持久化(推荐混合模式),高可用选 Sentinel(主从)或 Cluster(分布式)。缓存三大问题要在设计阶段就考虑预防,而不是出了问题再补救。