Redis - RDB与AOF持久化技术

Redis 持久化技术

RDB 是默认持久化方式,但 Redis 允许 RDB AOF 两种持久化技术同时
开启,此时系统会使用 AOF 方式做持久化,即 AOF 持久化技术的优先级要更高。同样的道
理,两种技术同时开启状态下,系统启动时若两种持久化文件同时存在,则优先加载 AOF
持久化文件。


RDB 持久化

RDB Redis DataBase ,是指将内存中某一时刻的数据快照 全量 写入到指定的 rdb 文件的
持久化技术。 RDB 持久化默认是开启的。当 Redis 启动时会自动读取 RDB 快照文件,将数据 从硬盘载入到内存,以恢复 Redis 关机前的数据库状态。
RDB 持久化的执行有三种方式:手动 save 命令、手动 bgsave 命令,与自动条件触发。
手动 save 命令,手动 bgsave 命令
通过在 redis-cli 客户端中执行 save 命令可立即进行一次持久化保存。 save 命令在执行期
间会阻塞 redis-server 进程,直至持久化过程完毕。而在 redis-server 进程阻塞期间, Redis
不能处理任何读写请求,无法对外提供服务。
通过在 redis-cli 客户端中执行 bgsave 命令可立即进行一次持久化保存。不同于 save
令的是,正如该命令的名称一样, background save ,后台运行 save bgsave 命令会使服务器
进程 redis-server 生成一个子进程,由该子进程负责完成保存过程。在子进程进行保存过程
中,不会阻塞 redis-server 进程对客户端读写请求的处理。
自动条件触发
自动条件触发的本质仍是 bgsave 命令的执行。只不过是用户通过在配置文件中做相应
的设置后, Redis 会根据设置信息自动调用 bgsave 命令执行。
RDB 持久化过程

在进行持久化过程中,如果 redis-server 进程接收到了用户写请求,则系统会将 

内存中发生数据修改的物理块 copy 出一个副本。等内存中的全量数据 copy 结束后,会再将
副本中的数据 copy RDB 临时文件。这个副本的生成是由于 Linux 系统的 写时复制技术
Copy-On-Write )实现的
写时复制技术是 Linux 系统的一种进程管理技术。
原本在 Unix 系统中,当一个主进程通过 fork() 系统调用创建子进程后,内核进程会复制主进
程的整个内存空间中的数据,然后分配给子进程。这种方式存在的问题有以下几点:
这个过程非常耗时
这个过程降低了系统性能
如果主进程修改了其内存数据,子进程副本中的数据是没有修改的。即出现了数据冗余,
而冗余数据最大的问题是数据一致性无法保证。
现代的 Linux 则采用了更为有效的方式:写时复制。子进程会继承父进程的所有资源,其中
就包括主进程的内存空间。即子进程与父进程共享内存。只要内存被共享,那么该内存就是
只读的(写保护的)。而写时复制则是在任何一方需要写入数据到共享内存时都会出现异常,
此时内核进程就会将需要写入的数据 copy 出一个副本写入到另外一块非共享内存区域。

 

 


AOF 持久化

