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实现限流的三种方式
Apr 27 Redis
redis 查看所有的key方式
May 07 Redis
Redis IP地址的绑定的实现
May 08 Redis
Java Socket实现Redis客户端的详细说明
May 26 Redis
redis实现的四种常见限流策略
Jun 18 Redis
Springboot/Springcloud项目集成redis进行存取的过程解析
Dec 04 Redis
Redis高可用集群redis-cluster详解
Mar 20 Redis
解决redis批量删除key值的问题
Mar 23 Redis
使用Redis做预定库存缓存功能
Apr 02 Redis
windows安装 redis 6.2.6最新步骤详解
Apr 26 Redis
Redis实现订单过期删除的方法步骤
Jun 05 Redis
redis lua限流算法实现示例
Jul 15 Redis
Redis模仿手机验证码发送的实现示例
redis中lua脚本使用教程
Redis高并发防止秒杀超卖实战源码解决方案
Redis的字符串是如何实现的
SpringBoot集成Redis的思路详解
详解redis在微服务领域的贡献
详解Redis在SpringBoot工程中的综合应用
Oct 16 #Redis
You might like
PHP 计算代码执行耗时的代码修正网上普遍错误
2011/05/14 PHP
PHP采用XML-RPC构造Web Service实例教程
2014/07/16 PHP
网站防止被刷票的一些思路与方法
2015/01/08 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
php使用socket调用http和smtp协议实例小结
2019/07/26 PHP
PHP迭代器和生成器用法实例分析
2019/09/28 PHP
各浏览器对link标签onload/onreadystatechange事件支持的差异分析
2011/04/27 Javascript
如何改进javascript代码的性能
2015/04/02 Javascript
基于JS实现textarea中获取动态剩余字数的方法
2016/05/25 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
微信小程序教程系列之新建页面(4)
2017/04/17 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
ztree实现左边动态生成树右边为内容详情功能
2017/11/03 Javascript
深入理解Vue官方文档梳理之全局API
2017/11/22 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
利用JavaScript缓存远程窃取Wi-Fi密码的思路详解
2018/11/05 Javascript
vue实现微信获取用户信息的方法
2019/03/21 Javascript
如何使用JavaScript实现栈与队列
2019/06/24 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
pyenv命令管理多个Python版本
2017/03/26 Python
Python内置模块hashlib、hmac与uuid用法分析
2018/02/12 Python
python中字符串变二维数组的实例讲解
2018/04/03 Python
用Python shell简化开发
2018/08/08 Python
python获取本机所有IP地址的方法
2018/12/26 Python
解决python flask中config配置管理的问题
2019/07/26 Python
Python PIL图片添加字体的例子
2019/08/22 Python
一道SQL面试题
2012/12/31 面试题
2015年党员公开承诺书范文
2015/01/22 职场文书
军事理论课感想
2015/08/11 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
广告文案的撰写技巧(实用干货)
2019/08/23 职场文书