1、Redis 持久化——混合持久化

RDB 和 AOF 持久化各有利弊,RDB 可能会导致一定时间内的数据丢失,而 AOF 由于文件较大则会影响 Redis 的启动速度,为了能同时使用 RDB 和 AOF 各种的

优点,Redis 4.0 之后新增了混合持久化的方式

在开启混合持久化的情况下,AOF 重写时会把 Redis 的持久化数据,以 RDB 的格式写入到 AOF 文件的开头,之后的数据再以 AOF 的格式化追加的文件的末尾。

混合持久化的数据存储结构如下图所示:

1、开启混合持久化

查询是否开启混合持久化可以使用 config get aof-use-rdb-preamble 命令,执行结果如下图所示:

其中 yes 表示已经开启混合持久化,no 表示关闭,Redis 5.0 默认值为 yes。 如果是其他版本的 Redis 首先需要检查一下,是否已经开启了混合持久化,如果关闭的情况下,

可以通过以下两种方式开启:

  • 通过命令行开启

  • 通过修改 Redis 配置文件开启

2、通过命令行开启

使用命令 config set aof-use-rdb-preamble yes 执行结果如下图所示:

小贴士:命令行设置配置的缺点是重启 Redis 服务之后,设置的配置就会失效。

3、通过修改 Redis 配置文件开启

在 Redis 的根路径下找到 redis.conf 文件,把配置文件中的 aof-use-rdb-preamble no 改为 aof-use-rdb-preamble yes 如下图所示:

2、实例运行

当在混合持久化关闭的情况下,使用 bgrewriteaof 手动触发 AOF 文件重写之后,查看 appendonly.aof 文件的持久化日志,如下图所示:

可以看出,当混合持久化关闭的情况下 AOF 持久化文件存储的为标准的 AOF 格式的文件。 当混合持久化开启的模式下,使用 bgrewriteaof 命令触发 AOF 文件重写,

得到 appendonly.aof 的文件内容如下图所示:

可以看出 appendonly.aof 文件存储的内容是 REDIS 开头的 RDB 格式的内容,并非为 AOF 格式的日志。

3、数据恢复和源码解析

混合持久化的数据恢复和 AOF 持久化过程是一样的,只需要把 appendonly.aof 放到 Redis 的根目录,在 Redis 启动时,

只要开启了 AOF 持久化,Redis 就会自动加载并恢复数据。 Redis 启动信息如下图所示:

可以看出 Redis 在服务器初始化的时候加载了 AOF 文件的内容。

a、混合持久化的加载流程

混合持久化的加载流程如下:

  • 1、判断是否开启 AOF 持久化,开启继续执行后续流程,未开启执行加载 RDB 文件的流程;

  • 2、判断 appendonly.aof 文件是否存在,文件存在则执行后续流程;

  • 3、判断 AOF 文件开头是 RDB 的格式, 先加载 RDB 内容再加载剩余的 AOF 内容;

  • 4、判断 AOF 文件开头不是 RDB 的格式,直接以 AOF 格式加载整个文件。

AOF 加载流程图如下图所示:

4、手动重写 与 自动重写

a、手动重写

AOF 重写程序 aof_rewrite 函数可以创建一个新 AOF 文件, 但是该函数会进行大量的写入操作,调用这个函数的线程将被长时间阻塞,

所以 Redis 将 AOF 重写程序放到 fork 的子进程里执行,不会阻塞父进程,重写命令:

bgrewriteaof
  • 子进程进行 AOF 重写期间,服务器进程(父进程)可以继续处理命令请求

  • 子进程带有服务器进程的数据副本,使用子进程而不是线程,可以在避免使用锁的情况下, 保证数据安全性



子进程在进行 AOF 重写期间,服务器进程还需要继续处理命令请求,而新命令可能会对现有的数据库状态进行修改,

从而使得服务器当前的数据库状态和重写后的 AOF 文件所保存的数据库状态不一致,所以 Redis 设置了 AOF 重写缓冲区

工作流程:

  • Redis 服务器执行完一个写命令,会同时将该命令追加到 AOF 缓冲区和 AOF 重写缓冲区(从创建子进程后才开始写入)

  • 当子进程完成 AOF 重写工作之后,会向父进程发送一个信号,父进程在接到该信号之后, 会调用一个信号处理函数,该函数执行时会对服务器进程(父进程)造成阻塞(影响很小,类似 JVM STW),主要工作:

    • 将 AOF 重写缓冲区中的所有内容写入到新 AOF 文件中, 这时新 AOF 文件所保存的状态将和服务器当前的数据库状态一致

    • 对新的 AOF 文件进行改名,原子地(atomic)覆盖现有的 AOF 文件,完成新旧两个 AOF 文件的替换

b、自动重写

触发时机:Redis 会记录上次重写时的 AOF 大小,默认配置是当 AOF 文件大小是上次重写后大小的一倍且文件大于 64M 时触发

  auto-aof-rewrite-min-size size		#设置重写的基准值,最小文件 64MB,达到这个值开始重写
auto-aof-rewrite-percentage percent #触发AOF文件执行重写的增长率,当前AOF文件大小超过上一次重写的AOF文件大小的百分之多少才会重写,比如文件达到 100% 时开始重写就是两倍时触发

自动重写触发比对参数( 运行指令 info Persistence 获取具体信息 ):

  aof_current_size					#AOF文件当前尺寸大小(单位:字节)
aof_base_size #AOF文件上次启动和重写时的尺寸大小(单位:字节)

