Redis--持久化机制详解

什么是redis持久化?

Redis持久化是将内存的数据持久化到磁盘上,防止Redis宕机或者断点的时候内存中的数据丢失,把内存中的数据写入到磁盘的过程叫持久化。

Redis持久化的方式?

  • RDB(Redis DataBase):在指定时间间隔内将内存中的数据以快照的方式写入到磁盘上,Redis默认的持久化方式。
  • AOF(Append Of File):以日志的形势记录每个写命令、删除命令。
  • 混合持久化:混合持久化并不是一种全新的持久化方式,它只是同时使用了RDB和AOF两种模式,是Redis 4.0版本开启的功能,通过aof-use-rdb-preamble配置参数开启,yes表示开启,no表示禁用,默认禁用。

RDB持久化详解:

RDB持久化流程:

  • 客户端触发或者自动执行bagesave命令。
  • 主进程判断是否存在正在执行的子进程,存在返回。
  • 不存在的话fork一个子进程进行持久化数据,fork过程中是阻塞的,fork操作完成后,主进程即可执行其他操作。
  • 子进程先将数据写入临时rdb文件中,数据写入完成后替换旧的rdb文件,同时通知主进程RDB持久化完成。

RDB持久化的优缺点:
优点:

  • 文件紧凑,全量备份,适合数据备份和灾难恢复。
  • 生成RDB文件时,redis主进程会fork()一个子进程来保存工作,主进程不需要进行任何IO操作。
  • RDB在恢复大数据集时速度比AOF的恢复速度要快。

缺点:

  • 因为RDB需要保存整个数据集,所以不是一个轻松的操作,因此一般不会设置太短时间,因此一段发生故障停机,会丢失几分钟的数据。
  • 如果数据集过大的情况下,所fork子进程在协助完成持久化时,所可能导致服务器停止几百毫秒,所甚至几秒钟。

AOF持久化流程:
AOF文件只记录写命令,不记录读命令,当服务端接收到写命令后,redis会将命令写入到aof缓冲区中,只所以写入缓冲区而不直接写入到文件中,是因为每次直接将命令写入文件中,那redis的性能将完全取决于硬盘的读写能力,影响redis性能。

AOF工作流程图:
在这里插入图片描述

AOF三种同步策略:

  1. always(总是):每次执行了写入或删除的命令写入缓冲区后,就调用系统fsync将redis执行的命令写入aof文件中,fsync操作完成后主线程返回。
  2. no:命令写入缓冲区后,调用操作系统的write操作,Redis不主动将命令同步到aof文件中,同步动作由操作系统来负责,一般是30秒一次。
  3. everysec:命令写入缓冲区后,调用操作系统的write操作,write操作完成之后,有专门的线程每秒执行fsync操作。

AOF持久化的优缺点:
优点:

  • AOF持久化几乎不丢失数据,最多丢失一秒的数据。
  • AOF机制采用的是append模式,因此即使在写入过程发生宕机,也不会破坏日志文件中已经存在的内容,如果本次操作只写入了一半就出现了系统宕机,redis下一次重启的时候,可以通过redis-check-aof来解决数据一致性问题。
  • 如果日志文件过大,redis可以自动启用rewriter机制,redis以append模式不断的将修改数据写入到磁盘中,同时会创建一个新的文件记录此期间有哪些命令被修改,在rewriter期间可以更好的保证数据安全性。
  • AOF包含一个格式清晰易于理解的日志文件,也可以通过该文件完成数据重建。

缺点:

  • 对于相同的数据集来说,AOF的文件体积一般大于RDB文件的体积。
  • 对redis性能有一定的损耗。
  • 相对RDB持久化的方式的数据恢复速度,AOF持久化的方式数据恢复速度会更慢一些。

AOF rewrite重写机制是什么意思?
AOF 重写是为了缩小aof文件,AOF持久化模式是不断的记录Redis写入、删除命令到文件中,随着命令的越来越多,文件会越来越大,aof重写会把过程操作过程去掉,把多个命令合并成一个命令,这样就缩小了AOF文件。

AOF rewrite作用:

  1. 使aof文件变的更小,占用更少的磁盘空间。
  2. aof文件编的更小后,在数据恢复的时候会更快。

AOF rewrite流程图:
在这里插入图片描述

