Redis 是一种基于内存的数据存储系统,拥有极高的读写性能。但由于数据主要保存在内存中,一旦服务器重启、断电或发生故障,内存中的数据可能会丢失。因此,Redis 提供了持久化机制,将内存中的数据保存到磁盘,从而保证数据能够在服务恢复后重新加载。
目前 Redis 主要提供两种持久化方式:RDB(Redis Database) 和 AOF(Append Only File)。两者各有优势,也可以同时开启,以兼顾性能和数据安全。目前官方也建议大多数生产环境同时启用 RDB 与 AOF,以获得更好的恢复能力和可靠性。
RDB 持久化原理
RDB 是 Redis 默认支持的持久化方式,它会按照设定的时间间隔,将当前内存中的数据生成一个快照文件(dump.rdb)。
例如可以配置:
save 900 1
save 300 10
save 60 10000
表示:
- 900 秒内至少发生 1 次写操作
- 300 秒内至少发生 10 次写操作
- 60 秒内至少发生 10000 次写操作
满足条件后,Redis 会执行 BGSAVE,在后台生成 RDB 快照,不会长时间阻塞主线程。
RDB 优点
- 文件体积较小,便于备份
- 恢复速度快
- 对 Redis 运行性能影响较小
- 适合定期数据备份
- 方便迁移和灾难恢复
RDB 缺点
由于 RDB 是周期性生成快照,因此如果 Redis 在两次快照之间发生异常退出,那么最近一段时间的数据可能无法恢复。
例如:
- 每 5 分钟生成一次快照
- 第 4 分钟服务器突然断电
那么最近 4 分钟的数据可能全部丢失。
AOF 持久化原理
AOF(Append Only File)采用另一种思路。它不会保存整个数据库,而是把所有修改数据的命令依次追加到日志文件中,例如:
SET user:1 Tom
HSET user:1 age 18
INCR counter
DEL cache:100
当 Redis 重启时,会重新执行这些命令,从而恢复整个数据库。
由于记录的是每一次写操作,因此数据安全性明显高于 RDB。
Redis 提供三种同步策略:
1. always
每执行一次写操作立即同步到磁盘。
优点:数据最安全
缺点:写入性能最低
2. everysec(默认推荐)
每秒同步一次。
优点:
- 性能较高
- 最多丢失约 1 秒数据
这是目前生产环境最常见的配置。
3. no
由操作系统自行决定同步时机。
优点:写入速度最快
缺点:数据安全性最低
RDB 与 AOF 对比
| 对比项 | RDB | AOF |
|---|---|---|
| 保存方式 | 数据快照 | 写命令日志 |
| 文件大小 | 较小 | 较大 |
| 恢复速度 | 很快 | 较慢 |
| 数据安全 | 较低 | 较高 |
| 写入性能 | 更高 | 略低 |
| 数据丢失风险 | 快照之间的数据可能丢失 | 默认最多约丢失 1 秒数据 |
| 适用场景 | 数据备份、快速恢复 | 高可靠业务 |
总体来看:
- 如果更关注性能,RDB 更合适。
- 如果更关注数据安全,AOF 更适合。
- 对于生产环境,两者结合使用通常效果最佳。
Redis 为什么推荐同时开启 RDB 与 AOF
很多开发者认为开启其中一种即可,其实官方更推荐同时启用。
原因主要有以下几点:
- RDB 恢复速度快,大数据量情况下启动效率更高。
- AOF 能记录更多最新数据,能够最大程度减少数据丢失。
- RDB 文件非常适合作为长期备份,可以方便地上传到对象存储或异地服务器进行容灾备份。
当两种持久化方式同时开启时,Redis 重启时通常会优先使用 AOF 文件恢复数据,因为它包含的数据更完整。
生产环境配置建议
对于缓存型业务:
- 可以仅开启 RDB
- 定期生成快照即可
- 更注重性能
对于用户数据、订单等重要业务:
- 建议开启 AOF
- appendfsync 设置为 everysec
- 同时开启 RDB 定时备份
对于互联网生产环境:
- RDB + AOF 同时开启
- AOF 使用 everysec
- 定期备份 RDB 文件
- 配合主从复制、哨兵或 Redis Cluster 提高可用性
这种配置能够在性能、恢复速度和数据安全之间取得较好的平衡,也是目前广泛采用的实践方案。
总结
Redis 持久化是保障数据安全的重要机制。RDB 采用快照方式,具有恢复速度快、文件体积小、适合备份等优势;AOF 采用追加日志方式,能够提供更高的数据可靠性,但文件更大、恢复时间相对更长。
对于开发测试环境,可以根据需求选择其中一种持久化方式;而对于正式生产环境,推荐同时启用 RDB 与 AOF,并采用 AOF everysec 策略,这样既能够保证系统性能,又能有效降低数据丢失风险,为业务提供更加稳定可靠的数据保障。