彻底理解Redis的持久化方式

一.由来

因为Redis之所以能够提供高效读写的操作,是因为它是基于内存的,但是这样也会带来一个问题,及在服务器宕机或者重启的情况下,内存里面的数据就会被丢失掉,所以为了解决这个问题,Redis就提供了持久化的技术,来保证数据的持久性和可靠性。

二.持久化方式介绍

如图: 

1.RDB持久化:在指定的时间间隔内将内存种的数据集(二进制序列化形式)快照写入磁盘,每次都是从Redis里面生成一个快照进行全量备份,也就代表我们当前时刻,Redis里面有多少数据,只要触发了RDB方式,就会将所有的数据以二进制的形式存储到磁盘里面;

2.AOF持久化:对每条写入命令作为日志,以追加(append-only)的模式写入一个日志文件中,这就代表客户端提交过来的每一个Set命令都会存储到一个文件里面进行保存,在Redis重启的时候,可以通过回放AOF日志中的写入指令来重新构建整个数据集,以达到恢复数据的效果。

三.RDB持久化流程

如图:

1.首先主进程会fork一个子进程来进行备份;

2.子进程会将共享的内存数据写到一个临时的RDB文件,而不是直接写到已经存在的这个RDB文件里面;

3.当子进程把Redis的所有数据都写到临时文件以后,就会用这个临时文件替代已经存在的RDB文件

4.在整个的备份过程中,主进程不参与这个IO操作,它可以继续支持处理客户端的请求,但是需要注意主进程,主进程此时处理请求是基于一个新的内存副本来进行操作的,而这个内存副本是通过一个叫做COW的机制来进行处理的,比如说客户端提交了一个Key过来之后,那么COW机制就会将这个Key从共享内存拷贝到这个内存副本里面,那么主进程在进行处理的时候,它就是针对这个内存副本里面的Key的副本来进行操作的,它并不是基于共享内存来进程操作的。

COW机制:

Copy-On-Write(写时复制),该机制是一种用于优化并发访问的数据结构实现策略,特别适用于读多写少的场景,COW的基本思想是在进行写操作时,不直接修改原数据,而是先复制一份副本,然后在副本上进行修改;写操作完成后,再将副本替换为原数据(这个替换操作是原子性的,以确保在任何时刻,所有读取操作都能读取到一致的数据),这样可以确保读操作与写操作之间不会相互干扰,从而提高并发性能。

注意点:

1.平时说的周期性的来进行数据备份,其实就是fork子进程的间隔时间,当然这个fork子进程备份这个过程也可以通过手动触发,像bgsave、save命令都可以进行手动触发备份的过程;

2.fork子进程的备份,它其实也是有一个自动配置的,也是通过一个配置触发的,有一个命令叫做Save *** ***(save多少秒多少个),这就代表在这个多少秒里面有多少个Key被修改了,它就会自动fork一个子进程来进行备份。

四.AOF持久化流程

如图: 

1.Redis先将这个写命令写入到一个缓存区里面,不是直接写到日志文件中;

2.当写到这个缓冲区后,才会进行一个同步刷盘的操作,这个刷盘操作是通过一个配置来进行调配的,一共有三种选项:

(1)实时同步,当客户端每来一个数据,都会将它写到日志文件中里面;

(2)设置时间间隔,通常我们会设置1s,这就代表每隔1s这个缓存区就会将数据刷盘到日志文件里面;

(3)缓冲区不会主动将数据刷盘到日志文件中,而是由系统来进行调配,那么这个方法就可能会出现RDB那种将大部分数据同时丢失的问题。

如果采用设置间隔时间为1s,这代表最多就会丢失1s的数据,同时也不会出现性能浪费,如果采用实时同步的话,那还不如直接把数据写入日志文件里面,何必中间再借助一个缓存区呢。

3.当所有数据都存在日志文件中后,AOF还提供了一个日志重写的功能,它其实就是正对AOF文件进行瘦身,比如用户针对key1进行了3此更新,在这个日志文件中,其实有效的命令只是最后一条更新,前面两次更新的命令都是冗余命令,而这个重写功能,会将前面两个冗余的命令干掉,只留下这个有效的set命令,然后这个日志文件就瘦身下来了。

4.Redis重启的时候就加载这个日志文件来恢复数据,也就是将这些命令从上往下一个一个的执行,但是这种方式,就相比于RDB加载二进制数据的方式要慢很多。

 五.优缺点

