Redis 持久化 RDB 与 AOF的执行过程


Posted in Redis onNovember 07, 2021

前言

Redis 持久化支持两种方式 RDB 与 AOF,文章记录两者的执行过程与配置。

一、RDB

RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。

1. save 命令

会堵塞当前 Redis 服务器,直到 RDB 结束为止,对数据量较大或者内存较大的实例,会堵塞较长时间,生产环境不建议使用。如果手动执行 save 命令,Redis 会记录下方日志。

127.0.0.1:6379> save
OK

* DB saved on disk

2. bgsave 命令

Redis 进程执行 fork 操作创建子进程,RDB 持久化过程由子进程负责,完成后自动结束。阻塞只发生在 fork 阶段,一般时间很短。如果手动执行 bgsave 命令,Redis 会记录下方日志。

* Background saving started by pid 90338
* DB saved on disk
* RDB: 0 MB of memory used by copy-on-write
* Background saving terminated with success

bgsave 对 save 堵塞进行优化,Redis 内部涉及 RDB 操作都是由 bgsave 完成。

3. 内部触发 RDB 场景

  • 使用 save 相关配置,如 save m n 表示 m 秒内数据集存在 n 次修改时,触发一次 RDB;
  • 从节点执行全量复制操作,主节点自动执行 bgsave 生成 RDB 文件发送给从节点;
  • 执行 debug relad 重新加载 Redis 时,也会触发生产 RDB;
  • 默认情况下,执行 shutdown 关闭 Redis 时,如果没有开启 AOF 持久化功能,则会触发 RDB。

4. RDB 参数配置

通过设置 dir 可以配置 RDB 保存位置 dbfilename 可以设置文件名。

config set dir /opt/redis-5.0.12/backup
config set dbfilename myback.rdb

Redis 默认采用 LZF 算法对生成的RDB文件做压缩处理,压缩后的文件远远小于内存大小,默认开启,可以通过 rdbcompression 参数配置。

config set rdbcompression{yes|no}

压缩 RDB 虽然会消耗 CPU 但是可以大幅度减少文件体积,方便存储或通过网络发送给从节点。

5. RDB 缺点

RDB 方式数据没办法做到实时持久化/秒级持久化。因为 bgsave 每次运行都要执行 fork 操作创建子进程,属于重量级操作,频繁执行成本过高。

RDB文件使用特定二进制格式保存,Redis 版本演进过程中有多个格式的 RDB 版本,存在老版本 Redis 服务无法兼容新版 RDB 格式的问题。

二、AOF

AOF(appendonlyfile)持久化:以独立日志的方式记录每次写命令,重启时再重新执行 AOF 文件中的命令达到恢复数据的目的。AOF 的主要作用是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式。

1. 参数配置

# 配置开启 AOF
config set appendonly yes
# 配置文件名,默认 appendonly.aof
config set appendfilename xxx.aof
# 存储位置配置,与 RDB 一样
config set dir /opt/redis-5.0.12/backup

2. AOF 执行流程

Redis 持久化 RDB 与 AOF的执行过程

所有的命令都会追加到 aof_buf(缓冲区)中;AOF 缓冲区根据对应的策略向磁盘同步操作;随着 AOF 文件越来越大,需要定期对 AOF 重写,达到压缩目的;当 Redis 服务器重启时,可以加载AOF文件进行数据恢复。 3. 重写机制

手动触发:

bgrewriteaof

自动触发,根据下方两个参数设置自动触发机制:

auto-aof-rewrite-min-size
auto-aof-rewrite-percentage

到此这篇关于Redis 持久化 RDB 与 AOF的文章就介绍到这了,更多相关Redis 持久化 RDB 与 AOF内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Redis 相关文章推荐
详解RedisTemplate下Redis分布式锁引发的系列问题
Apr 27 Redis
分布式锁为什么要选择Zookeeper而不是Redis?看完这篇你就明白了
May 21 Redis
详解Redis集群搭建的三种方式
May 31 Redis
了解Redis常见应用场景
Jun 23 Redis
Redis主从配置和底层实现原理解析(实战记录)
Jun 30 Redis
在项目中使用redis做缓存的一些思路
Sep 14 Redis
Redis 持久化 RDB 与 AOF的执行过程
Nov 07 Redis
解决Redis启动警告问题
Feb 24 Redis
源码分析Redis中 set 和 sorted set 的使用方法
Mar 22 Redis
Grafana可视化监控系统结合SpringBoot使用
Apr 19 Redis
详解Redis的三种常用的缓存读写策略步骤
May 06 Redis
Redis 异步机制
May 15 Redis
Redis模仿手机验证码发送的实现示例
redis中lua脚本使用教程
Redis高并发防止秒杀超卖实战源码解决方案
Redis的字符串是如何实现的
SpringBoot集成Redis的思路详解
详解redis在微服务领域的贡献
详解Redis在SpringBoot工程中的综合应用
Oct 16 #Redis
You might like
php使用CURL不依赖COOKIEJAR获取COOKIE的方法
2015/06/17 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
PHP静态成员变量
2017/02/14 PHP
PHP使用HTML5 FileApi实现Ajax上传文件功能示例
2019/07/01 PHP
PHP优化之批量操作MySQL实例分析
2020/04/23 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
去掉gridPanel表头全选框的小例子
2013/07/18 Javascript
仿百度的关键词匹配搜索示例
2013/09/25 Javascript
JS+CSS设置img在DIV中只显示Img垂直居中的部分
2013/10/24 Javascript
js点击选择文本的方法
2015/02/09 Javascript
JavaScript中Function()函数的使用教程
2015/06/04 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
使用BootStrap实现表格隔行变色及hover变色并在需要时出现滚动条
2017/01/04 Javascript
Nodejs之http的表单提交
2017/07/07 NodeJs
AngularJs ng-change事件/指令的用法小结
2017/11/01 Javascript
vue-star评星组件开发实例
2018/03/01 Javascript
JS实现为动态创建的元素添加事件操作示例
2018/03/17 Javascript
python自然语言编码转换模块codecs介绍
2015/04/08 Python
介绍Python的Django框架中的QuerySets
2015/04/20 Python
python简单实现刷新智联简历
2016/03/30 Python
人机交互程序 python实现人机对话
2017/11/14 Python
python爬虫框架scrapy实现模拟登录操作示例
2018/08/02 Python
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
波兰汽车配件网上商店:iParts.pl
2020/09/08 全球购物
自动化专业本科毕业生求职信
2013/10/20 职场文书
自我评价范文分享
2014/01/04 职场文书
中药学专业毕业生推荐信
2014/07/10 职场文书
婚前协议书标准版
2014/10/19 职场文书
2015年前台个人工作总结
2015/04/03 职场文书
24句精辟的现实社会语录,句句扎心,道尽人性
2019/08/29 职场文书
导游词之无锡古运河
2019/11/14 职场文书
go结构体嵌套的切片数组操作
2021/04/28 Golang
mysql 索引合并的使用
2021/08/30 MySQL
python如何读取和存储dict()与.json格式文件
2022/06/25 Python