AOF Append Only File ,是指 Redis 将每一次的写操作都以日志的形式记录到一个 AOF
文件中的持久化技术。当需要恢复内存数据时,将这些写操作重新执行一次,便会恢复到之
前的内存数据状态。
默认情况下 AOF 持久化是没有开启的,通过修改配置文件中的 appendonly 属性为 yes
可以开启。
Redis 7 发生了重大变化。原来只有一个 appendonly.aof 文件,现在具有了三类多个
文件:
基本文件:可以是 RDF 格式也可以是 AOF 格式。其存放的内容是由 RDB 转为 AOF
时内存的快照数据。该文件可以有多个。
增量文件:以操作日志形式记录转为 AOF 后的写入操作。该文件可以有多个。
清单文件:用于维护 AOF 文件的创建顺序,保障激活时的应用顺序。该文件只有一个。
混合式持久化开启
对于基本文件可以是 RDF 格式也可以是 AOF 格式。通过 aof-use-rdb-preamble 属性可以
选择。其默认值为 yes ,即默认 AOF 持久化的基本文件为 rdb 格式文件,也就是默认采用混
合式持久化。
AOF 文件格式
AOF 文件包含三类文件:基本文件、增量文件与清单文件。其中基本文件一般为 rdb
式,在前面已经研究过了。下面就来看一下增量文件与清单文件的内容格式。
增量文件扩展名为 .aof ,采用 AOF 格式。 AOF 格式其实就是 Redis 通讯协议格式, AOF
持久化文件的本质就是基于 Redis 通讯协议的文本,将命令以纯文本的方式写入到文件中。
清单文件 appendonly.aof.manifest
该文件首先会按照 seq 序号列举出所有基本文件,基本文件 type 类型为 b ,然后再按照
seq 序号再列举出所有增量文件,增量文件 type 类型为 i
对于 Redis 启动时的数据恢复,也会按照该文件由上到下依次加载它们中的数据。
rewrite
随着使用时间的推移, AOF 文件会越来越大。为了防止 AOF 文件由于太大而占用大量
的磁盘空间,降低性能, Redis 引入了 Rewrite 机制来对 AOF 文件进行压缩。
所谓 Rewrite 其实就是对 AOF 文件进行重写整理。当 Rewrite 开启后,主进程 redis-server
创建出一个子进程 bgrewriteaof ,由该子进程完成 rewrite 过程。其首先对现有 aof 文件进行
rewrite 计算,将计算结果写入到一个临时文件,写入完毕后,再 rename 该临时文件为原 aof
文件名,覆盖原有文件。
Rewrite 过程的执行有两种方式。一种是通过 bgrewriteaof 命令手动开启,一种是通过
设置条件自动开启。
appendfsync
当客户端提交写操作命令后,该命令就会写入到 aof_buf 中,而 aof_buf 中的数据持久
化到磁盘 AOF 文件的过程称为数据同步。
何时将 aof_buf 中的数据同步到 AOF 文件?采用不同的数据同步策略,同时的时机是不
同的,有三种策略:
always :写操作命令写入 aof_buf 后会立即调用 fsync() 系统函数,将其追加到 AOF 文件。
该策略效率较低,但相对比较安全,不会丢失太多数据。最多就是刚刚执行过的写操作
在尚未同步时出现宕机或重启,将这一操作丢失。
no :写操作命令写入 aof_buf 后什么也不做,不会调用 fsync() 函数。而将 aof_buf 中的
数据同步磁盘的操作由操作系统负责。 Linux 系统默认同步周期为 30 秒。效率较高。
everysec :默认策略。写操作命令写入 aof_buf 后并不直接调用 fsync() ,而是每秒调用
一次 fsync() 系统函数来完成同步。该策略兼顾到了性能与安全,是一种折中方案。

 

aof-rewrite-incremental-fsync
bgrewriteaof 在执行过程也是先将 rewrite 计算的结果写入到了 aof_rewrite_buf 缓存
中,然后当缓存中数据达到一定量后就会调用 fsync() 进行刷盘操作,即数据同步,将数据写
入到临时文件。该属性用于控制 fsync() 每次刷盘的数据量最大不超过 4MB 。这样可以避免由
于单次刷盘量过大而引发长时间阻塞。
AOF 持久化过程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/283457.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

neuq-acm预备队训练week 9 P1119 灾后重建

解题思路 本题可以用最短路算法——Floyd AC代码 #include<bits/stdc.h> #define inf 1e9 using namespace std; const int N 2e2 50; int n, m, q, now 0, a, b, c, t[N], G[N][N];int main() {scanf("%d%d", &n, &m);for(int i 0;i<n;i)sc…

弹性网络优化算法

3.3、Elastic-Net算法使用 这是scikit-learn官网给出的弹性网络回归的&#xff0c;损失函数公式&#xff0c;注意&#xff0c;它用的矩阵表示&#xff0c;里面用到范数运算。 min ⁡ w 1 2 n samples ∣ ∣ X w − y ∣ ∣ 2 2 α ρ ∣ ∣ w ∣ ∣ 1 α ( 1 − ρ ) 2 ∣ ∣…

FPGA实现 TCP/IP 协议栈 客户端 纯VHDL代码编写 提供4套vivado工程源码和技术支持

