【Redis】理论进阶篇------Redis的持久化

一、前言

     前面学习了Redis的相关的十大数据类型以及用SpringBoot集成我们的Redis的工具代码的书写。从这篇文章开始,就会从Redis相关的一些理论(也是面试和工作的热点知识)如:Redis的持久化、Redis的订阅发布模型、Redis集群环境搭建、哨兵模式等等方面介绍Redis相关的进阶知识。希望对各位小伙伴能有所帮助。

二、Redis的持久化

1、为什么会有Redis的持久化

首先Redis是我们的缓存,是一种内存数据库,如果我们存储数据的时候,不将数据库状态储存到磁盘中,那么服务器一旦宕机、进程出现错误。服务器中的数据也会随之消失。所以为Redis提供持久化的功能是必不可少的!

2、Redis的持久化是什么

官网原话:

上面是官方对Redis持久化做出的解释,我们不难看出Redis的持久化就是将数据写入磁盘。而其中的关键操作其实是RDB与AOF。接下来会其详细展开介绍。

3、RDB

1、什么是RDB

Redis Database用官网的话说就是:在指定的时间间隔内将内存中数据集快照(Snapshot  像照相机那样咔嚓一下)写入磁盘,如果要恢复数据集则将快照文件读取到内存中。

工作流程:redis中会有一个父进程,正常的处理client发出的各种请求,此时如果要触发RDB生成RDB文件,则可以通过配置文件修改触发的操作我们称为自动触发、或则通过save和bgsave指令来手动触发来实现数据备份。此时父进程就会产生(fork)一个子进程来实现持久化,会先将数据写入一个临时文件中,待持久化结束后,再用这个临时文件代替上次持久化好的文件(rdb保存的文件就是一个dump.rdb文件)。整个过程主进程不进行 任何IO操作,确保了极高的性能。

2、RDB的触发

①RDB的自动触发

首先我们找到我们Redis下载的文件目录,我们找到以.conf结束的文件:

打开这个文件找到我们的快照Snapshot 

正如Redis的配置文件所示 save <seconds> <changes>,当我们的时间间隔大于等于设置的seconds,修改次数大于等于changes时,Redis会自动触发RDB,生成对应的dump.rdb文件。

②RDB的手动触发

既然有自动触发,为什么需要手动触发呢。因为自动触发是规定操作内生成dump.rdb文件,但是如果有非常重要的数据需要及时存储,但是又不满足自动触发的需求。这时Redis官方,就为我们提供了save和bgsave两种手动触发的操作来 生成RDB文件。

a.save指令

用户可以通过执行SAVE命令,要求Redis服务器以同步方式创建出一个记录了服务器当前所有数据库数据的RDB文件。而且再持久化完成save指令的整个期间内,Redis都不能处理 其他的命令。SAVE命令是一个无参数命令,它在创建RDB文件成功时将返回OK作为结果。(注:线上禁止使用,不推荐)

b.bgsave

Redis会在后台异步进行拍照操作,不阻塞快照同时还可以响应客户端的请求,该持久化化会fork一个子进程,由子进程复制持久化的过程(父进程与子进程各做各的,会不干扰)。

③总结rdb文件的触发

1:通过我们的各种触发操作,会自动触发rdb规则;

2:除了以上,执行flushdb/flushall命令,也会触发rdb规则(为了保证数据的完整性,但是文件里面是空白的);

3:退出redis,也会产生rdb文件。

4:主从复制时,主节点自动触发。

3、RDB的恢复

从以下方面恢复数据

①:只需将rdb文件放在我们Redis的启动目录下,redis启动时候会自动检查dump.rdb文件恢复其数据;

②:物理恢复,一定服务和备份分机隔离。(PS:不可以把备份dump.rdb文件和产生redis的服务器放在同一台机器,必须分开存储,以防生产机物理损坏后备份文件也挂了)

4、AOF

1、什么是AOF

Append Only File用通俗的话来讲:以日志的形式来记录每个写操作,将Redis执行的所以写操作指令记录下来(读操作不记录)。当重启Redis的时候会将新的持久化的日志文件中的数据恢复。

