redis持久化
Redis 提供了几种持久化方式,用于确保数据在重启或故障后不丢失。持久化的主要方式有 RDB(Redis 数据库快照) 和 AOF(Append Only File),以及二者结合的方式。每种方式有不同的优缺点,可以根据需求选择合适的持久化策略。
1. RDB(Redis 数据库快照)
RDB 是通过创建 Redis 数据库的时间点快照来持久化数据。RDB 是将内存中的数据保存为一个二进制文件(通常是 dump.rdb),这个文件存储在磁盘上。RDB 是周期性地保存数据(通常是每隔一段时间或达到一定操作数时)的一种方式。
优点:
- 性能高:由于 RDB 是在后台异步保存数据,不会影响 Redis 的性能。
- 恢复速度快:加载 RDB 文件比读取 AOF 文件更快,适合数据量较大的场景。
- 适用于备份:由于 RDB 是文件形式的快照,可以方便地进行备份。
缺点:
数据丢失风险:如果 Redis 在保存快照期间崩溃,可能会丢失这段时间内的所有数据。比如,如果最后一次保存是在 10 分钟前,那么 10 分钟内的数据会丢失。
配置:
在 redis.conf 中可以配置 RDB 的持久化策略。常见的配置如下:
# 每 900 秒(15 分钟)如果至少有 1 个键发生变化,则保存快照
save 900 1
# 每 300 秒(5 分钟)如果至少有 10 个键发生变化,则保存快照
save 300 10
# 每 60 秒(1 分钟)如果至少有 10000 个键发生变化,则保存快照
save 60 10000
此外,dbfilename 用来指定保存的 RDB 文件名,默认是 dump.rdb:
dbfilename dump.rdb
2. AOF(Append Only File)
AOF 持久化是将每个写命令追加到一个日志文件中。Redis 在每次执行写操作时,会将相应的命令以追加的方式写入到 AOF 文件中。AOF 文件记录了 Redis 执行的所有写操作,当 Redis 重启时,它会重新执行 AOF 文件中的命令,以恢复数据。
优点:
- 数据持久性强:AOF 会记录所有的写操作,理论上不会丢失任何数据。
- 配置灵活:可以通过设置 AOF 刷新策略来权衡性能和持久化的可靠性。
缺点:
- 性能开销大:AOF 文件是逐步追加写的,因此每次写操作都需要操作磁盘,这会影响性能。
- 文件较大:由于 AOF 会记录每个写命令,所以 AOF 文件可能比 RDB 文件大得多。
- 恢复速度慢:如果数据量很大,恢复 AOF 文件时需要重新执行所有命令,相较于 RDB 恢复速度较慢。
配置:
在 redis.conf 文件中配置 AOF 持久化策略。以下是常见配置项:
# 启用 AOF 持久化
appendonly yes
# 设置 AOF 文件名,默认是 appendonly.aof
appendfilename "appendonly.aof"
# AOF 刷新策略
# appendfsync always: 每次写操作都同步到磁盘,最安全,但性能差。
# appendfsync everysec: 每秒同步一次,性能和安全之间的折衷。
# appendfsync no: 不主动同步,依赖操作系统的缓存机制,性能最好,但可能会丢失数据。
appendfsync everysec
AOF 重写(文件修剪):
随着时间推移,AOF 文件会不断增长,因为它会记录所有的写操作。为了减小 AOF 文件的大小,Redis 会进行 AOF 重写(rewrite)。AOF 重写会根据当前的内存数据,重新生成一个更小的 AOF 文件,而不需要执行所有命令。
重写操作是自动触发的,但也可以通过命令手动触发:
BGSAVE
3. RDB + AOF 结合使用
Redis 还可以同时启用 RDB 和 AOF,这样就能结合两者的优点。RDB 提供快速的恢复速度,而 AOF 提供更强的持久性。结合使用时,Redis 会优先加载 AOF 文件,如果 AOF 文件不存在或不可用,则使用 RDB 文件。
配置示例:
你可以在 redis.conf 中同时启用 RDB 和 AOF。
# 启用 AOF 持久化
appendonly yes
appendfsync everysec
# 启用 RDB 快照
save 900 1
save 300 10
save 60 10000
4. 禁用持久化
如果你不需要持久化,可以禁用 RDB 和 AOF 以提高性能。配置如下:
# 禁用 RDB 持久化
save ""
# 禁用 AOF 持久化
appendonly no