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.RDB持久化

 首先,RDB持久化方式会产生一个经过压缩的二进制文件,Redis服务器在启动之初,通过这个文件可以还原数据库的状态。那么我们接下来看下RDB文件是如何实现保存和载入的。

1.1 RDB文件的保存

 RDB文件的保存有两个命令可以实现,分别是savebgsave,执行后都会生成新的RDB文件,区别是save会阻塞服务器的进程,直到RDB文件创建完成为止,期间服务器不能处理任何客户端的命令请求。而bgsave通过派生出一个子进程,由子进程来完成RDB文件的创建,期间服务器正常处理客户端的命令请求。其实这两个命令的底层实现方式都一样,只不过一个是主进程来做,另一个是通过子进程来完成。

 在redis.conf文件中,有两个参数是和rdb的文件保存相关:

// 这个是rdb文件的名称
dbfilename dump.rdb
// 这个是rdb文件的保存路径,这是相对路径,相对于redis-server的启动路径
dir ./

1.2 RDB文件的载入

 在redis服务器启动之初,会去查找有没有rdb的持久化文件存在,如果有就会自动载入,当然前提是没有开启aof持久化的功能。在rdb载入期间会,服务器处于阻塞装填,直到载入工作完全结束。

1.3 RDB持久化时服务器的状态

save命令执行期间,所有客户端命令都会被拒绝执行。

bgsave命令执行期间,客户端发送的savebgsave命令会被拒绝执行,但是客户端发送的bgrewriteaof不会拒绝但会被阻塞,直到当前的bgsave命令执行完毕。但是值得说明的是,如果服务器在执行bgrewriteaof命令期间,客户端发送的bgsave命令会被服务器拒绝。当然这是站在性能角度考虑,否则fock出两个子进程,大量的进行磁盘的读写,会影响整个服务器的性能。

1.4 RDB持久化策略

 用户可以通过配置文件给RDB的持久化设置保存策略,看一下redis.conf文件中的配置:

save 900 1
save 300 10
save 60 10000

 以上的默认配置可以表示为:服务器在900秒之内,至少进行了1次的修改,在300秒之内至少进行了10次修改,在60秒之内至少进行了10000次修改。这三种策略只要满足一个,即可触发RDB的持久化。

 这里需要了解一下,Redis是怎么基于这些配置策略实现自动化间歇性保存RDB文件的,还是回到RedisServer这个这个结构体的源码中看一下:

struct redisServer {
    // 数组,用于保存redis.conf配置的持久化策略
    struct saveparam *saveparams;   /* Save points array for RDB */
    // 上面这个数组的长度
    int saveparamslen;              /* Number of saving points */
    // 记录上一次持久化到现在服务器修改了多少键值对
    long long dirty;                /* Changes to DB from the last save */
    // 记录上一次RDB持久化的UNIX时间戳
    time_t lastsave;                /* Unix time of last successful save */
}

 在redisServer中,有saveparams数组专门保存我们配置的持久化策略,这里使用到了saveparam这个结构体,看一下源码:

struct saveparam {
	// 这里是配置文件save的第1个参数
    time_t seconds;
    // 这里是配置文件save的第2个参数
    int changes;
};

 这样,配置文件中的持久化策略就记录到了redisServer.saveparam属性中,还是会基于serverCron这个时间事件函数,100ms执行一次,每次会检查 dirty 和 lastsave 记录的修改键值对数量和时间差,是否匹配到了saveparam中配置的持久化策略,如果命中就进行新一轮的RDB持久化。

2.AOF持久化

 和RDB不同,AOF是通过记录Redis服务器中执行的写命令来记录数据库状态的,类似于mysql的binlog,当然保存的内容是经过协议转换的命令。在服务器启动之初,通过载入和执行AOF文件中的命令来还原数据库的状态。

2.1 持久化的实现

 在服务器执行命令之后,并不是立刻写入aof文件中,而是先写入 aof_buf缓冲区里面,这也是redisServer的一个属性结构:

struct redisServer {
    // aop缓冲区,记录服务器写入的命令
    sds aof_buf;      /* AOF buffer, written before entering the event loop */
}

 我们再看一下redis.conf关于aof持久化的一个配置:

