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 相关文章推荐
Redis RDB技术底层原理详解
Sep 04 Redis
基于Redis结合SpringBoot的秒杀案例详解
Oct 05 Redis
详解Redis在SpringBoot工程中的综合应用
Oct 16 Redis
CentOS8.4安装Redis6.2.6的详细过程
Nov 20 Redis
Redis 中使用 list,streams,pub/sub 几种方式实现消息队列的问题
Mar 16 Redis
sentinel支持的redis高可用集群配置详解
Apr 01 Redis
Redis实战高并发之扣减库存项目
Apr 14 Redis
Redis特殊数据类型Geospatial地理空间
Jun 01 Redis
Redis基本数据类型Set常用操作命令
Jun 01 Redis
关于Redis的主从复制及哨兵问题
Jun 16 Redis
使用Redis实现分布式锁的方法
Jun 16 Redis
Redis实战之Lettuce的使用技巧详解
Dec 24 Redis
Redis模仿手机验证码发送的实现示例
redis中lua脚本使用教程
Redis高并发防止秒杀超卖实战源码解决方案
Redis的字符串是如何实现的
SpringBoot集成Redis的思路详解
详解redis在微服务领域的贡献
详解Redis在SpringBoot工程中的综合应用
Oct 16 #Redis
You might like
PHP四大安全策略
2014/03/12 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
PHP检测用户语言的方法
2015/06/15 PHP
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
ASP.NET jQuery 实例9  通过控件hyperlink实现返回顶部效果
2012/02/03 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
js实现鼠标拖动图片并兼容IE/FF火狐/谷歌等主流浏览器
2013/06/06 Javascript
原生js的弹出层且其内的窗口居中
2014/05/14 Javascript
JavaScript实现自动消除按钮功能的方法
2015/08/05 Javascript
JS区分浏览器页面是刷新还是关闭
2016/04/17 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
jQuery实现弹出带遮罩层的居中浮动窗口效果
2016/09/12 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
详解Python3中ceil()函数用法
2019/02/19 Python
Python实现的银行系统模拟程序完整案例
2019/04/12 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
django的模型类管理器——数据库操作的封装详解
2020/04/01 Python
Python Scrapy图片爬取原理及代码实例
2020/06/12 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
python怎么对数字进行过滤
2020/07/05 Python
python3让print输出不换行的方法
2020/08/24 Python
《埃及的金字塔》教学反思
2014/04/07 职场文书
高中学生自我评价范文
2014/09/23 职场文书
小学感恩节活动策划方案
2014/10/06 职场文书
大学生考试作弊被抓检讨书
2014/12/27 职场文书
鸦片战争观后感
2015/06/09 职场文书
小学见习报告
2015/06/23 职场文书
教学副校长工作总结
2015/08/13 职场文书
初中生活随笔
2015/08/15 职场文书
SpringBoot 集成Redis 过程
2021/06/02 Redis
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android