AOF 重写规则?

  1. 进程内已经过期的数据不再写入文件。
  2. 只保存最终的写入命令,如set a 1,set a 2,set a 3,此时只保留set a 3。
  3. 多条写命令合并为一条命令,如lpush list 1,lpush list 2,lpush list 3,合并为lpush list 1,2,3,同时为了防止单条命令过大,对于list set zset hash 等以64个元素为界限拆分为多条命令。

什么是混合持久化?
混合持久化是redis4.0版本添加的新功能,通过aof-use-rdb-preamble配置参数开启,yes表示开启,no表示禁用,默认禁用,混合持久化体现在aofrewrite时,先写一份全量RDB数据到aof文件中,后续AOF重写缓冲区里的数据继续追加到该文件中,因为开启了混合持久化后,appendonly.aof文件开头是RDB格式,后续是AOF格式。
使用混合持久化后,Redis在重启数据恢复时候,会先加载RDB的内容,然后再执行AOF日志就可以完全替代之前的AOF全量文件执行,重启数据恢复的速度得到大大提升。

Redis进行持久化的时候会阻塞主线程吗?
fork子进程过程是阻塞的,fork过程就是创建一个主进程的副本,创建的子进程除了进程id,其余任何内容和主进程完全一致,这就是fork,fork的子进程独立于主进程存在,虽然两个进程内存空间内容完全一致,但是对于内存的写入、修改以及文件的映射都是独立的,两个进程互不影响,开启aof持久化,使用everysec同步策略时,会发生aof追加阻塞,出现aof阻塞的原因是磁盘负载过高,redis主进程会监控同步线程每次她同步aof缓冲区到aof文件的消耗时间,如果距离上次同步成功时间在2S内,那么主线程就会返回,如果超过2S,redis主进程会阻塞,直到同步完成,不管是RDB还是AOF持久化,都会使用fork创建一个子进程来处理,fork出来的子进程不会阻塞主进程,但是fork的过程还是会阻塞主进程,一般来说主进程内存越大,需要复制的空间内存叶也比较大,fork所需的时间也会长,redis阻塞的时间越长。

本文偏概念、偏面试八股,但学习理解了不管是对工作还是对面试都是有一定的帮助。
如有不正确的地方请各位指出纠正。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【YOLO v5 v7 v8 小目标改进】中心化特征金字塔(CFP) = 特征金字塔 + 显式视觉中心(EVC)+ 全局集中调节(GCR)

中心化特征金字塔(CFP) 特征金字塔 显式视觉中心(EVC) 全局集中调节(GCR) 提出背景中心化特征金字塔(CFP)CFP 架构图问题:不同尺度的对象检测问题:有限感受…

LeetCode //C - 118. Pascal‘s Triangle

118. Pascal’s Triangle Given an integer numRows, return the first numRows of Pascal’s triangle. In Pascal’s triangle, each number is the sum of the two numbers directly above it as shown: Example 1: Input: numRows 5 Output: [[1],[1,1],[1,2,1],[1,…

Spring Cloud 构建面向企业的大型分布式微服务快速开发框架+技术栈介绍

分布式架构图 Cloud架构清单 Commonservice(通用服务) 1)清单列表 2)代码结构 Component(通用组件) 1)清单列表 2)代码结构 快速开发管理平台——云架构【系统管理平台】 一…

python requests接口自动化测试 (数据库断言)

前言 熟练掌握接口自动化测试体系背后的这些技能和处理问题的思路,实现时间、人力、收益的平衡,对于一个经验尚浅的初、中级测试开发人员来说绝对是一个艰巨的挑战。 五步教会你写接口自动化用例 需要安装三方包:requests pytest pytest-htmlpip insta…

视觉三维重建colmap框架的现状与未来

近两年AI技术的火热尤其是nerf和gaussian splatting的出现,又将colmap推了一把,传统mvs的地位仿佛受到了挑战,虽然说nerf/gs的效果是无法胜任传统mvs的精度,但是作为"看看"的条件,是远远足够了。且传统重复纹…

chartjs 饼状图

之前要把canvas先清除掉&#xff0c;不然刷新数据&#xff0c;还会有前面的图表 function clearCanvas(){$(#donutChart).remove();$(#chartdiv).append(<canvas id"donutChart" style"min-height: 500px; height: 500px; max-height: 500px; max-width: 70%…

一文搞懂 Transformer 工作原理 !!

文章目录 前言 一、单头Attention工作原理 二、多头Attention工作原理 三、全连接网络工作原理 前言 本文将从单头Attention工作原理、多头Attention工作原理、全连接网络工作原理三个方面&#xff0c;实现一文搞懂Transformer的工作原理。 Transformer工作原理 一、单头Atte…

