Redis 持久化介绍

概述

持久性指的是将数据写入持久存储,例如固态硬盘(SSD)。Redis 提供了一系列持久化选项。这些包括:

  • RDB(Redis Database):RDB 持久化在指定的时间间隔内对您的数据集执行点时间快照。
  • AOF (Append Only File) : AOF 持久化记录服务器接收到的每个写操作。这些操作可以在服务器启动时再次回放,重建原始数据集。命令使用与 Redis 协议相同的格式进行记录。
  • 无持久性:您可以完全禁用持久性。这有时用于缓存。
  • RDB + AOF:您还可以在同一实例中同时使用 AOF 和 RDB。

RDB

RDB创建数据集的快照

格式

RDB 是一个非常紧凑的单文件(二进制文件 dump.rdb),代表了 Redis 在某个时间点上的数据快照。

生成操作

  • save 同步保存
  • bgsave 异步保存

原理

  • Redis 进行分叉。现在我们有一个子进程和一个父进程。
  • 子进程开始将数据集写入一个临时的关系数据库文件。
  • 当子进程写完新的 RDB 文件后,它会替换旧的文件。

自动持久化

配置文件

save <second> <changes>

这个指令可以设置多次,每个设置定义了一个时间间隔(秒)和该时间内发生的变更次数阈值。

save 900 1
save 300 10
save 60 10000

这意味着:

  • 如果至少有 1 个键被修改,900 秒后自动触发一次 RDB 持久化。
  • 如果至少有 10 个键被修改,300 秒后自动触发一次 RDB 持久化。
  • 如果至少有 10000 个键被修改,60 秒后自动触发一次 RDB 持久化。

满足以上任一条件,RDB 持久化就会被自动触发。

SHUTDOWN 关闭的时候也会进行一次自动持久化

AOF

AOF(Append Only File)文件主要用于增量持久化数据,他会记录redis执行的具体命令序列

格式

  • AOF 文件中的每个命令采用 Redis 协议(RESP,Redis Serialization Protocol)的格式进行序列化。

配置

开启AOF

appendonly yes

设置fsync规则

appendfsync always    # 每次写入数据都同步,保证数据不丢失,但性能较低
appendfsync everysec # 每秒同步一次,折衷方案
appendfsync no # 由操作系统决定何时同步,性能最好,但数据安全性最低

设置重写

auto-aof-rewrite-percentage 100  # 增长到原大小的100%时触发重写
auto-aof-rewrite-min-size 64mb # AOF 文件至少达到64MB时才考虑重写

原理

alt text

策略

为了将缓冲区中的命令持久化到磁盘中的 AOF 文件,Redis 提供了几种不同的同步策略:

  • always:每次写命令都会同步到 AOF 文件,这提供了最高的数据安全性,但可能因为磁盘 I/O 的延迟而影响性能。
  • everysec(默认):每秒同步一次,这是一种折衷方案,提供了较好的性能和数据安全性。如果系统崩溃,最多可能丢失最后一秒的数据。
  • no:只会在 AOF 关闭或 Redis 关闭时执行, 或由操作系统内核触发。在这种模式下,如果发生宕机,那么丢失的数据量由操作系统内核的缓存冲洗策略决定。

重写

AOF文件会随着程序的执行逐渐变多;比如对一个计数器修改100次,就会有一百条记录

AOF重写就是根据当前数据库的状态,生成一份新的AOF数据,此时这100条数据就会压缩成一条,从而节约内存

AOF原理如下(Redis < 7.0):

  1. Redis 进行分叉,因此现在我们有一个子进程和一个父进程。
  2. 子进程开始在临时文件中写入新的 AOF。
  3. 父进程将所有新更改累积在内存缓冲区中(但同时将新更改写入旧的只追加文件,如果重写失败,我们仍然安全)。
  4. 当子进程完成重写文件后,父进程收到信号,并将孩子生成的内存缓冲区追加到文件末尾。
  5. 现在 Redis 将新文件原子性地重命名为旧文件,并开始将新数据追加到新文件中。

当Redis ≥ 7.0时,会有所变化,具体是父进程打开一个新的 AOF 增量文件以继续写入更新,而不再使用内存缓冲区;此举有助于节约内存。

手动执行 AOF 重写的命令是:

bgrewriteaof

实践

同时启用 RDB 和 AOF 被认为是最佳实践:

  • 使用 RDB 进行快照备份。
  • 使用 AOF 保证崩溃后的最大数据完整性。

数据恢复

待补充

参考资料

Redis 持久化 | 文档 — Redis persistence | Docs

作者

deepwzh

发布于

2024-12-31

更新于

2025-02-15

许可协议

评论