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延迟队列的实现代码
May 13 Redis
了解Redis常见应用场景
Jun 23 Redis
Redis性能监控的实现
Jul 09 Redis
Redisson实现Redis分布式锁的几种方式
Aug 07 Redis
在项目中使用redis做缓存的一些思路
Sep 14 Redis
基于Redis结合SpringBoot的秒杀案例详解
Oct 05 Redis
redis中lua脚本使用教程
Nov 01 Redis
Redis中缓存穿透/击穿/雪崩问题和解决方法
Dec 04 Redis
Redis命令处理过程源码解析
Feb 12 Redis
redis数据一致性的实现示例
Mar 18 Redis
使用Redis实现点赞取消点赞的详细代码
Mar 20 Redis
浅谈Redis 中的过期删除策略和内存淘汰机制
Apr 03 Redis
Redis模仿手机验证码发送的实现示例
redis中lua脚本使用教程
Redis高并发防止秒杀超卖实战源码解决方案
Redis的字符串是如何实现的
SpringBoot集成Redis的思路详解
详解redis在微服务领域的贡献
详解Redis在SpringBoot工程中的综合应用
Oct 16 #Redis
You might like
PHP 高手之路(三)
2006/10/09 PHP
PHP文件操作方法汇总
2015/07/01 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
原生PHP实现导出csv格式Excel文件的方法示例【附源码下载】
2019/03/07 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
js类中的公有变量和私有变量
2008/07/24 Javascript
基于jquery的textarea发布框限制文字字数输入(添加中文识别)
2012/02/16 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
jquery实现的鼠标拖动排序Li或Table
2014/05/04 Javascript
对之前写的jquery分页做下升级
2014/06/19 Javascript
jQuery焦点控制图层展示延迟隐藏的方法
2015/03/09 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
初识angular框架后的所思所想
2016/02/19 Javascript
js 上传文件预览的简单实例
2016/08/16 Javascript
Canvas + JavaScript 制作图片粒子效果
2017/02/08 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
通俗易懂地解释JS中的闭包
2017/10/23 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
jQuery子选择器与可见性选择器实例分析
2019/06/28 jQuery
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
[01:01:52]DOTA2-DPC中国联赛正赛 iG vs LBZS BO3 第一场 3月4日
2021/03/11 DOTA
Python 文件操作技巧(File operation) 实例代码分析
2008/08/11 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
删除python pandas.DataFrame 的多重index实例
2018/06/08 Python
Python使用一行代码获取上个月是几月
2018/08/30 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
Python 保存矩阵为Excel的实现方法
2019/01/28 Python
Pygame的程序开始示例代码
2020/05/07 Python
pyecharts在数据可视化中的应用详解
2020/06/08 Python
html5的新玩法——语音搜索
2013/01/03 HTML / CSS
护理学中专毕业生求职信
2013/11/11 职场文书
创先争优一句话承诺
2014/05/29 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
python 命令行传参方法总结
2021/05/25 Python