redis如何实现持久化

RDB快照

RDB是一种快照存储持久化方式,具体就是将Redis某一时刻的内存数据保存到硬盘的文件当中,默认保存的文件名为dump.rdb,而在Redis服务器启动时,会重新加载dump.rdb文件的数据到内存当中恢复数据。

开启RDB持久化方式

开启RDB持久化方式很简单,客户端可以通过向Redis服务器发送save或bgsave命令让服务器生成rdb文件,或者通过服务器配置文件指定触发RDB条件。每次执行都会将所有redis内存快照到一个新的rdb文件里,并覆盖原有rdb快照文件。

方式一:save命令

在这里插入图片描述
在这里插入图片描述

当客户端向服务器发送save命令请求进行持久化时,服务器会阻塞save命令之后的其他客户端的请求,直到数据同步完成。 如果数据量太大,同步数据会执行很久,而这期间Redis服务器也无法接收其他请求,所以,最好不要在生产环境使用save命令。

方式二:bgsave命令

在这里插入图片描述

在这里插入图片描述

当客户端发服务发出bgsave命令时,Redis服务器主进程会forks一个子进程来解决数据同步问题,在将数据保存到rdb文件之后,子进程会退出。

所以,与save命令相比,Redis服务器在处理bgsave采用子线程进行IO写入,而主进程仍然可以接收其他请求,但forks子进程是同步的,所以forks子进程时,一样不能接收其他请求,这意味着,如果forks一个子进程花费的时间太久(一般是很快的),bgsave命令仍然有阻塞其他客户的请求的情况发生。

我们可以控制单个Redis实例的最大内存,来尽可能降低Redis在fork时的事件消耗。以及上面提到的自动触发的频率减少fork次数,或者使用手动触发,根据自己的机制来完成持久化。

方式三:通过配置文件自动触发

自动触发的场景主要是有以下几点:

1.根据我们的 save m n 配置规则自动触发;
2.从节点全量复制时,主节点发送rdb文件给从节点完成复制操作,主节点会触发 bgsave;
3.执行 debug reload 时;
4.执行shutdown时,如果没有开启aof,也会触发。

这里我们讲的是根据配置文件自动触发:

在这里插入图片描述

save和bgsave对比

在这里插入图片描述

RDB文件

前面介绍了三种让服务器生成rdb文件的方式,无论是由主进程生成还是子进程来生成,其过程如下:

生成临时rdb文件,并写入数据。

完成数据写入,用临时文件替代正式rdb文件。

删除原来的db文件。

COW写时复制(copy-on-write)

fork创建出的子进程,与父进程共享内存空间。也就是说,如果子进程不对内存空间进行写入操作的话(Redis的子进程只做数据落盘的操作,也不会去写数据),内存空间中的数据并不会复制给子进程,这样创建子进程的速度就很快了!(不用复制,直接引用父进程的物理空间,玩的是指针)

在这里插入图片描述
当Redis父进程修改数据时,父进程会将原先的数据复制一份生成新的副本,然后修改父进程的指针,指向新的数据,此时父进程修改的新的数据不会影响到子进程。此时子进程的指针仍然指向旧的数据,子进程看到的数据还是bgsave时候的数据。当下一次执行bgsave时,新fork出来的子进程指针才会指向这次新的数据。

在这里插入图片描述

AOF(append-only file)

与RDB存储某个时刻的快照不同,AOF持久化方式会记录客户端对服务器的每一次写操作命令,并将这些写操作以追加的方式保存到以后缀为aof文件中,在Redis服务器重启时,会加载并运行aof文件的命令,以达到恢复数据的目的。

开启AOF持久化的方式

方式一:bgrewriteaof命令

在这里插入图片描述

方式二:通过配置文件自动触发

Redis默认不开启AOF持久化方式,我们可以在配置文件中开启并进行更加详细的配置:

在这里插入图片描述

重写

