Redis 提供了两种主要的持久化方式,可以将内存中的数据保存到磁盘,防止服务器重启导致数据丢失。
1. RDB (Redis Database) 持久化
RDB 是一种快照存储持久化方式,具体就是将 Redis 某一时刻的内存数据保存到 硬盘的文件当中,默认保存的文件名为 dump.rdb,而在 Redis 服务器启动时, 会重新加载 dump.rdb 文件的数据到内存当中恢复数据。
1.1. 开启 RDB 持久化的 3 种方式
- 客户端发送 save 命令:
- 当客户端向服务器发送 save 命令请求进行持久化时,服务器会阻塞 save 命令之后的其他客户端的请求,直到数据同步完成。
- 如果数据量大,同步数据会执行很久,而这期间 Redis 服务器也无法接 收其他请求,所以生产环境不推荐使用 save 命令。
- 客户端发送 bgsave 命令:
- 当客户端发服务发送 bgsave 命令时,Redis 服务器主进程会 forks 一个子进程来同步数据,将数据保存到 rdb 文件之后子进程会退出。所以,与 save 命令相比,使用 bgsave 命令同步数据时主进程仍然可以接收其他请求。
- 但 forks 子进程是同步的,所以 forks 子进程时,一样不能接收其他请求。这意味着,如果 fork s一个子进程花费的时间太久(一般是很快的),bgsave 命令仍然有阻塞其他客户的请求的情况发生。
- 配置服务器自动触发:
- 除了通过客户端发送命令外,还可以在 Redis 配置文件中指定到达触发RDB 持久化的条件。条件成立则自动进行数据持久化。
- 示例:
save 900 1 # 900秒(15分钟)内有至少1个key被改变
save 300 10 # 300秒(5分钟)内有至少10个key被改变
save 60 10000 # 60秒内有至少10000个key被改变
dbfilename dump.rdb # RDB文件名
dir ./ # 存储目录
rdbcompression yes # 是否压缩RDB文件
# 注意:配置文件中的 save 并不是上面介绍的 save 命令,而是一个配置项,通过配置文件触发的 RDB 持久化都是异步的,会 forks 一个子进程来进行。
Bash1.2. RDB 持久化流程
- 生成临时 rdb 文件,并将内存数据写入。
- 完成数据写入,删除原来的 rdb 文件。
- 用临时文代替代正式 rdb 文件。
1.3. RDB 持久化的优缺点
- 优点:
- 与AOF方式相比,通过 rdb 文件恢复数据比较快。
- rdb 文件可以启用压缩(
rdbcompression yes
),减少磁盘占用。 - 由于 RDB 进行数据持久化使用子进程,所以对 Redis 服务器性能影响较小。
- 缺点:
- 可能丢失较多数据
- RDB 是定时快照,如果 Redis 崩溃,最后一次快照后的数据会丢失(取决于
save
配置,如save 900 1
表示 15 分钟至少 1 次变更才触发备份)。 - 不适合对数据丢失零容忍的场景。
- RDB 是定时快照,如果 Redis 崩溃,最后一次快照后的数据会丢失(取决于
- 大数据量时可能阻塞服务
- 虽然子进程负责持久化,但如果数据量很大(如几十 GB),fork() 子进程可能短暂阻塞主进程(尤其在物理机上内存较大时)。
- 在极端情况下,可能导致 Redis 短暂不可用。
- 可能丢失较多数据
2. AOF (Append-Only File) 持久化
与 RDB 存储某个时刻的快照不同,AOF 持久化方式会记录客户端对服务器的每一次写操作命令,并将这些写操作日志追加(Append)方式写入以 .aof 为后缀的文件中。在 Redis 服务器重启时,会加载并运行 .aof 文件的命令,以达到恢复数据的目的。
2.1. 开启 AOF 持久化的方式
Redis 默认不开启 AO F持久化方式,我们可以在配置文件中开启并进行更加详细 的配置,如下所示:
# redis.conf
# 开启 aof 机制
appendonly yes
# aof 文件名
appendfilename "appendonly.aof"
# 写入策略
appendfsync always
# always:每条命令都同步,最安全但性能最低。
# everysec:默认写入策略,每秒写入一次 aof 文件,最多可能会丢失1s的数据。
# no:由操作系统来决定什么时候写入 aof 文件,数据容易丢失,不推荐使用。
# 保存目录,目录必须存在
dir /a/b/c/redis/
Bash2.2. AOF 文件重写
AOF (Append Only File) 是 Redis 持久化机制之一,它通过记录所有写操作命令来保证数据安全。随着运行时间增长,AOF 文件会不断膨胀,因此 Redis 提供了 AOF 重写机制来优化文件大小。
AOF 重写的核心目的:
- 体积压缩:消除冗余命令,将多个操作合并为最终状态
- 性能优化:减少 AOF 文件体积,提高恢复速度
AOF 重写触发方式:
# 方式一:客户端命令触发
# 让服务器异步重写追加 aof 文件命令
bgrewriteaof
# 方式二:配置参数自动触发
# redis.cong 配置文件添加触发规则
auto-aof-rewrite-percentage 100 # 当前AOF文件比上次重写后体积增长100%时触发
auto-aof-rewrite-min-size 64mb # AOF文件最小达到64MB才考虑重写
BashAOF 重写相关配置:
# 用于控制 AOF 重写期间的持久化行为,控制 AOF 重写时是否暂停主进程的 fsync 操作
no-appendfsync-on-rewrite no
# no(默认值):AOF 重写期间,主进程继续正常执行 fsync(根据 appendfsync 配置)
# yes:AOF 重写期间,主进程暂停 fsync,牺牲部分数据安全性以换取更高的重写性能
# 子进程每生成 32MB AOF 数据就主动调用 fsync 同步到磁盘。
aof-rewrite-incremental-fsync yes
Bash2.3. AOF 文件损坏修复
在写入 aof 日志文件时,如果 Redis 服务器宕机,则 aof 日志文件文件会出格式错 误。在重启 Redis 服务器时,Redis 服务器会拒绝载入这个 aof 文件。可以通过以 下步骤修复 aof 并恢复数据:
- 先备份 aof 损坏的文件,防止修复时发生意外。
- 使用
redis-check-aof
命令修复 aof 文件,示例如下:
# 修复 aof 日志文件
redis-check-aof -fix file.aof
Bash- 重启 Redis 服务器,加载已经修复的 aof 文件恢复数据。
2.4. AOF 持久化优缺点
优点:
- 遇故障时丢的数据量少
- AOF 只是追加日志文件,因此对服务器性能影响较小,备份的速度比 RDB 要 快消耗的内存较少。
缺点:
- AOF 生成的日志文件太大,即使通过AOF重写日志文件体积仍然很大。
- 恢复数据的速度比 RDB 慢。
3. 混合持久化 (RDB + AOF,Redis 4.0+)
在 Redis 4.0 及以上版本中,可以通过 混合持久化(RDB + AOF) 结合两者的优点,既能快速恢复数据(RDB 优势),又能保证较低的数据丢失风险(AOF 优势)。
混合持久化配置步骤:
redis.conf
配置文件
# 启用 AOF 持久化(必须开启,否则混合持久化不生效)
appendonly yes
# 启用混合持久化(Redis 4.0+ 支持)
aof-use-rdb-preamble yes
# AOF 文件名(默认:appendonly.aof)
appendfilename "appendonly.aof"
# AOF 同步策略(推荐 everysec,兼顾性能和数据安全)
appendfsync everysec
# AOF 重写时是否使用 RDB 快照(混合持久化依赖此配置)
aof-rewrite-incremental-fsync yes
# RDB 快照配置(可选,但建议保留)
save 900 1 # 15 分钟内至少 1 次修改则触发 RDB
save 300 10 # 5 分钟内至少 10 次修改
save 60 10000 # 1 分钟内至少 10000 次修改
dbfilename dump.rdb # RDB 文件名
Bash- 重启 Redis 使配置生效
混合持久化文件结构:
启用后,AOF 文件(appendonly.aof
)的内容会变成:
- 前半部分:RDB 二进制格式(存储快照时的数据)。
- 后半部分:AOF 文本格式(存储快照后的增量命令)。