Redis中AOF的操作流程:

①:Client作为命令的操作者,会在redis中不断书写各种指令命令;

②:Redis并不会直接将这些指令命令直接写入AOF文件,而是先写在一个临时的AOF文件中(其实是一个缓冲区)。当这个临时文件的数量足够多时,再写入磁盘,避免了频繁的IO操作;

③:AOF的临时文件会根据三种写回策略(后面解释)将命令写入磁盘上的AOF文件中;

④:当AOF文件中的内容越来越多时,会执行AOF重写,起到AOF文件压缩的目的。

⑤:当Redis重启的时候会将AOF中的数据重新载入。

2、AOF中的常见配置指令

我们像RDB一样,找到AOF的配置文件,介绍相关指令:

1:appendonly no 

默认不开启,我们需要手动进行配置,将"no"->"yes"

2:appendfilename "appendonly.aof"

表示修改的生成的aof文件的名称

3:三种回写策略机制

appendfsync always:同步回写,优:可靠性高,数据基本不丢失;缺:是一个极端,每个命令都要写到磁盘,性能影响大。
appendfsync everysec:每秒回写,优:性能适中;缺:宕机时,丢失一秒类数据。(Redis默认)
appendfsync no:OS控制的回写,优:新能好;缺:也是一个极端,宕机时,丢失数据数据较多。

4:AOF文件重写规则

首先aof默认文件无限追加,这样文件就会越来越大。

同时满足以下的关系,才会触发AOF的重写:

auto-aof-rewrite-percentage 100:根据上次重写后的aof大小,判断当前aof是不是增长了一倍
auto-aof-rewrite-min-size 64mb:如果aof文件大于64M,fork一个子进程来将我们文件进行重写

三、RDB与AOF的各自优缺点

1、RDB

优:

①:适合大规模的数据恢复

②:可以按照业务定时备份

③:对数据完整性和一致性要求不高

④:RDB文件在内存中加载速度比AOF快的多

缺:

①:在一定时间内做一次备份,如果redis出现宕机的话,就会丢失从当前开始的最近一次快照期间的数据

②:内存数据的全量同步,数据量太大,会大量使用IO,影响服务器性能

③:fork子进程的时候,会占用一定空间,需要考虑内存空间的问题

2、AOF

优:

①更好的保护数据不丢失、性能高、可做紧急恢复

缺:

①:在相同数据集下,aof文件要远大于rdb文件,恢复速度慢 

②:aof的效率慢于rdb,所以redis默认的是使用rdb持久化

四、RDB和AOF的混合使用

1、谁的优先级大

我们知道Redis默认使用的是RDB,那么如果将aof与 rdb同时开启,是不是rdb的优先级就更大,先加载RDB文件呢?我们先来看个流程图:

从该图中我们可以看出,如果有aof文件,则先加载aof文件;若没有aof文件而开启了rdb则先加载rdb文件,如果两个都没开启,则该怎么执行就怎么执行。

2、开启RDB与AOF的混合模式

①:开启混合方式

aof-use-rdb-preamble yes(默认是yes)

②:开启结果

PS:前提是开启AOF。

RDB做全量的持久化,AOF做增量的持久化:即先使用RDB进行快照的储存,然后使用AOF持久化做所有写的操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。

总的来说最后生成的也是aof文件,但是该文件一部分包含了RDB格式,一部分包含了AOF格式。

如下所示:

五、总结

最后做一个总结,首先博主的这篇博客的记录是学习了b站上up主【狂神说JAVA】、【尚硅谷】的redis学习视频后写的。然后这篇博客也是在以前Redis版本上的基础上结合最新的版本完成的。当然博主自己写的这篇博客也是让我自己对Redis的持久化功能有了更进一步的认识,我个人觉得这篇博客对一些常见的关于Redis的持久化的面试题的回答是涉及的足够的。如果对正在阅读的小伙伴有帮助,不要忘记点赞👍哦。

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

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