AOF将客户端的每一个写操作都追加到aof文件末尾,比如对一个key多次执行incr命令,这时候,aof保存每一次命令到aof文件中,aof文件会变得非常大。

在这里插入图片描述

这是一种resp协议格式数据,星号后面的数字代表命令有多少个参数,$号后面的数字代表这个参数有几个字符

在这里插入图片描述

手动执行重写命令BGREWRITEAOF:
在这里插入图片描述

重写后AOF文件里如下,将多个incr命令进行了合并:

在这里插入图片描述

重写配置参数

AOF重写redis会fork出一个子进程去做(与bgsave命令类似),不会对redis正常命令处理有太多影响:

auto‐aof‐rewrite‐min‐size 64mb #aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就 很快,重写的意义不大
auto‐aof‐rewrite‐percentage 100 #aof文件自上一次重写后文件大小增长了100%则再次触发重写,例如上一次重写的大小是64M,那么下一次达到128M再做重写

AOF重写流程图

在这里插入图片描述
在重写期间,由于主进程依然在响应命令,为了保证最终备份的完整性;因此它依然会写入旧的AOF file中,如果重写失败,能够保证数据不丢失。

为了把重写期间响应的写入信息也写入到新的文件中,因此也会为子进程保留一个buf,防止新写的file丢失数据。

重写是直接把当前内存的数据生成对应命令,并不需要读取老的AOF文件进行分析、命令合并。

不管是RDB还是AOF都是先写入一个临时文件,然后通过 rename 完成文件的替换工作。

混合持久化

重启 Redis 时,我们很少使用 RDB来恢复内存状态,因为会丢失大量数据。我们通常使用 AOF 日志重放,但是重放 AOF 日志性能相对 RDB来说要慢很多,这样在 Redis 实例很大的情况下,启动需要花费很长的时间。Redis 4.0 为了解决这个问题,带来了一个新的持久化选项——混合持久化。通过如下配置可以开启混合持久化(前提必须先开启aof):

aof‐use‐rdb‐preambleyes #开启混合持久化

如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。于是在 Redis 重启的时候,可以先加载 RDB 的内容,然后再重放增量 AOF 日志就可以完全替代之前的 AOF 全量文件重放,因此重启效率大幅得到提升。

127.0.0.1:6379> set k 1
OK
127.0.0.1:6379> set k 2
OK
127.0.0.1:6379> BGREWRITEAOF
Background append only file rewriting started

查看此时的appendonly.aof文件:此时存放的是RDB的内容

[root@redis 6379]# cat appendonly.aof
REDIS0009� redis-ver5.0.7�
�edis-bits�@�ctime�%y�_used-mem��aof-preamble���k� readcount�� R��i9$�[root@redis 6379]#

如果新增加了数据:

127.0.0.1:6379> set k 3
OK

那么新的数据会以为RESP命令的方式追加在后面:

[root@redis 6379]# cat appendonly.aof
REDIS0009� redis-ver5.0.7�
�edis-bits�@�ctime�%y�_used-mem��aof-preamble���k� readcount�� R��i9$�*2
$6
SELECT
$1
0
*3
$3
set
$1
k
$1
3

混合持久化AOF文件结构如下:
在这里插入图片描述

从持久化中恢复数据

数据的备份、持久化做完了,我们如何从这些持久化文件中恢复数据呢?如果一台服务器上有既有RDB文件,又有AOF文件,该加载谁呢?

其实想要从这些文件中恢复数据,只需要重新启动Redis即可。我们还是通过图来了解这个流程:
在这里插入图片描述

启动时会先检查AOF文件是否存在,如果不存在就尝试加载RDB。那么为什么会优先加载AOF呢?因为AOF保存的数据更完整,通过上面的分析我们知道AOF基本上最多损失1s的数据。

RDB和AOF对比:
在这里插入图片描述

另外RBD不支持拉链,只有一个dump.rdb文件

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

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

相关文章