目录 1、前言版本更新说明免责声明 2、相关方案推荐我这里已有的以太网方案1G 千兆网 TCP-->服务器 方案10G 万兆网 TCP-->服务器客户端 方案常规性能支持多节点FPGA资源占用少数据吞吐率高低延时性能 4、TCP/IP 协议栈代码详解代码架构用户接口代码模块级细讲顶层模块PA…

AtCoder Beginner Contest 332 G. Not Too Many Balls(最大流转最小割 dp)

题目 n(n<500)种球&#xff0c;第i种有ai(0<ai<1e12)个球&#xff0c; m(m<5e5)个盒子&#xff0c;第j个能放bj(0<bj<1e12)个球 特别地&#xff0c;第j个盒子最多能放i*j个第i种球 求m个盒子能放的最多的球的总数 思路来源 官方题解 题解 显然是一个最…

关于“Python”的核心知识点整理大全26

目录 10.3.9 决定报告哪些错误 10.4 存储数据 10.4.1 使用 json.dump()和 json.load() number_writer.py number_reader.py 10.4.2 保存和读取用户生成的数据 对于用户生成的数据&#xff0c;使用json保存它们大有裨益&#xff0c;因为如果不以某种方式进行存储&#xf…

CyclicBarrier学习一

一、定义 CyclicBarrier 字面意思回环栅栏&#xff08;循环屏障&#xff09;&#xff0c;通过它可以实现让一组线程等待至某个状态&#xff08;屏障点&#xff09;之后再全部同时执行。叫做回环是因为当所有等待线程都被释放以后&#xff0c;CyclicBarrier可以被重用。 CyclicB…

C++入门【9-C++循环】

C 循环 有的时候&#xff0c;可能需要多次执行同一块代码。一般情况下&#xff0c;语句是顺序执行的&#xff1a;函数中的第一个语句先执行&#xff0c;接着是第二个语句&#xff0c;依此类推。 编程语言提供了允许更为复杂的执行路径的多种控制结构。 循环语句允许我们多次…

代码随想录-刷题第三十天

332. 重新安排行程 题目链接&#xff1a;332. 重新安排行程 直觉上来看这道题和回溯法没有什么关系&#xff0c;更像是图论中的深度优先搜索。 这道题算是图论里深搜的题目&#xff0c;可以用回溯法的套路来解这道题目&#xff0c;算是拓展一下思路&#xff0c;原来回溯法还…

[Big Bird]论文解读:Big Bird: Transformers for Longer Sequences

文章目录 1 介绍2 模型架构3 结果 论文&#xff1a;Big Bird: Transformers for Longer Sequences 作者&#xff1a;Manzil Zaheer, Guru Guruganesh, Avinava Dubey, Joshua Ainslie, Chris Alberti, Santiago Ontanon, Philip Pham, Anirudh Ravula, Qifan Wang, Li Yang, Am…

[计网00] 计算机网络开篇导论

目录 前言 计算机网络的概念 计算机网络的分层 计算机网络的分类 网络的标准化工作和相关组织 计算机网络的性能指标 前言 计算机网络在我们的日常生活中无处不在 在网络会有各种各样的协议和封装 保证我们的信息完整,无误的在各个客户端之前传输 计算机网络的概念 四…

c语言 文件与文件操作

&#x1f3e0; 一.引言 我们日常生活中会将我们制作的ppt,word等存放在文件里进行归类&#xff0c;你是否知道我们能用cC语言对文件进行操作呢(比如文件的打开&#xff0c;关闭和读写等)&#xff1f;那接下来跟博主一起来学习下吧。 &#x1f3e0;二.什么是文件 磁盘上的文件就…

TCP/IP详解——FTP 协议,Telnet协议

文章目录 1. FTP 协议1.1 FTP的应用1.2 FTP传输文件的过程1.3 FTP传输模式1.4 主动模式&#xff08;Active Mode&#xff09;1.5 Active Mode 抓包分析1.6 被动模式&#xff08;Passive Mode&#xff09;1.7 Passive Mode 抓包分析 2. Telnet 协议2.1 Telnet 概念2.2 Telnet 协…