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.tpcf.cn/news/229946.html

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

相关文章

css的元素显示模式(有单行文字垂直居中,侧边栏等案例)

目录 1. 什么是元素的显示模式 2. 元素显示模式的类型 块元素 行内元素 行内块元素 3. 元素显示模式的转换 4.文字垂直居中 5.具体实现案例 1. 什么是元素的显示模式 定义:元素显示模式就是元素(标签)以什么方式进行显示,…

Mysql 压测

目录 1、mysql查看数据大小 2、mysql配置优化 3、mysql压力测试 4、mysql主从复制原理 5、mysql主从延迟如何解决 6、主从切换操作 1、mysql查看数据大小 怎样查询总数据量 SELECT table_schema AS Database,CONCAT(ROUND(SUM((data_length index_length) / (1024 * 102…

HarmonyOS鸿蒙应用开发——数据持久化Preferences封装

文章目录 数据持久化简述基本使用与封装测试用例参考 数据持久化简述 数据持久化就是将内存数据通过文件或者数据库的方式保存到设备中。HarmonyOS提供两两种持久化方案: Preferences:主要用于保存一些配置信息,是通过文本的形式存储的&…

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

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

【网络安全】网络防护之旅 - Java安全机制探秘与数字证书引爆网络防线

🌈个人主页:Sarapines Programmer🔥 系列专栏:《网络安全之道 | 数字征程》⏰墨香寄清辞:千里传信如电光,密码奥妙似仙方。 挑战黑暗剑拔弩张,网络战场誓守长。 目录 😈1. 初识网络安…

android tv no ad desktop

1. TV xiaomi tv, too many ad and boring destktop. 小米电视去广告及更换第三方桌面操作方法 – MIUI历史版本 2. com.yanggqi.rom.launcher.free.apk. 3. ADB : 注意, adb connect 192.168.0.50 ,无法认证时,要把电视界面返回到上一级才能看到那个…

Web前端-CSS(文本样式)

文章目录 1.font字体1.1 font-size:大小1.2 font-family:字体1.3 font-weight:字体粗细1.4 font-style:字体风格1.5 font总结 2. css外观属性2.1 color:文本颜色2.2 text-align:文本水平对齐方式2.3 line-height:行间距2.4 text-indent:首行缩进2.5 text-decoration 文本的装饰…

挑战52天学小猪佩奇笔记--day25

52天学完小猪佩奇--day25 ​【本文说明】 本文内容来源于对B站UP 脑洞部长 的系列视频 挑战52天背完小猪佩奇----day25 的视频内容总结,方便复习。强烈建议大家去关注一波UP,配合UP视频学习。 注:这集开始变成一段一段的猜台词,加…

代码随想Day39 | 62.不同路径、63. 不同路径 II

62.不同路径 每次向右或者向下走两个选择,定义dp数组dp[i][j] 为到达索引ij的路径和,状态转移公式为 dp[i][j]dp[i-1][j]dp[i][j-1],初始状态的第一行和第一列为1,从左上到右下开始遍历即可。详细代码如下: class Sol…

git push origin master

1、在github上面新建一个仓库,仓库名称就是项目总的名称,里面不要放置任何东西,包括README.md,然后复制仓库的地址 2、在本地项目名称下面的文件夹里面点击鼠标右键,然后点击Git Bash Here 3、使用git init去把这个目…

03 Vue3中的生命周期函数

概述 The Vue component lifecycle events happen during a component’s lifecycle, from creation to deletion. They allow us to add callbacks and side effects at each stage of the component’s life when necessary. Vue 组件生命周期事件发生在组件从创建到删除的…

跟着官网学 Vue - 透传 Attributes

MyButton.vue 这是子组件&#xff0c;它是一个包含按钮的简单组件。它有一个按钮&#xff0c;当按钮被点击时&#xff0c;会触发 handleClick 方法。MyButton 组件中禁用了属性继承&#xff0c;以避免多次触发点击事件。 <!-- MyButton.vue --> <template><!-…

LeetCode day26

LeetCode day26 LCR 189. 设计机械累加器 请设计一个机械累加器&#xff0c;计算从 1、2… 一直累加到目标数值 target 的总和。注意这是一个只能进行加法操作的程序&#xff0c;不具备乘除、if-else、switch-case、for 循环、while 循环&#xff0c;及条件判断语句等高级功能…

Java并发(十九)----Monitor原理及Synchronized原理

1、Java 对象头 以 32 位虚拟机为例 普通对象 |--------------------------------------------------------------| | Object Header (64 bits) | |------------------------------------|-------------------------| | Mark W…

MySQL 报错 You can‘t specify target table for update in FROM clause解决办法

You can’t specify target table for update in FROM clause 其含义是&#xff1a;不能在同一表中查询的数据作为同一表的更新数 单独执行复合查询是正常的&#xff0c;如下&#xff1a; 但是当执行子查询删除命令时&#xff0c;报如下错误 DELETE FROM abpusers WHERE Id I…

简单介绍十款可以免费使用的API测试工具

API开发应该是后端开发最常见的工作&#xff0c;而调试和测试API是非常关键的&#xff0c;这篇文章简单介绍几款常用的工具以供大家参考。 SoapUI SoapUI是很老牌的工具的&#xff0c;在之前Webservice盛行的时候经常会用到。 现在官方推出了Pro版本的ReadyAPI&#xff0c;但要…

Python glob

参考文章&#xff1a; Python 中glob.glob()、glob.iglob&#xff08;&#xff09;的使用-CSDN博客 Python 中glob.glob()的使用 glob.glob(path)的功能&#xff1a; 返回符合path格式的所有文件的路径&#xff0c;以list存储返回。 path的表示方法&#xff1a; 利用匹配符…

数据科学知识库

​ 我的博客是一个技术分享平台&#xff0c;涵盖了机器学习、数据可视化、大数据分析、数学统计学、推荐算法、Linux命令及环境搭建&#xff0c;以及Kafka、Flask、FastAPI、Docker等组件的使用教程。 在这个信息时代&#xff0c;数据已经成为了一种新的资源&#xff0c;而机…

C#监听端口报错“以一种访问权限不允许的方式做了访问套接字的尝试”

C#编写的端口监听程序&#xff0c;平时都能正常运行&#xff0c;但最新操作系统更新补丁重启电脑后&#xff0c;运行程序报错“以一种访问权限不允许的方式做了访问套接字的尝试”&#xff0c;客户端程序也无法连接。   百度错误信息&#xff0c;给出的答案都是端口监听程序使…

ES分词查询

全文检索介绍 全文检索的发展过程&#xff1a; 数据库使用SQL语句&#xff1a;select * from table where data like “%检索内容%”出现lucene全文检索工具&#xff08;缺点&#xff1a;暴露的接口相对复杂&#xff0c;且没有效率&#xff09;出现分布式检索服务框架solr&am…