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、混合持久化 - 知乎

相关推荐
Y编程小白1 小时前
Redis可视化工具--RedisDesktopManager的安装
数据库·redis·缓存
东软吴彦祖3 小时前
包安装利用 LNMP 实现 phpMyAdmin 的负载均衡并利用Redis实现会话保持nginx
linux·redis·mysql·nginx·缓存·负载均衡
DZSpace5 小时前
使用 Helm 安装 Redis 集群
数据库·redis·缓存
github_czy10 小时前
(k8s)k8s部署mysql与redis(无坑版)
redis·容器·kubernetes
等一场春雨17 小时前
CentOS 安装Redis
linux·redis·centos
天天向上杰19 小时前
简识Redis 持久化相关的 “Everysec“ 策略
数据库·redis·缓存
清风-云烟20 小时前
使用redis-cli命令实现redis crud操作
java·linux·数据库·redis·spring·缓存·1024程序员节
draymond710721 小时前
redis-redission的加锁源码与看门狗机制
redis
vd_vd1 天前
Redis内存面试与分析
数据库·redis·面试
Fireworkitte1 天前
Redis线上阻塞要如何排查
数据库·redis·缓存