自动重写触发条件公式:

  • aof_current_size > auto-aof-rewrite-min-size
  • (aof_current_size - aof_base_size) / aof_base_size >= auto-aof-rewrite-percentage

Redis 持久化——混合持久化的更多相关文章

  1. redis 的备份策略,最好使用:RDB-AOF 混合持久化

    相关资料: Redis 4.0 新功能简介:RDB-AOF 混合持久化:http://blog.huangz.me/2017/redis-rdb-aof-mixed-persistence.html ...

  2. redis持久化(RDB、AOF、混合持久化)

    redis持久化(RDB.AOF.混合持久化) 1. RDB快照(snapshot) 在默认情况下, Redis 将内存数据库快照保存在名字为 dump.rdb 的二进制文件中. 你可以对 Redis ...

  3. redis 系列17 持久化 AOF

    一.概述 除了上篇介绍的RDB持久化功能之外,Redis还提供了AOF(Append Only File)持久化功能.与RDB保存数据库中的键值对来记录数据库状态不同,AOF是通过保存redis服务器 ...

  4. redis数据结构、持久化、缓存淘汰策略

    Redis 单线程高性能,它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题.redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放 ...

  5. redis两种持久化方式RDB和AOF

    目录 前言 1. Redis 数据库结构 2. RDB 持久化 2.1. RDB 的创建和载入 2.1.1. 手动触发保存 SAVE 命令 BGSAVE 命令 SAVE 和 BGSAVE 的比较 2. ...

  6. Redis的数据持久化

    介绍 Redis 的数据持久化方案 Redis 的数据持久化主要有两大机制,AOF 日志和 RDB 快照. AOF 持久化是通过保存 Redis 服务器所执行的写命令来记录数据库状态. RDB 持久化 ...

  7. 微服务 - Redis缓存 · 数据结构 · 持久化 · 分布式 · 高并发

    本篇内容基于 Redis v7.0 的阐述:官网:https://redis.io/ 本篇计划用 Docker 容器辅助部署,所以需要了解点 Docker 知识:官网:https://www.dock ...

  8. Redis两种持久化方式(RDB&AOF)

    爬虫和转载请注明原文地址;博客园蜗牛:http://www.cnblogs.com/tdws/p/5754706.html Redis所需内存 超过可用内存怎么办 Redis修改数据多线程并发—Red ...

  9. Redis提供的持久化机制(RDB和AOF)

    Redis提供的持久化机制 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却 ...

  10. Redis学习手册(持久化)

    一.Redis提供了哪些持久化机制: 1). RDB持久化:    该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘.        2). AOF持久化:    该机制将以日志的形式记录服务 ...

随机推荐

  1. 对象流的序列化与反序列化:ObjectInputStream 和 ObjectOutputStream

    1.对象流: ObjectInputStream 和 ObjectOutputStream2.作用:ObjectOutputStream:内存中的对象--->存储中的文件.通过网络传输出去:序列 ...

  2. 一个简单的大转盘抽奖程序(附.NetCore Demo源码)

    最近闲下来在做一些demo,现在讲一下做的一个简单的大转盘抽奖demo,前端lottery,layui,后端.net core,sqlsugar,数据库用的mysql 1.前端实现: 前端用的是基于开 ...

  3. ceph数据重构原理

    本文分享自天翼云开发者社区<ceph数据重构原理>,作者:x****n 在分布式存储系统Ceph中,硬盘故障是一种常见问题.为了保证数据安全,当发生硬盘故障后,分布式存储系统会依据算法对故 ...

  4. TCP 和 UDP 可以使用同一个端口吗?

    文档地址:https://mp.weixin.qq.com/s/3fMZN_LidCi5fiD16nNWWA

  5. [Jaav SE/程序生命周期] 优雅的Java应用程序的启停钩子框架

    序 了解 spring 生态及框架的 java er 都知道,spring 应用的生命周期管理及配套接口较为优雅.可扩展. 但脱离 spring 的 java 应用程序,如何优雅地启停.管理程序的生命 ...

  6. SpringBoot 2.x 接入非标准SSE格式大模型流式响应实践 🚀

    近期DeepSeek等国产大模型热度持续攀升,其关注度甚至超过了OpenAI(被戏称为CloseAI).在SpringBoot3.x环境中,可以使用官方的Spring AI轻松接入,但对于仍在使用JD ...

  7. AngleSharp :在 C# 中轻松解析和操作 HTML/XML 文档

    AngleSharp 是一个 C# 库,主要用于解析和操作 HTML 和 XML 文档,类似于浏览器的 DOM 操作.允许你在 C# 中使用类似浏览器的方式处理网页数据,进行网页抓取.数据提取和处理等 ...

  8. 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 🌐

    title: 从零构建你的第一个RESTful API:HTTP协议与API设计超图解指南 date: 2025/2/26 updated: 2025/2/26 author: cmdragon ex ...

  9. 低代码 + DeepSeek:赋能开发者,效率飞跃新高度

    活字格接入 DeepSeek 前段时间,小编陆续发布了关于葡萄城旗下产品 Wyn 和 SpreadJS 成功接入DeepSeek的技术文章,分享了两款产品与 DeepSeek 集成后的功能优势和应用场 ...

  10. 机器学习 | 强化学习(3) | 无模型预测(Model-Free Prediction)

    无模型预测(Model-Free Prediction) 无模型预测概论 上一节课<通过DP求解>可以解决一个已知的马尔科夫决策过程 本节课 实践无模型预测 解决或者估计一个未知马尔科夫决 ...