乐趣区

一文读懂Redis持久化方式

Redis 持久化

RDB 快照

在默认情况下,Redis 将内存数据库快照保存到 dump.rdb 的二进制文件中。
可以对 Redis 进行设置,让它在“N 秒内数据集至少有 N 个改动”,这一条件被满足时,自动保存一次数据集。比如说:让 Redis 满足“60 秒内至少有 1000 个键被改动”这一个条件时,自动保存一次数据集。

save 60 1000

除了在配置文件中使用 save 关键字设置 RDB 快照,还可以在命令行中手动执行命令生成 RDB 快照,进入 redis 客户端执行命令 save 或 bgsave 可以生成 dump.rdb 文件。
每次执行命令都会将所有 redis 内存快照保存到一个 rdb 文件里,并覆盖原有的 rdb 快照文件。
save 是同步命令,bgsave 是异步命令,bgsave 会从 redis 主进程 fork 出一个子进程专门用来生成 rdb 二进制文件。

AOF(append only file)

快照功能并不是非常 durable,如果 redis 因为某些原因而造成故障停机,那么服务器将丢失最近写入且未保存到快照中的那些数据。从 1.1 版本,redis 增加了一种完全 durable 的方式:AOF 持久化,将修改的每一条指令记录进 appendonly.aof 中。修改配置文件来打开 aof 功能:

appendonly yes

打开 aof 功能,每当 redis 执行一个改变数据集的命令时,这个命令就会追加到 aof 文件的末尾。这样的话,当 redis 重新启动时,程序就会通过执行 aof 文件中的命令来达到重建数据集的目的。
可以配置 redis 多久才将命令持久化到磁盘一次。

appendfsync always:每次有新命令追加到 aof 文件时就执行一个持久化,非常慢但是安全
appendfsync everysec:每秒执行一次持久化,足够快(和使用 rdb 持久化差不多)并且在故障时只会丢失 1 秒钟的数据
appendfsync no:从不持久化,将数据交给操作系统来处理。redis 处理命令速度加快但是不安全。

默认情况下,每秒执行一次 fsync,这种 fsync 策略可以兼顾安全性和速度。
rdb 和 aof 的区别:

redis 启动时如果既有 rdb 文件又有 aof 文件则优先选择 aof 文件恢复数据,因为 aof 文件一般来说数据更安全一点。

二、AOF 重写
aof 文件里可能有太多“琐碎”指令,所以 aof 会定期根据内存的最新数据重新生成 aof 文件
有两个配置可以控制 aof 自动重写的频率:

auto-aof-rewrite-min-size 64mb:aof 文件至少要达到 64m 才会触发制动重写,文件太小恢复速度本来就很快,重写的意义不大

auto-aof-rewrite-percentage 100:aof 文件上一次重写后文件大小增长了 100% 则再次触发重写

当然 aof 还可以手动重写,进入 redis 客户端执行命令 bgrewriteaof 重写 aof。
触发 aof 重写时,redis 会 fork 一个子进程去做,不会对 redis 正常命令处理有太多影响。

Redis 4.0 混合持久化

重启 redis 恢复数据集时,很少会使用 rdb 来恢复内存状态,因为会丢失大量数据。通常会使用 aof 日志恢复数据,但是重放 aof 日志性能相对 rdb 来说要慢很多,这样在 redis 实例很大的情况下,启动需要花费很长时间。Redis4.0 为了解决这个问题,带来了新的持久化选项——混合持久化。

aof-use-rdb-preamble yes

混合持久化 aof 文件结构:

如果开启了混合持久化,aof 在重写时,不再是单纯将内存数据转换为 RESP 命令写入 aof 文件,而是将重写这一刻之前的内存做 rdb 快照处理,并且将 rdb 快照内容和增量的 aof 修改内存数据的命令存在一起,都写入新的 aof 文件,新的 aof 文件一开始不叫 appendonly.aof,等到重写完成后,新的 aof 文件才会进行改名,原子的覆盖原有的 aof 文件,完成新旧两个 aof 文件的替换。
于是在 redis 重启的时候,可以先加载 rdb 文件,然后再重放增量的 aof 日志就可以完全替代之前的 aof 全量文件重放,因此重启效率大幅得到提高。

还没关注我的公众号?

  • 扫文末二维码关注公众号【小强的进阶之路】可领取如下:
  • 学习资料:1T 视频教程:涵盖 Javaweb 前后端教学视频、机器学习 / 人工智能教学视频、Linux 系统教程视频、雅思考试视频教程;
  • 100 多本书:包含 C /C++、Java、Python 三门编程语言的经典必看图书、LeetCode 题解大全;
  • 软件工具:几乎包括你在编程道路上的可能会用到的大部分软件;
  • 项目源码:20 个 JavaWeb 项目源码。

退出移动版