相关文章

用python绘制黄金价格变化曲线

首先你得从mt4把数据导出为csv&#xff1a;mt4如何导出数据-CSDN博客 1、引入必要的库 import numpy as np import pandas as pd import matplotlib.pyplot as plt 2、然后通过pandas载入csv数据 raw pd.read_csv("XAUUSDm1.csv", headerNone, index_colNone, p…

P1024 [NOIP2001 提高组] 一元三次方程求解题解

题目 有形如&#xff1a;这样的一个一元三次方程。给出该方程中各项的系数&#xff08;a,b,c,d均为实数&#xff09;&#xff0c;并约定该方程存在三个不同实根&#xff08;根的范围在−100至100之间&#xff09;&#xff0c;且根与根之差的绝对值≥1。要求由小到大依次在同一…

文件包含+文件上传漏洞(图片马绕过)

目录 一.文件包含二.文件上传三.图片马四.题目 一.文件包含 将已有的代码以文件形式包含到某个指定的代码中&#xff0c;从而使用其中的代码或者数据&#xff0c;一般是为了方便直接调用所需文件&#xff0c;文件包含的存在使得开发变得更加灵活和方便&#xff08;若对用户输入…

网络安全-pikachu之文件上传漏洞1

文件上传漏洞是危害极大的&#xff0c;一旦成功&#xff0c;可以获取服务器的最高权限。 pikachu介绍&#xff1a; 文件上传功能在web应用系统很常见&#xff0c;比如很多网站注册的时候需要上传头像、上传附件等等。当用户点击上传按钮后&#xff0c;后台会对上传的文件进行判…

☀️将大华摄像头画面接入Unity 【1】配置硬件和初始化摄像头

一、硬件准备 目前的设想是后期采用网口供电的形式把画面传出来&#xff0c;所以这边我除了大华摄像头还准备了POE供电交换机&#xff0c;为了方便索性都用大华的了&#xff0c;然后全都连接电脑主机即可。 二、软件准备 这边初始化摄像头需要用到大华的Configtool软件&#…

【知识点】CNN中concat与add的区别

cat操作经常用于将特征联合&#xff0c;多个卷积特征提取框架提取的特征融合或者是将输出层的信息进行融合&#xff1b;而add层更像是信息之间的叠加。 add是在一个特征上增加其语义信息&#xff0c;对最终的图像的分类是有益&#xff1b;cat导致的结果改进可能是由于cat操作通…

工业自动化部署选择主板的关键因素

**在构建任何计算机时&#xff0c;选择合适的主板至关重要。**对于游戏台式机&#xff0c;您需要选择能够支持您玩的游戏类型而不会出现任何问题的最新和最佳规格。当涉及工业应用时&#xff0c;影响您决策的变量变得更加重要。作为任何基于计算的应用中最关键的组件之一&#…

搜维尔科技:分析OptiTrack光学动作捕捉应用领域!

虚拟制作 当今虚拟制作阶段低延迟、超精确摄像机跟踪的事实上的标准。 用于运动科学的 OptiTrack OptiTrack 系统提供世界领先的测量精度和简单易用的工作流程&#xff0c;为研究人员和生物力学师的研究提供理想的 3D 跟踪数据。对所有主要数字测力台、EMG 和模拟设备的本机即…

trojan 突然无法上网

[ERROR] 2024/02/19 18:14:45 github.com/p4gefau1t/trojan-go/tunnel/tls.(*Server).acceptLoop.func1:server.go:140 tls handshake failed | remote error: tls: bad certificate 报证书问题&#xff0c;更新证书发现无法解决 最后突然客户端有一个配置 验证证书&#xf…

佳能2580的下载手册

凡是和电子产品有关的产品其内部都开始不断地进行内卷&#xff0c;在不断地内卷背后&#xff0c;意味着科技更新和换代&#xff0c;自己也入手了一台佳能2580的打印机&#xff0c;一台相对比较老式的打印机&#xff0c;以此不断地自己想要进行打印的需要。 下载的基础步骤&…

