彻底理解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…

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&…

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…

【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…

时序论文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分析,还是以下图为例进行分…

springboot基于微信小程序的食堂预约点餐系统

摘 要 基于微信小程序的食堂预约点餐系统是一种服务于学校和企事业单位食堂的智能化解决方案&#xff0c;旨在提高食堂就餐的效率、缓解排队压力&#xff0c;并优化用户的就餐体验。系统作为一种现代化的解决方案&#xff0c;为食堂管理和用户就餐提供了便捷高效的途径。它不仅…

Java线程池详解

线程池是用来管理和复用线程的一种技术&#xff0c;它避免了频繁的创建和销毁线程的开销&#xff0c;提高了应用程序的性能。在 Java 中&#xff0c;ExecutorService 是一个非常常用的接口&#xff0c;它提供了线程池的基本功能。 1. 线程池的优势 线程复用&#xff1a;线程池…

软件测试—— Selenium 常用函数(二)

前一篇文章&#xff1a;软件测试—— Selenium 常用函数&#xff08;一&#xff09;-CSDN博客 目录 前言 一、浏览器 1.常见操作 &#xff08;1&#xff09;打开网站 &#xff08;2&#xff09;前进、后退、刷新 2.参数设置 &#xff08;1&#xff09;设置无头模式 &am…

webgl threejs 云渲染(服务器渲染、后端渲染)解决方案

云渲染和流式传输共享三维模型场景 1、本地无需高端GPU设备即可提供三维项目渲染 云渲染和云流化媒体都可以让3D模型共享变得简单便捷。配备强大GPU的远程服务器早就可以处理密集的处理工作&#xff0c;而专有应用程序&#xff0c;用户也可以从任何个人设备查看全保真模型并与…

springboot基于Spring Boot的古城景区管理系统的设计与实现docx

摘 要 古城景区管理系统是一个集景区导游功能于一体的综合管理平台&#xff0c;旨在提升游客的参观体验和提高管理效率。系统通过提供详尽的热门景点、客房类型、酒店信息、美食类型、特色美食、文创产品及导游服务&#xff0c;使游客能够深入了解古城的历史与文化。该系统集成…

彻底理解如何保证Redis和数据库数据一致性问题

一.背景 系统中缓存最常用的策略是&#xff1a;服务端需要同时维护 DB 和 Cache 并且是以 DB 的结果为准&#xff0c;那么就可能出现 DB 和 Cache 数据不一致的问题。 二.读数据 逻辑如下&#xff1a; 当客户端发起查询数据的请求&#xff0c;首先回去Redis中查看没有没该数据&…

openwebui使用

文章目录 1、feature2、安装使用2.1 安装过程2.2 安装好后 1、feature 可以加载多个大模型 同时回复 模型问答: 使用vLLM框架部署模型&#xff0c;再使用Open WebUI直接进行模型问答 多模型支持: 多模型回复比对&#xff08;Qwen2-72B-Instruct, llama3-70b-8192, mixtral-8x7…

.net 8使用hangfire实现库存同步任务

C# 使用HangFire 第一章:.net Framework 4.6 WebAPI 使用Hangfire 第二章:net 8使用hangfire实现库存同步任务 文章目录 C# 使用HangFire前言项目源码一、项目架构二、项目服务介绍HangFire服务结构解析HangfireCollectionExtensions 类ModelHangfireSettingsHttpAuthInfoUs…