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://xiahunao.cn/news/2822237.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

图结构数据的构建-DGL库

官方文档 一、图的特点 同构性与异构性 相比同构图,异构图里可以有不同类型的节点和边。这些不同类型的节点和边具有独立的ID空间和特征;同构图和二分图只是一种特殊的异构图,它们只包括一种关系 节点与边 有向图一条边、无向图两条边、…

在Windows系统中启动Redis服务

前言 Redis是一个开源、高性能的键值对数据库,常用于缓存、消息队列等场景。本文将详细指导您如何在Windows系统上启动Redis服务。 第一步:确认Redis安装 确保您已经在Windows系统上成功安装了Redis。官方提供了预编译好的Windows版本,您可…

代码随想录算法训练营第三十二天 | 122.买卖股票的最佳时机 II,55. 跳跃游戏, 45.跳跃游戏 II[贪心算法篇]

代码随想录算法训练营第二十六天 LeetCode 122.买卖股票的最佳时机 II题目描述思路参考代码 LeetCode 55. 跳跃游戏题目描述思路参考代码 LeetCode 45.跳跃游戏 II题目描述思路参考代码 LeetCode 122.买卖股票的最佳时机 II 题目链接:122.买卖股票的最佳时机 II 文章…

如何在腾讯云上快速部署幻兽帕鲁/Palworld服务器?

如何在腾讯云上快速部署幻兽帕鲁/Palworld服务器? 准备工作:首先需要准备腾讯云账号和Steam账号。腾讯云账号适用于新老用户,而Steam账号则是因为幻兽帕鲁是一款Steam平台的游戏。此外,还需要购买一台腾讯云服务器,推荐…

Makefile从入门到项目编译实战(学习笔记)

1.make和makefile介绍 1. make make 是一个应用程序,位于 /usr/bin/make 目录下,make 有如下的功能: (1)解析源程序之间的依赖关系 (2)根据依赖关系自动维护编译工作 (3&#xff09…

VS2019_连接 SqlServer 数据库

目录 1. 编写好 SQL 语句,存为文件 2. 将这个 SQL 文件直接拖到 VS 的桌面快捷键上面 3. 点击运行 4. 输入相关参数,连接 5. 点击运行,即可查出结果 6. 关闭 VS2019,再次执行2和3步 7. 历史 > 选择库 > 连接 8. 运行…

Charles抓包 - 安装、激活、证书配置

最近刚好又遇到了抓包的需求,之前一直使用 Fiddler 抓包,这几年一直听大家都在用 Charles 抓包,正好一起了解下(一般建议掌握一种抓包方式即可,都可以解决同种需求场景) 抓包 Fiddler抓包 Charles 下载、安…

杭电OJ 2045 不容易系列之(3)—— LELE的RPG难题 C++

思路:我先模拟了一下1,2,3的情况,对应的是3 6 6,模拟到4的时候就有感觉了,1是不受到任何制约的,2到n-1是收到了前面一个的制约,n受到了n-1与1的制约,那么就可以去判断4 …

Vue全家桶:vue2+vue3全部搞懂:第五篇,Vue的watch监视器

前提,建议先学会前端几大基础:HTML、CSS、JS、Ajax,不然不好懂 这一专栏知识将一次性将vue、vue2、vue3全部讲明白 一、何为watch监视器 其实我个人理解,就跟原本的表单的input事件一样,实时监视事件发生并同步更新数…

gcd+线性dp,[蓝桥杯 2018 国 B] 矩阵求和

一、题目 1、题目描述 经过重重笔试面试的考验,小明成功进入 Macrohard 公司工作。 今天小明的任务是填满这么一张表: 表有 �n 行 �n 列,行和列的编号都从 11 算起。 其中第 �i 行第 �j 个元素…

逆序字符串

逆序字符串 题目描述:解法思路:解法代码:运行结果: 题目描述: 输入⼀个字符串,写⼀个函数将⼀个字符串的内容逆序过来。 测试1: 输⼊:abcdef 输出:fedcba 测试2&#x…

《剑指 Offer》专项突破版 - 面试题 62 : 详解前缀树以及实现(C++)

目录 一、前缀树的基础知识 二、实现前缀树 一、前缀树的基础知识 前缀树,又称为字典树,它用一个树状的数据结构存储一个字典中的所有单词。如果一个字典中包含单词 "can"、"cat"、"come"、"do"、"i&qu…

python实现常见一元随机变量的概率分布

一. 随机变量 随机变量是一个从样本空间 Ω \Omega Ω到实数空间 R R R的函数,比如随机变量 X X X可以表示投骰子的点数。随机变量一般可以分为两类: 离散型随机变量:随机变量的取值为有限个。连续型随机变量:随机变量的取值是连…

物体检测-系列教程19:YOLOV5 源码解析9 (Focus模块、Model类构造函数)

😎😎😎物体检测-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 13、Focus模块 13.1 基本流程 原始输入图像的格式为:tensor: float32[1,3,64…

南京观海微电子---如何区分LED显示屏与LED背光源?

LED屏绝对不是常见的LED背光源,LED显示屏也被称为电子显示屏或浮动字。由LED点阵和LEDPC面板,通过红,蓝,白,绿LED的亮灭来显示文字,图像,动画,视频,内容。可根据不同的场…

C++ //练习 10.5 在本节对名册(roster)调用equal的例子中,如果两个名册中保存的都是C风格字符串而不是string,会发生什么?

C Primer(第5版) 练习 10.5 练习 10.5 在本节对名册(roster)调用equal的例子中,如果两个名册中保存的都是C风格字符串而不是string,会发生什么? 环境:Linux Ubuntu(云服务器) 工具…

CSP-201912-2-回收站选址

CSP-201912-2-回收站选址 【50分思路-暴力枚举】 #include <iostream> #include <vector> #include <algorithm> using namespace std; struct trashPoint {int x; int y; }; vector<trashPoint>trashList; vector<int>grade(5); int main…

xxl-job异步任务日志打印到调度器任务管理日志

文章目录 1. xxl-job-core模块添加过滤器2. 执行器logback.xml添加过滤器配置3. 测试 1. xxl-job-core模块添加过滤器 package com.xxl.job.core.config;import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.classic.spi.ThrowableProxy; import ch.qos.…

Netty之ChannelHandlerMask详解

Netty的ChannelHandlerMask是用于标记ChannelHandler的位掩码。它被用于指示ChannelHandler的事件处理方式。ChannelHandlerMask 定义了ChannelHandler所有事件。 final class ChannelHandlerMask {static final int MASK_EXCEPTION_CAUGHT 1;static final int MASK_CHANNEL_…

SpringBoot多数据源最佳实践

为什么需要spring boot多数据源 最常见的场景就是单体架构系统需要跨库进行业务增删改查,例如一个购车系统可能需要查询用户信息,然后在进行购买汽车的逻辑。而用户表和汽车表可能不在一个数据库中。 如下图所示,可能一个购买汽车的下单流程为: 用户提交请求。 基于id到数…