Redis 持久化

文章目录

1.RDB 快照

RDB(Redis Database)指定时全量快照持久化。

有两个 Redis 命令可用于生成 RDB 文件,一个是 SAVE,另一个是 BGSAVE。

  • SAVE:生成 RDB 快照文件,但是会阻塞主进程,服务器将无法处理客户端发来的命令请求,所以通常不会直接使用该命令。
  • BGSAVE:fork 子进程来生成 RDB 快照文件,阻塞只会发生在 fork 子进程的时候,之后主进程可以正常处理请求

可以手动触发 SAVE 与 BGSAVE 命令。

也可以使用 save point 配置,满足 save point 条件后会自动触发 BGSAVE 来存储一次快照。

save point 格式:save <seconds> <changes>,含义是 Redis 如果在 seconds 秒内数据发生了 changes 次改变,就保存快照文件。例如 Redis 默认配置了以下 3 个:

复制代码
save 900 1 		# 900秒内有1个key发生了变化,则触发保存RDB文件
save 300 10 	# 300秒内有10个key发生了变化,则触发保存RDB文件
save 60 10000	# 60秒内有10000个key发生了变化,则触发保存RDB文件

其优点:

  • 相对于 AOF,RDB 文件体积更小(二进制 + 压缩)
  • 在恢复大数据集时,RDB 比 AOF 更快

其缺点:

  • 不够及时,可能会发生数据丢失。
  • 对于大数据集,生成快照可能会导致主进程阻塞。

工作原理:

  • Redis 调用 fork(),产生一个子进程。
  • 子进程把二进制数据写到一个临时的 RDB 文件。
  • 当子进程写完新的 RDB 文件后,把旧的 RDB 文件替换掉。

2.AOF 日志

AOF(Append-Only File)指持续增量持久化,记录每一次写命令。

AOF 持久化支持不同的同步方式,通过配置 appendfsync 来设置:

  • appendfsync always:主线程同步。很慢,但是很安全。
  • appendfsync everysec:后台线程每间隔 1 秒同步。折中方案。
  • appendfsync no:由 OS 同步。很快,但不安全。

一般情况下都采用 everysec 配置,这样可以兼顾速度与安全,最多损失 1s 的数据。

AOF 解决了数据实时持久化,但我们还会面临另一个问题,数据实时写入 AOF,随着时间的推移,AOF 文件会越来越大,那使用 AOF 恢复时变得非常慢,这该怎么办?

Redis 贴心地提供了 AOF rewrite 方案,俗称「AOF 瘦身」,顾名思义,就是压缩 AOF 的体积。

因为 AOF 里记录的都是每一次写命令,例如执行 set k v1,set k v2,其实我们只关心数据的最终版本 v2 就可以了。AOF rewrite 正是利用了这个特点,在 AOF 体积越来越大时(超过设定阈值),Redis 就会定期重写一份新的 AOF,这个新的 AOF 只记录数据的最终版本就可以了。

3.混合持久化

Redis 4.0 以上版本支持混合持久化。

混合持久化本质是通过 AOF 后台重写(bgrewriteaof 命令)完成的,不同的是当开启混合持久化时,fork 出的子进程先将当前全量数据以 RDB 方式写入新的 AOF 文件,然后再将 AOF 重写缓冲区(aof_rewrite_buf_blocks)的增量命令以 AOF 方式写入到文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的 AOF 文件。

简单来说,当 AOF 在做 rewrite 时,Redis 先以 RDB 格式在 AOF 文件中写入一个数据快照,再把在这期间产生的每一个写命令,追加到 AOF 文件中。

注意:混合持久化是对 AOF rewrite 的优化,这意味着使用它必须基于 AOF + AOF rewrite。

4.从持久化中恢复数据

数据的备份、持久化做完了,我们如何从这些持久化文件中恢复数据呢?

如果一台服务器上有既有 RDB 文件,又有 AOF 文件,该加载谁呢?

其实想要从这些文件中恢复数据,只需要重新启动 Redis 即可。我们还是通过图来了解这个流程:

启动时会先检查 AOF 文件是否存在,如果不存在就尝试加载 RDB。

那么为什么会优先加载AOF呢?因为AOF保存的数据更完整,通过上面的分析我们知道 AOF 基本上最多损失 1s 的数据。


参考文献

AOF 持久化是怎么实现的?- 小林 coding
Redis专题:万字长文详解持久化原理
面试必问的Redis:RDB、AOF、混合持久化 - 知乎

相关推荐
我的golang之路果然有问题18 分钟前
快速了解redis,个人笔记
数据库·经验分享·redis·笔记·学习·缓存·内存
道友老李1 小时前
【存储中间件】Redis核心技术与实战(五):Redis缓存使用问题(BigKey、数据倾斜、Redis脑裂、多级缓存)、互联网大厂中的Redis
redis·缓存·中间件
尤物程序猿12 小时前
【2025面试Java常问八股之redis】zset数据结构的实现,跳表和B+树的对比
数据结构·redis·面试
冰^14 小时前
MySQL VS SQL Server:优缺点全解析
数据库·数据仓库·redis·sql·mysql·json·数据库开发
zru_960214 小时前
Docker 部署 Redis:快速搭建高效缓存服务
redis·缓存·docker
axinawang15 小时前
springboot整合redis实现缓存
spring boot·redis·缓存
Spring小子15 小时前
黑马点评商户查询缓存--缓存更新策略
java·数据库·redis·后端
柯34917 小时前
Redis的过期删除策略和内存淘汰策略
数据库·redis·lfu·lru
bing_15818 小时前
Redis 的单线程模型对微服务意味着什么?需要注意哪些潜在瓶颈?
数据库·redis·微服务
小黑蛋学java18 小时前
Redis-cli常用参数及功能的详细说明
redis