iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >一篇文章彻底理解Redis持久化:RDB和AOF
  • 287
分享到

一篇文章彻底理解Redis持久化:RDB和AOF

一篇文章彻底理解Redis持久化:RDB和AOF 2019-05-09 04:05:24 287人浏览 绘本
摘要

理解和掌握Redis的持久机制,对于Redis的日常开发和运维都有很大帮助,也是在大厂面试经常被问到的知识点。 为什么需要持久化? Redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等

一篇文章彻底理解Redis持久化:RDB和AOF

理解和掌握Redis的持久机制,对于Redis的日常开发运维都有很大帮助,也是在大厂面试经常被问到的知识点。

为什么需要持久化?

Redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复。理解和掌握Redis的持久机制,对于Redis的日常开发和运维都有很大帮助,也是在大厂面试经常被问到的知识点。Redis支持的两种持久化机制:

  1. RDB:把当前数据生成快照保存在硬盘上。
  2. AOF:记录每次对数据的操作到硬盘上。

接下来,我们详细了解一下这两种持久化机制。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

RDB持久化

RDB(Redis DataBase)持久化是把当前Redis中全部数据生成快照保存在硬盘上。RDB持久化可以手动触发,也可以自动触发。

手动触发

savebgsave命令都可以手动触发RDB持久化。

save命令

执行save命令会手动触发RDB持久化,但是save命令会阻塞Redis服务,直到RDB持久化完成。当Redis服务储存大量数据时,会造成较长时间的阻塞,不建议使用。

> save
OK

执行后,Redis的日志中记录:

 * DB saved on disk
bgsave命令

执行bgsave命令也会手动触发RDB持久化,和save命令不同是:Redis服务一般不会阻塞。Redis进程会执行fork操作创建子进程,RDB持久化由子进程负责,不会阻塞Redis服务进程。Redis服务的阻塞只发生在fork阶段,一般情况时间很短。

> bgsave
Background saving started

执行后,Redis的日志中记录:

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

bgsave命令的具体流程如下图:

bgsave命令流程

  1. 执行bgsave命令,Redis进程先判断当前是否存在正在执行的RDB或AOF子线程,如果存在就是直接结束。
  2. Redis进程执行fork操作创建子线程,在fork操作的过程中Redis进程会被阻塞。
  3. Redis进程fork完成后,bgsave命令就结束了,自此Redis进程不会被阻塞,可以响应其他命令。
  4. 子进程根据Redis进程的内存生成快照文件,并替换原有的RDB文件。
  5. 子进程通过信号量通知Redis进程已完成。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

自动触发

除了执行以上命令手动触发以外,Redis内部可以自动触发RDB持久化。自动触发的RDB持久化都是采用bgsave的方式,减少Redis进程的阻塞。那么,在什么场景下会自动触发呢?

  1. 在配置文件中设置了save的相关配置,如sava m n,它表示在m秒内数据被修改过n次时,自动触发bgsave操作。
  2. 当从节点做全量复制时,主节点会自动执行bgsave操作,并且把生成的RDB文件发送给从节点。
  3. 执行debug reload命令时,也会自动触发bgsave操作。
  4. 执行shutdown命令时,如果没有开启AOF持久化也会自动触发bgsave操作。

RDB优点

RDB文件是一个紧凑的二进制压缩文件,是Redis在某个时间点的全部数据快照。所以使用RDB恢复数据的速度远远比AOF的快,非常适合备份、全量复制、灾难恢复等场景。

RDB缺点

每次进行bgsave操作都要执行fork操作创建子经常,属于重量级操作,频繁执行成本过高,所以无法做到实时持久化,或者秒级持久化。

另外,由于Redis版本的不断迭代,存在不同格式的RDB版本,有可能出现低版本的RDB格式无法兼容高版本RDB文件的问题。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

AOF持久化

AOF(Append Only File)持久化是把每次写命令追加写入日志中,当需要恢复数据时重新执行AOF文件中的命令就可以了。AOF解决了数据持久化的实时性,也是目前主流的Redis持久化方式。

AOF持久化流程

AOF流程如下图:

AOF流程

  1. 命令追加(append):所有写命令都会被追加到AOF缓存区(aof_buf)中。
  2. 文件同步(sync):根据不同策略将AOF缓存区同步到AOF文件中。
  3. 文件重写(rewrite):定期对AOF文件进行重写,以达到压缩的目的。
  4. 数据加载(load):当需要恢复数据时,重新执行AOF文件中的命令。

文件同步策略

AOF持久化流程中的文件同步有以下几个策略:

  1. always:每次写入缓存区都要同步到AOF文件中,硬盘的操作比较慢,限制了Redis高并发,不建议配置。
  2. no:每次写入缓存区后不进行同步,同步到AOF文件的操作由操作系统负责,每次同步AOF文件的周期不可控,而且增大了每次同步的硬盘的数据量。
  3. eversec:每次写入缓存区后,由专门的线程每秒钟同步一次,做到了兼顾性能和数据安全。是建议的同步策略,也是默认的策略。

触发文件重写

AOF持久化流程中的文件重写可以手动触发,也可以自动触发。

  1. 手动触发:使用bgrewriteaof命令。
  2. 自动触发:根据auto-aof-rewrite-min-size和auto-aof-rewrite-percentage配置确定自动触发的时机。auto-aof-rewrite-min-size表示运行AOF重写时文件大小的最小值,默认为64MB;auto-aof-rewrite-percentage表示当前AOF文件大小和上一次重写后AOF文件大小的比值的最小值,默认为100。只用前两者同时超过时才会自动触发文件重写。

欢迎关注微信公众号:万猫学社,每周一分享Java技术干货。

AOF持久化配置

对AOF持久化的具体流程有了了解后,我们来看一下如何配置AOF。AOF持久化默认是不开启的,需要修改配置文件,如:

# appendonly改为yes,开启AOF
appendonly yes
# AOF文件的名字
appendfilename "appendonly.aof"
# AOF文件的写入方式
# everysec 每个一秒将缓存区内容写入文件 默认开启的写入方式
appendfsync everysec
# 运行AOF重写时AOF文件大小的增长率的最小值
auto-aof-rewrite-percentage 100
# 运行AOF重写时文件大小的最小值
auto-aof-rewrite-min-size 64mb

微信公众号:万猫学社

微信扫描二维码

获得更多Java技术干货

您可能感兴趣的文档:

--结束END--

本文标题: 一篇文章彻底理解Redis持久化:RDB和AOF