优点:

1. 性能高:因为它是二进制的形式将当前Redis里面的所有数据存在磁盘中,也就是代表当Redis重启之后,它可以直接加载这个二进制数据进行恢复,这个速度是非常快的,也就代表性能是非常高的;

2.文件紧凑:其实也是基于二进制而言的,它相比于AOF将所有的写命令进行处理,它的文件内容是相当紧凑的;

缺点:

可能丢失数据:其实这就是根据我们这个配置触发这个fork子进程备份数据的这个过程中,可能会有一点时间间隔,那比如说我们配置了3000ms 3000个key被修改,才会触发fork子进程,那就代表在上一次触发这个备份的过程中(还没备份完),如果说还没有来得及触发下一次备份的话,在这个过程中,如果出现了宕机或者重启的操作,那就代表当前时间中内存变更的数据都会被丢失,因为它还没有来的及备份。

优点:

数据更加可靠:因为AOF记录了每个写数据的操作,因此它在出现故障的时候可以通过读取AOF的日志文件逐个来进行恢复数据,同时它基于这种追加的方式把所有的set的命令都保存下来了,就可以用它来回放过去所有的些操作;

缺点:

1.文件较大:因为它存储了所有的set命令,所以通常AOF文件体积要比RDB文件要大

2.恢复数据较慢:因为它需要将AOF里面所有的set命令加载出来逐个的读取,而且当我们这个文件非常大的时候,它的加载也会非常损耗性能,所以它比RDB方式要慢很多。

六.如何选择

1.如果能够接受一段时间的缓存数据丢失,选择RDB;

2.如果是对缓存数据的实时性要求比较高,选择AOF;

但是一般情况下建议不要单独使用某一种持久化机制,而是应该两种一起用,在这种情况下,,当Redis重启的时候会优先载入AOF文件来恢复原始的数据(Redis默认优先使用AOF,相当于RDB做冷备,AOF做热备),因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。

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

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

相关文章

Bug Fix 20241122:缺少lib文件错误

今天有朋友提醒才突然发现 gitee 上传的代码存在两个很严重,同时也很低级的错误。 因为gitee的默认设置不允许二进制文件的提交, 所以PH47框架下的库文件(各逻辑层的库文件),以及Stm32Cube驱动的库文件都没上传到Gi…

Go语言中的引用类型:指针与传递机制

在Go语言中,有一些特殊的数据类型,它们在内存中的表示方式与传统的值类型(如int、float、bool等)有所不同。这些类型被称为引用类型,包括map、chan、函数、接口和切片(slice)。尽管Go语言的官方…

YOLOv7-0.1部分代码阅读笔记-test.py