【ansible】认识ansible,了解常用的模块

目录 一、ansible是什么&#xff1f; 二、ansible的特点&#xff1f; 三、ansible与其他运维工具的对比 四、ansible的环境部署 第一步&#xff1a;配置主机清单 第二步&#xff1a;完成密钥对免密登录 五、ansible基于命令行完成常用的模块学习 模块1&#xff1a;comma…

Bert基础(二)--多头注意力

多头注意力 顾名思义&#xff0c;多头注意力是指我们可以使用多个注意力头&#xff0c;而不是只用一个。也就是说&#xff0c;我们可以应用在上篇中学习的计算注意力矩阵Z的方法&#xff0c;来求得多个注意力矩阵。让我们通过一个例子来理解多头注意力层的作用。以All is well…

linux监控系统资源命令

当前CPU内核版本 [rootVM-12-12-centos ~]# cat /proc/version Linux version 3.10.0-1160.11.1.el7.x86_64 (mockbuildkbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) ) #1 SMP Fri Dec 18 16:34:56 UTC 2020 当前系统版本 [rootVM-12-1…

Python六级考试笔记

Python六级考试笔记【源源老师】 六级标准 一、 掌握文件操作及数据格式化。 二、 掌握数据可视化操作。 三、 理解类与对象的概念&#xff0c;初步掌握类与对象的使用。 四、 掌握SQLite数据库基础编程。 五、 掌握简单的使用tkinter的GUI设计。 ​ 1. 文件操作 &#xff0…

虚拟机 安装 centos7 带桌面

虚拟机 安装 centos7 流程 https://mirrors.tuna.tsinghua.edu.cn/centos/7.9.2009/isos/x86_64/ CentOS-7-x86_64-DVD-2009.iso vmware 安装 centos7 的时候&#xff0c; 如果 不是 选择的 稍后 安装操作系统 &#xff0c; 会不让你选择配置选项&#xff0c;自动帮你把系统…

技术选型指南:Oracle、SQL Server还是DB2?

Oracle vs SQL Server vs DB2 - 选哪个好&#xff1f; 在企业级数据管理领域&#xff0c;常用的几个选择有Oracle、SQL Server和DB2。 首先&#xff0c;我们从以下几个方面做一下对比&#xff1a; 1. 性能和稳定性&#xff1a; Oracle: Oracle就像是那种精密的瑞士手表&…

面试官:如何设计幂等性接口

什么是幂等性&#xff1f; 所谓幂等性&#xff0c;就是一次操作和多次操作同一个资源&#xff0c;所产生的影响均与一次操作的影响相同。 "幂等&#xff08;idempotent、idempotence&#xff09;是一个数学与计算机学概念&#xff0c;常见于抽象代数中。 幂等函数&…

Jenkins配置node节点

1、添加节点 2、配置node主机的java环境 注意&#xff0c;jdk的位置和版本要和master保持一致 sudo apt-get update sudo apt-get install openjdk-8-jre vim /etc/enviroment写入&#xff1a;export JAVA_HOME/usr/lib/jvm/openjdk-8-jre 按wq!退出 再输入&#xff1a;s…

记一次 Flink 作业启动缓慢

记一次 Flink 作业启动缓慢 背景 应用发现&#xff0c;Hadoop集群的hdfs较之前更加缓慢&#xff0c;且离线ELT任务也以前晚半个多小时才能跑完。此前一直没有找到突破口所以没有管他&#xff0c;推测应该重启一下Hadoop集群就可以了。今天突然要重启一个Flink作业&#xff0c…

【git 使用】git 中head、工作树、和索引分别是什么,有什么关系和区别

HEAD 定义&#xff1a;HEAD 是指向当前所在分支&#xff08;或者是某个特定的提交&#xff09;的指针&#xff0c;它表示当前工作目录正在处于哪个提交或分支上。作用&#xff1a;HEAD 指示了当前工作目录的状态&#xff0c;可以通过 HEAD 来确定当前处于哪个分支上&#xff0…