// 这个表示每次执行都会写入
# appendfsync always
// 这个表示每秒写入一次
appendfsync everysec
// 这个由操作系统决定,无法控制
# appendfsync no

 AOF实现持久化的原理是这样的,客户端执行的命令会先记录到 redisServer.aof_buf 中,然后基于配置文件的appendfsync策略决定什么时候同步到AOF文件中。这里的同步也会经过两个步骤:

  • aof_buf 内容写入到操作系统文件缓存 pagecache;
  • pagecache 落盘写入到屋里磁盘设备中;

 我们知道Redis是基于Reactor网络模型,不断进行事件循环,每进行一轮的事件循环,都会执行步骤1,所以从aof_buf 到 pagecache总是会发生。但是步骤2就跟appendfsync有关系了:

  • always表示只要步骤1发生,步骤2也会发生,所以是最安全,但是效率最慢的一个。
  • everysec表示步骤1发生后,步骤2每秒执行一次落盘,是效率和数据安全折中的方案,停机故障时有丢失1秒钟数据的风险。
  • no表示步骤1发生后,何时落盘由操作系统决定,数据丢失风险大,效率也一般,因为数据量过大,单次落盘的时间也最长。

 默认配置是everysec,即每秒执行一次数据落盘保存。

2.2 文件的载入与数据还原

 因为AOF文件中包含了重建数据库状态的所有写命令,所以服务器只要读入并全部执行一遍就可以完成数据库状态的还原。服务器在启动之初,会创建一个不带网络连接的伪客户端来做这件事,在载入命令完成后,这个客户端的使命就结束了。

2.3 AOF文件的重写

 随着写入到AOF文件的命令越来越多,这个文件体积会越来大,会对宿主机或文件还原造成一定的影响,所以需要通过AOF文件的重写来解决文件体积膨胀的问题。

 AOF文件重写并不是对现有AOF文件进行处理,而是基于数据库当前的状态来实现的。服务器会从数据库中读取键对应的值,然后用一条命令去记录键值对,代替之前可能存在的多条命令,写入到一个新的AOF文件中,这就是AOF重写功能实现的原理。需要注意的是,对于某些元素比较多的集合或者列表(默认配置是64个),这个一条命令可能拆分成多条实现,避免造成客户端输入缓冲区溢出的情况。

 和bgsave一样,AOF重写的动作也是放到子进程去执行,这样可以保证父进程可以继续处理名请求。但是这里会有一个问题,就是AOF文件重写期间,父进程处理命令请求之后,会和重写AOF文件时的数据库状态不一致。Redis解决这个问题的方法是设置一个AOF重写缓冲区,子进程一单创建并且开始重写命令之后,父进程处理的所有写命令请求都会记录到AOF重写缓冲区。当子进程重写工作完成之后,会生成一个新的AOF文件,向父进程发送一个信号,父进程在接受此信号,开始执行以下工作:

  • 将AOF重写缓冲区的内容写入到新的AOF文件中,保证新文件和服务器当前的状态一致;
  • 对新的AOF文件改名,并原子的替换现有的AOF文件,完成新旧文件的替换。

 以上两步,父进程会造成服务器进程的阻塞,但其他时间,都不会阻塞,整个重写动作对服务器性能的影响降到了最低,以上就是bgrewriteaof命令的实现原理。