本文链接: https://www.lsjlt.com/news/6012.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Redis 彻底禁用RDB持久化操作
    Redis 禁用RDB持久化 Redis是默认开启RDB的,AOF则是默认关闭的。如果需要关闭RDB,将Redis完全作为一个缓存使用,需要修改配置项save。 开启save “”,...
    99+
    2024-04-02
  • 怎么掌握Redis持久化RDB和AOF
    本篇内容介绍了“怎么掌握Redis持久化RDB和AOF”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、为...
    99+
    2024-04-02
  • Redis如何彻底禁用RDB持久化操作
    本篇内容主要讲解“Redis如何彻底禁用RDB持久化操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Redis如何彻底禁用RDB持久化操作”吧!Redis 禁用RDB持久化Redis是默认开启...
    99+
    2023-06-20
  • 如何进行Redis持久化RDB和AOF的分析
    如何进行Redis持久化RDB和AOF的分析,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Redis持久化方案Redis是内存数据库,数据都是...
    99+
    2024-04-02
  • Redis RDB与AOF持久化方式详细讲解
    目录1.RDB持久化1.1 RDB文件的保存1.2 RDB文件的载入1.3 RDB持久化时服务器的状态1.4 RDB持久化策略2.AOF持久化2.1 持久化的实现2.2 文件的载入与数据还原2.3 AOF文件的重写1.R...
    99+
    2022-11-22
    RedisRDB与AOF Redis持久化方式
  • Redis中RDB和AOF持久化模式缺陷是什么
    这篇文章主要介绍了Redis中RDB和AOF持久化模式缺陷是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、RDB持久化模式缺陷1、问...
    99+
    2024-04-02
  • redis中RDB和AOF持久化的优缺点是什么
    小编给大家分享一下redis中RDB和AOF持久化的优缺点是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Redis 提供了 RDB 和 AOF 两种持久化方案:RDB:生成指定时间间...
    99+
    2024-04-02
  • 图解Redis,谈谈Redis的持久化,RDB快照与AOF日志
    目录 专栏导读 一、RDB持久化 1、自动触发 2、手动触发 3、设置保存条件 4、加解密 5、R...
    99+
    2023-09-21
    redis 数据库 分布式
  • 一篇文章带你彻底搞懂Redis 事务
    目录Redis 事务简介Redis 事务基本指令实例分析Redis 事务与 ACID总结Redis 事务简介 Redis 只是提供了简单的事务功能。其本质是一组命令的集合,事务支持一...
    99+
    2022-11-13
    redis有几种部署方式 redis事务三大特性 redis怎么做到事务回滚
  • 一篇文章带你彻底搞懂Redis 事务
    目录Redis 事务简介Redis 事务基本指令实例分析Redis 事务与 ACID总结Redis 事务简介 Redis 只是提供了简单的事务功能。其本质是一组命令的集合,事务支持一次执行多个命令,在事务执行过程中,会顺...
    99+
    2024-04-02
  • 一篇文章带你彻底搞懂VUE响应式原理
    目录响应式原理图编译创建compile类操作fragment获取元素节点上的信息获取文本节点信息操作fragment响应式数据劫持收集依赖响应式代码完善Dep类全局watcher用完...
    99+
    2024-04-02
  • 一篇文章彻底搞懂Python类属性和方法的调用
    目录一、类、对象概述二、类的定义与使用三、类属性和类方法的调用四、私有成员与公有成员总结Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象...
    99+
    2024-04-02
  • 一篇文章让你彻底了解Java可重入锁和不可重入锁
    可重入锁  广义上的可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁(前提得是同一个对象或者class),这样的锁就叫做可重入锁。 ...
    99+
    2024-04-02
  • cookie是什么?有什么用?cookie详解,一篇文章彻底搞懂cookie
    Cookie是什么         cookie的中文翻译是曲奇,小甜饼的意思。cookie其实就是一些数据信息,类型为“小型文本文件”,存储于电脑上的文本文件中。 Cookie有什么用         我们想象一个场景,当我们打开一个网...
    99+
    2023-08-31
    java 服务器 后端 网络协议
  • Redis做数据持久化的解决方案及底层原理
    目录数据持久化RDB生成方法savebgsave优点缺点AOFAOF记录过程ServerCron作用server.hz写入策略End之前的文章介绍了Redis的简单数据结构的相关使用...
    99+
    2024-04-02
  • 一文搞懂MySQL持久化和回滚的原理
    目录redo log为什么要先更新内存数据,不直接更新磁盘数据?为什么需要redo log?redo log是如何实现的?为什么一个block设计成512字节?为什么要两段式提交?c...
    99+
    2024-04-02
  • 一文彻底理解js原生语法prototype,__proto__和constructor
    目录1 前言2 前置知识点 2.1 数据类型 2.2 判断是否是自身属性(hasOwnProperty)3 一点小思考3.1 修改 constructor 3.1.1 instanc...
    99+
    2024-04-02
  • Redis做数据持久化的解决方案及底层原理是什么
    本篇内容介绍了“Redis做数据持久化的解决方案及底层原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!目录数据持久化RDB生成方法s...
    99+
    2023-06-20
  • 一篇文章带你从java字节码层理解i++和++i
    目录程序目的关键指令i++示例源码使用jclasslib查看i++字节码++i示例源码参考总结程序目的 从java字节码层理解,为何i = i++后,结果是+1之前的数值。而i=++...
    99+
    2024-04-02
  • 一篇文章让你轻松理解C++中vector和list区别
    目录一张表格让你理解vector和list区别例子总结一张表格让你理解vector和list区别 区别vectorlist数据结构:顺序表(动态数组)环形双向链表物理空间:连续的非连...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作