test.py test.py 目录 test.py 1.所需的库和模块 2.def test(data, weightsNone, batch_size32, imgsz640, conf_thres0.001, iou_thres0.6, save_jsonFalse, single_clsFalse, augmentFalse, verboseFalse, modelNone, dataloaderNone, save_dirPath(), save_txtFalse, s…

JAVA中的Lamda表达式

JAVA中的Lamda表达式 Lambda 表达式的语法使用场景示例代码1.代替匿名内部类2. 带参数的 Lambda 表达式3. 与集合框架结合使用4. 使用 Stream 操作 总结 Java 的 Lambda 表达式是 Java 8 引入的一个新特性,用于简化代码,特别是在处理函数式编程时。Lambd…

在Linux配置NGINX的证书

1、检查 Nginx 是否支持 SSL 模块 首先,检查当前安装的 Nginx 是否支持 SSL 模块。运行以下命令: nginx -V 2>&1 | grep -o with-http_ssl_module 如果输出为空,说明 Nginx 没有编译 SSL 模块。 2. 重新编译 Nginx 以启用 SSL 模块 如…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台,具有简单轻量的部署方式与多样的功能,支持多种协议(如GB28181、RTSP、Onvif、RTMP)和设备类型(IPC、NVR等),提供视频直播、录像、回放…

微服务架构:10个实用设计模式

1 微服务架构 微服务架构的重要特征 微服务架构的优点 微服务架构的缺点 何时使用微服务架构 2 微服务架构的设计模式 独享数据库(Database per Microservice) 事件源(Event Sourcing) 命令和查询职责分离(CQRS&…

华为欧拉系统使用U盘制作引导安装华为欧拉操作系统

今天记录一下通过U盘来安装华为欧拉操作系统 华为欧拉操作系统是国产的一个类似于Centos的Linus系统 具体实现操作步骤: 先在官网下载欧拉系统镜像点击跳转到下载 准备好一个大于16g的U盘 ,用于制作U盘启动 下载一个引导程序制作工具,我使用…

20241121 android中树结构列表(使用recyclerView实现)

1、adapter-item的布局 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"wrap_content&…

Spring Boot核心概念:应用配置

Spring Boot提供了强大的配置系统&#xff0c;允许开发者通过配置文件轻松管理应用的配置。支持的主要配置文件格式有两种&#xff1a;application.properties和application.yml。 application.properties与application.yml application.properties和application.yml是Spring…

C++初阶学习 第十二弹——stack与queue的介绍和使用

目录 一、stack&#xff08;栈&#xff09; 1.栈的概念&#xff1a; 2.成员函数包括&#xff1a; 3.栈的使用示例: 4. 使用时的注意事项&#xff1a; 二.queue&#xff08;队列&#xff09; 1.队列的概念 2.成员函数 3.队列的使用示例 4.使用时的注意事项 三.总结…

如何实现点击目录跳转到指定位置?【vue】

需求&#xff1a;实现目录点击跳转到指定位置&#xff0c;点击后直接定位到指定模块 效果&#xff1a; 实现方法&#xff1a; &#xff08;1&#xff09;a标签跳转 普通使用&#xff1a; <!DOCTYPE html> <html><head><title>a-Demo</title>&l…

性能测试场景设计:打造高效、稳定的系统架构

在软件开发过程中&#xff0c;性能测试是确保系统高效运行的关键步骤。通过模拟真实用户负载&#xff0c;我们可以评估系统的响应时间、吞吐量和资源利用率等关键指标。本文将详细介绍如何设计一个全面的性能测试场景&#xff0c;以帮助您识别潜在的性能瓶颈并优化系统性能。 …

uni-app如何向Vue那样操作dom节点

2024年8月2日 引言 一般节点渲染出来后&#xff0c;其样式多为固定。如果之后想进行样式变化&#xff0c;在Vue.js框架中&#xff0c;就可以在js模块用document API获取节点进行操作。但是uni-app并没有document这样的API&#xff0c;所以当碰到这种需要在js模块对节点进行操…

【SKFramework框架】二、快速启动

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群&#xff1a;398291828小红书小破站 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【Unity3D框架】SKFramework框架完全教程《全…

鸿蒙多线程开发——线程间数据通信对象02

1、前 言 本文的讨论是接续鸿蒙多线程开发——线程间数据通信对象01的讨论。在上一篇文章中&#xff0c;我们讨论了常规的JS对象(普通JSON对象、Object、Map、Array等)、ArrayBuffer。其中讨论了ArrayBuffer的复制传输和转移传输方式。 下面&#xff0c;我们将讨论SharedArra…

React 表单Form 中的 useForm

1、介绍 useForm 是 React Hook Form 中的核心 Hook&#xff0c;用于管理表单的状态和行为。它提供了处理表单验证、数据收集、状态管理等功能的简便方法。useForm 本质上是用于创建和配置表单&#xff0c;并允许你在组件中与表单字段交互。 2、基本用法 useForm 是一个函数…

时序论文22|ICML24港科大:面向多变量不规则的时间序列预测方法

论文标题&#xff1a;Irregular Multivariate Time Series Forecasting: A Transformable Patching Graph Neural Networks Approach 论文链接&#xff1a;https://openreview.net/pdf?idUZlMXUGI6e 前言 这篇文章在“定位研究问题”方面很值得学习。其实前段时间对时序研究…

Linux离线安装Docker命令,简单镜像操作

解压安装包 首先&#xff0c;使用 tar 命令解压 docker-27.3.1.tgz 安装包&#xff1a; tar -zxvf docker-27.3.1.tgz 将二进制文件移动到可执行路径上的目录 接着&#xff0c;将解压出来的 Docker 二进制文件复制到系统的可执行路径&#xff08;通常是 /usr/bin/&#xff09…

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号

Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-差分信号 Sigrity SPEED2000 TDR TDT Simulation模式如何进行时域阻抗仿真分析操作指导-单端信号详细介绍了单端信号如何进行TDR仿真分析,下面介绍如何对差分信号进行TDR分析,还是以下图为例进行分…