到此这篇关于Redis RDB与AOF持久化方式详细讲解的文章就介绍到这了,更多相关Redis RDB与AOF内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

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

    目录 前言 一.RDB 1. save 命令 2. bgsave 命令 3. 内部触发 RDB 场景 4. RDB 参数配置 5. RDB 缺点 二.AOF 1. 参数配置 2. AOF 执行流程 前言 Redis 持久化支持两种方式 RDB 与 AOF,文章记录两者的执行过程与配置. 一.RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发. 1. save 命令 会堵塞当前 Redis 服务器,直到 RDB 结束为止,对数据量较大或者

  • Redis持久化RDB和AOF区别详解

    RDB是Redis内存到硬盘的快照,用于redis持久化,创建RDB二进制文件,将存储在内存中的数据,持久化的放到硬盘中,当我们需要这些数据的时候,启动载入RDB文件,数据将会被存入内存中,其实RDB就是一种快照的方式持久化存储数据,也可以作为一种复制媒介,这个我们后面在谈. RDB 触发机制--主要三种方式 save 同步命令(会阻塞redis) bgsave 异步命令(fork) 自动 Save同步命令 save 文件策略:生成一个临时文件,如果存在老的文件,将会替换旧文件 bgsave 异

  • Redis两种持久化方案RDB和AOF详解

    本文主要针对Redis 有两种持久化方案RDB和AOF做了详细的分析,希望我们整理的内容能够帮助大家对这个两种方案有更加深入的理解. Redis 有两种持久化方案,RDB (Redis DataBase)和 AOF (Append Only File).如果你想快速了解和使用RDB和AOF,可以直接跳到文章底部看总结.本章节通过配置文件,触发快照的方式,恢复数据的操作,命令操作演示,优缺点来学习 Redis 的重点知识持久化. RDB 详解 RDB 是 Redis 默认的持久化方案.在指定的时间

  • Redis中AOF与RDB持久化策略深入分析

    目录 写在前面 一.Redis为什么要持久化 二.Redis的持久化方式 2.1. AOF持久化(Append of file) 2.1.1 fsync 系统调用 2.1.2 AOF持久化策略 2.1.3 aof_rewrite 2.2 RDB快照(redis默认持久化方式) 触发方式(自动触发和非自动触发) 2.3 RDB和AOF混用 2.4 三种持久化方式比较 三.什么是大key以及大key对持久化的影响 3.1 什么是大key 3.2 fork进程写时复制原理 3.3 面试题-大key对持

  • C/C++读取大文件数据方式详细讲解

    目录 前言 第一种方法 第二种方法 第三种方法 解决 前言 以前对C语言与C++不够了解时,我无法知道如何完整获取一个文件的所有数据并且不遗漏掉. 在网络上也搜索了很多很多的相关帖子,但是没有一个是真正有用的. 本文章使用C语言进行演示,如需使用C++的话原理为一样的. 以下列出那些没用的代码 第一种方法 // 创建一个变量,然后使用FILE指针打开一个文件 // 用fgetc函数与循环代码不断将数据读取到变量中 uint8_t data[4096]; FILE *fp = fopen("文件路

  • 浅谈redis内存数据的持久化方式

    一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的.所以,我们需要将内存中的数据持久化!典型的需要持久化数据的场景如下: 将Redis作为数据库使用: 将Redis作为缓存服务器使用,但是缓存miss后会对性能造成很大影响,所有缓存同时失效时会造成服务雪崩,无法响应. 本文介绍Redis所支持的两种数据持久化方式. 二.Redis数据持久化 Redis支持两种数据持久化方式:RDB

  • redis的2种持久化方案深入讲解

    前言 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表,集 合和有序集合.支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能.所以Redis也可以被看成是一个数据结构服务 器. Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为"半持久化模式"):也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为&q

  • Redis数据持久化方式技术解析

    RDB(Redis DataBases) 1.RDB是什么: 在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是Snapshot快照,它恢复时是将快照文件直接读到内存里. Redis会单独创建(fork)一个子进程来进行持久化,会将数据写入到一个临时文件中,持久化过程都结束了,再用这个临时文件替换上次持久化好的文件.整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能,如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式是要比AOF方式更加的高效.RDB的

  • Redis高可用之持久化

    目录 一.高可用 什么是高可用 二.Redis持久化 持久化功能 RDB持久化 触发条件 bgsave执行流程 AOF持久化 执行流程 命令追加 文件写入和文件同步 文件重写 文件重写流程 三.RDB和AOF的优缺点 RDB持久化的优缺点 优点 缺点 AOF持久化优缺点 四.Redis性能管理 查看Redis内存使用 内存碎片率 内存碎片如何产生 跟踪内存碎片率 解决碎片率大的问题 内存使用率 内回收key 回收策略 五.Redis的优化 一.高可用 什么是高可用 在web服务器中,高可用是指服

  • Redis RDB技术底层原理详解

    每日一句 低头是一种能力,它不是自卑,也不是怯弱,它是清醒中的嬗变.有时,稍微低一下头,或者我们的人生路会更精彩. 前提概要 Redis是一个的键-值(K-V)对的内存数据库服务,通常包含了任意个非空数据库.而每个非空的键值数据库中又可以存放任意个K-V,基本的结构如下图所示: Redis的强劲性能很大程度上是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中以某种形式同步到硬盘中,这一过程就是持久化. 我们知道redis中缓存的数据都存放在内存中

  • redis数据的两种持久化方式对比

    一.概念介绍 redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Apend Only File). RDB方式 RDB方式是一种快照式的持久化方法,将某一时刻的数据持久化到磁盘中. •redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时文件替换上次持久化好的文件.正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的. •对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而

随机推荐