【CEEMDAN-WOA-LSTM】完备集合经验模态分解-鲸鱼优化-长短时记忆神经网络研究(Python代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

MATLAB 之 可视化图形用户界面设计

这里写目录标题 一、可视化图形用户界面设计1. 图形用户界面设计窗口1.1 图形用户界面设计模板1.2 图形用户界面设计窗口 2. 可视化图形用户界面设计工具1.1 对象属性检查器2.2 菜单编辑器2.3 工具栏编辑器2.4 对齐对象工具2.5 对象浏览器2.6 Tab 键顺序编辑器 3. 可视化图形用…

[毕业设计baseline]tkinter+flask的毕业设计开发baseline

一.前言 最近开发了一个结合了tkinter和flask框架的GUI页面服务器。目前可以想到的开发方向有。 1.基于python的局域网聊天系统。 2.服务器管理系统。 3.网络安全防御系统。 接下来就来介绍一下这个框架以及开发方向的详细思路。如果计算机专业的本科毕业生感兴趣可以用pyt…

基于单片机的蓝牙音乐喷泉的设计与实现

功能介绍 以51单片机作为主控系统;通过HM-18蓝牙音频模块进行无线传输; 通过LM386功放模块对音频信号进行放大;手机端可以直接控制音频播放,并且最远距离可达20米;手机端可以进行任意音乐切换,播报、暂停&a…

记一次阿里云被挖矿处理记录

摘要 莫名其妙的服务器就被攻击了,又被薅了羊毛,当做免费的挖矿劳动力了。 一、起因 上班(摸鱼)好好的,突然收到一条阿里云的推送短信,不看不知道,两台服务器被拉去作为苦力,挖矿去…

具备捕获 Web2 用户能力的 PoseiSwap,治理通证$POSE再度涨超 360%

Nautilus Chain 是行业内首个模块化 Layer3 架构链,开发者能够基于模块化进行定制化开发,并有望进一步推动 Web3 应用向隐私、合规等方向发展。当然,Nautilus Chain 的特殊之处还在于为生态用户带来丰厚的空投预期,据悉上线 Nauti…

android Surface(1, 2)

android Surface(1, 2) android的Surface相关内容从底层依次往上分别是: 1.frameBuffer,简称fb,对于同一个android系统,可以同时存在多个frameBuffer,本机是fb0,依次外接时,fb1, fb2, ……fbn…

安全漏洞的检测利用

安全漏洞的检测&利用 一、安全漏洞的基本概念1.1、什么是漏洞1.2、漏洞的简单理解1.3、微软的RPC漏洞与蠕虫病毒1.4、微软经典的蓝屏漏洞1.5、Heartbleed(心脏滴血)漏洞1.6、破壳漏洞CVE-2014-62711.7、漏洞的危害1.8、漏洞的成因1.9、漏洞的信息的组…

electron+vue3全家桶+vite项目搭建【21】自定义窗口拖拽移动

引入 如果你尝试过透明窗口,并控制透明部分事件击穿,就会发现使用 drag属性样式去控制窗口拖拽会导致点击事件失效,并且带drag属性的窗口移动到另一个窗口的透明部分会有窗口乱动的各种BUG,于是,这便需要我们自己去实…

mac上 如何批量在文件名后加相同的文字?

mac上如何批量在文件名后加相同的文字?不管你是使用windows电脑还是使用mac电脑,很多小伙伴都会在电脑上进行文件批量重命名的操作,不过这项操作对于使用windows系统电脑的小伙伴来说会简单一些,因为在网上可以搜索到很多这样的教…

软考:中级软件设计师:计算机体系结构,CISC和RISC,Flynn分类,指令流水线,吞吐率,效率

软考:中级软件设计师:计算机体系结构 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的…

LabVIEW开发X射线图像增强

LabVIEW开发X射线图像增强 X射线图像在临床诊断中起着重要作用。但是,由于各种原因,例如不均匀,低照度条件和一些噪点,图像质量通常不是很好。因此有必要增强这些图像,以方便后续处理或诊断。模糊集论是开发图像处理中…