【学习记录】Resnet

Resnet的残差块 BasicBlock模块&#xff1a; Resnet的作用 解决梯度消失。网络越深&#xff0c;会导致梯度消失。Resnet可以解决梯度消失的问题。 Resnet的原理 参考视频&#xff1a;https://www.bilibili.com/video/BV1cM4y117ob/?spm_id_from333.337.search-card.all.cl…

达梦数据库查询语句内存溢出问题解决

背景&#xff1a;达梦数据库使用过程中&#xff0c;某天突然服务宕机&#xff0c;导致各类后端服务无法注册到nacos上&#xff0c;重启之后nacos正常启动&#xff0c;可执行一条两千多条数据量的连表查询时间很长&#xff0c;甚至会报错&#xff0c;经查看日志发现在查询过程中…

恒创科技:服务器CPU核心和线程如何理解?

​  关于 CPU 核心和线程&#xff0c;是服务器处理能力的核心和灵魂&#xff0c;它们决定了服务器执行任务和同时处理多个操作的效率。 那么&#xff0c;服务器中的 CPU 核心和线程到底是什么?如何理解呢? 什么是CPU核心? CPU核心作为CPU(中央处理单元)的主要处理单元。该…

Windows下卸载JDK

操作步骤&#xff1a; 直接到windows程序卸载面板进行卸载 然后删除已配置的环境变量

Python调用ChatGPT API使用国内中转key 修改接口教程

大家好&#xff0c;我是淘小白~ 有的客户使用4.0的apikey ,直接使用官方直连的apikey消费很高&#xff0c;有一位客户一个月要消费2万&#xff0c;想使用4.0中转的apikey&#xff0c;使用中转的apikey 需要修改官方的openai库&#xff0c;下面具体说下。 1、首先确保安装的op…

在vue2中使用饼状图

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 补充基本的body内容 <div id…

vscode起本地服务

下载这个 插件 Live Server (Five Server) 下载完会出现这个

政安晨【示例演绎虚拟世界开发】(二):Cocos Creator 配置工作环境并运行脚本

在这篇文章中&#xff0c;我们将会为Cocos Creator配置默认的脚本编辑器与预览浏览器&#xff0c;并在配置好的编辑器中实施Cocos Creator脚本编程工作。通过这篇文章&#xff0c;您将会掌握基础的脚本开发知识&#xff0c;同时会对Cocos Creator脚本编程有初步的认知。 配置外…

如何将一台电脑主机分裂成两台、三台?

有用户问&#xff1a;如何将一台电脑主机拆分成两台、三台甚至更多台使用&#xff1f; 这是什么意思&#xff1f; 简单解释一下&#xff1a;在一台计算机主机上&#xff0c;连接两台、三台或者更多台显示器&#xff0c;然后将这台主机的硬件资源分配给这些显示器&#xff0c;然…

退休开便利店真的靠谱吗?2024比较赚钱的创业项目排行

近日多个退休后开便利店赚钱的新闻登上热搜&#xff0c;但是&#xff0c;小编对此有疑问&#xff0c;退休的老年人开便利店真的是一个好选择吗&#xff1f; 第一、便利店最基本的转让费&#xff0c;装修费&#xff0c;进货等等&#xff0c;这笔开支非常大&#xff0c;足以掏空老…

librtmp源码分析

阅读了librtmp的源码&#xff0c;简单记录下。 首先补充下AMF格式基本知识 1 AMF格式 AMF是Action Message Format(动作消息格式)的简写&#xff0c;它是一种二进制的数据格式。它的设计是为了把actionscript里面的数据(包括Object, Array, Boolean, Number等)序列化成二进制…

Spring - InitializingBean、@PostConstruct、@Bean(initMethod = “init“)和构造方法执行优先级比较

执行顺序优先级 构造方法 > postConstruct > afterPropertiesSet > init方法 代码案例 Component public class InitializingBeanTest implements InitializingBean {public InitializingBeanTest(){System.out.println("构造方法");}Overridepublic void…

如何学习、上手点云算法(一):点云基础

写在前面 本文内容 点云算法的学习基础&#xff0c;入门方法&#xff0c;相关领域&#xff0c;资源&#xff0c;开源库&#xff0c;算法等的介绍&#xff1b; 以Open3D和PCL等为基础工具的点云处理代码讲解、实现&#xff1b; 文中涉及的参考以链接形式给出&#xff0c;涉及文…
最新文章