Redis——持久化策略

Redis持久化

Redis的读写操作都是在内存上,所以Redis性能高。 但是当重启的时候,或者因为特殊情况导致Redis崩了,就可能导致数据的丢失。 所以Redis采取了持久化的机制,重启的时候利用之间持久化的文件实现数据的恢复。

Redis提供了三种持久化的机制:

  • RDB:将某一段时间的内存数据,以二进制的方式写到磁盘中
  • AOF:每次执行写操作,都将命令以追加的方式写到文件中
  • 混合持久化方式:结合了RDB和AOF的优势

RDB机制

RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。 ps: 执行快照是一种比较重的操作,如果频率太低,那么当服务器崩了,那么丢失的数据就多,如果频率高,那么就会对性能造成影响。

手动触发

手动触发分别对应save和bgsave命令:

  • save命令:阻塞当前Redis服务器,直到RDB过程完毕为止,对于内存比较大的实例会造成长时间的阻塞。(这很不推荐)
  • bgsave:Redis过程执行fork之后,会创建子进程,RDB的持久化工作就是让子进程负载,完成后自动结束。

自动触发机制

  • 使用save配置。 如“save m n” 表示m秒内数据发送了n次修改,自动RDB持久化
  • 从节点进行全量复制操作的时候,主节点自动进行RDB持久化,随后将文件内容发送给从节点
  • 执行shutdown命令关闭Redis时,执行RDB持久化

下图是bgsave命令的过程:
在这里插入图片描述

  1. 执行bgsave的时候,Redis父进程判断当前进程是否存在其他进程的子进程,如RDB/AOF子进程,如果存在bgsave命令直接返回
  2. 如果不存在,父进程创建子进程,fork过程中父进程阻塞,可以通过info stat命令查看latest_fork_user选项,可以获取最近一次fork操作的耗时(单位是毫秒)
  3. 父进程fork完毕后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令
  4. 子进程会创建RDB文件,根据父进程内存生成一个临时快照文件,完成后对原有的文件进行替换。
  5. 最后,子进程发送信号给父进程,父进程更新统计结果

Redis默认的配置文件中提供了bgsave的方式

save 900 1
save 300 10
save 60 10000
  • 900s之内,对数据进行一次修改
  • 300s之内,对数据进行10次修改
  • 60s之内,对数据进行1000修改

如果触发了上面的条件,那么就会触发RDB机制。

RDB文件的处理

保存:RDB⽂件保存在dir配置指定的⽬录(默认/var/lib/redis/)下,⽂件名通过dbfilename配置(默认dump.rdb)指定。可以通过执⾏config set dir {newDir} 和 config set dbfilename {newFilename}运⾏期间动态执⾏,当下次运⾏时RDB⽂件会保存到新⽬录。

RDB的优缺点

  • RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间上的数据快照。 使用于备份,全量复制等场景。
  • Redis加载RDB文件恢复数据远远快于AOF文件,因为RDB文件是以二进制存储的。
  • RDB方式数据没办法做到实时持久化/秒级持久。 因为bgsave每次运行都要执行fork创建子进程,属于重量操作,频繁操作成本高。

AOF机制

AOF持久化:以独立日志的方式记录每次写操作,重启的时候执行AOF文件中的命令达到恢复数据的目的。

可以在配置文件中开启appendonly yes选项,默认是不开启。
下图是AOF的工作流程
在这里插入图片描述

  1. 将所有的写入操作追加到aof_buf缓冲区中
  2. AOF缓冲区根据对应的策略向硬盘做同步操作
  3. 随着AOF文件越来越大,需要定期的AOF文件进行重写,达到压缩的目的
  4. 当Redis启动的时候,可以加载AOF文件进行数据的恢复

AOF命令写入的内容是以文本协议格式。 例如set hello world 这条命令,在AOF缓冲区追加如下文本所示

*3\r\n$3\r\nset\r\n$5\r\nhello\r\n$5\r\nworld\r\n

AOF是选择文本协议来进行存储的,Redis以这种方式存储有可能的原因如下:

  • 文本协议有较好的兼容性
  • 实现简单,可读性好

看了AOF的工作流程后,想一想为什么AOF需要aof_buf这个缓冲区呢? Redis使用单线程响应命令,如果每次写AOF文件都直接同步到硬盘上,性能从内存到IO读写,性能会下降。 所以先将数据写入到aof_buf中,会有效降低IO的次数,同时Redis提供了3种缓冲区的同步策略。
如下图所示:

文件同步:

Redis提供了3种AOF缓冲区同步文件策略。由参数appendfsync控制

在这里插入图片描述

系统调用write和fsync:

  • write操作会触发延迟写机制。Linux在内核中提供了页缓冲区来提供硬盘IO性能。write在写入系统缓冲区后立即返回。同步硬盘操作依赖于系统调度机制。
  • fsync是对单个文件进行操作,做强制硬盘同步,fsync将阻塞直到数据写入到硬盘上。

当Redis同步策略为always时,每次写都要同步AOF文件,性能很差。
配置为no的时候,同步策略不可控,虽然提高了性能,但数据丢失的可能性增大了
当配置为everysec的时候,是默认配置,兼顾了数据安全和性能。

所以不同的策略,如果发送数据丢失,数据丢失的程度是不一样的,如果是always,那么每次都会进行同步操作,数据不会丢失,但是如果设置为no,那么数据丢失就可能很多,而everysec,数据只会丢失1s内的数据。

AOF重写机制

随着命令不断地写入到AOF文件中,文件会越来越大,为了解决这个问题,Redis引入了重写机制来解决。

什么是重写机制

Redis会将旧的命令删除掉,只会保留数据的最新版本。 并且多条写操作会合并成一条。

而较小的AOF文件一方面降低了硬盘的空间,一方面可以提高启动Redis恢复数据的速度。

AOF重写过程也分为手动触发和自动触发

  • 手动触发:调用bgrewriteof命令
  • 自动触发:根据auto-aof-rewrite-min-size 和 auto-aof-rewrite-percentage 参数确定自动触发时机。

auto-aof-rewrite-min-size: 表示触发时AOF的最小文件大小,默认是64MB
auto-aof-rewrite-percentage:代表当前AOF占用大小相比较上次重写时增加的比例

AOF重写的流程图如下:
在这里插入图片描述

  1. 执行AOF重写请求
    如果当前进程正在执行AOF重写,请求不执行。如果当前进程正在执行bgsave操作,重写命令延迟到bgsave操作完毕后执行
  2. 父进程执行fork,创建子进程
  3. 重写
    a.主进程fork之后,继续响应其他命令。所有的修改写入到AOF的缓冲区中并根据appendfsync策略同步到硬盘,保证旧的AOF文件机制正确
    b. 子进程只有fork之前的所有内存信息。父进程需要将fork之后的这段时间的写操作写入到AOF重写缓冲区中
  4. 子进程根据内存快照,将命令合并到新的AOF文件
  5. 完成子进程重写,新文件写入后,子进程发送信号给父进程。父进程将AOF重写缓冲区的数据追加到新的AOF文件中。 最后将新的AOF文件替换旧的AOF文件

所以Redis持久化的机制为下图所示
在这里插入图片描述

为什么会有混合持久化

RDB的优势就是恢复速度快,因为是以二进制存储的,但是快拍的频率不好把握。频率太低,丢失的数据量就多,频率太多,就会导致性能降低

AOF的优点:丢失的数据少,但是恢复的速度不快。

所以结合了RDB和AOF的优点,Redis4.0推出了混合持久化的机制,保证了Redis的重启速度,又降低了数据丢失的风险。 混合持久化最大的差别就是AOF文件不再是以文本来存储的了,而是以二进制的方式来存储。这就导致了恢复数据的时候,速度会比AOF快。

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

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

相关文章

Golang | Leetcode Golang题解之第424题替换后的最长重复字符

题目: 题解: func characterReplacement(s string, k int) int {cnt : [26]int{}maxCnt, left : 0, 0for right, ch : range s {cnt[ch-A]maxCnt max(maxCnt, cnt[ch-A])if right-left1-maxCnt > k {cnt[s[left]-A]--left}}return len(s) - left }f…

PyCharm与Anaconda超详细安装配置教程

1、安装Anaconda(过程)-CSDN博客 2.创建虚拟环境conda create -n pytorch20 python3.9并输入conda activate pytorch20进入 3.更改镜像源conda/pip(只添加三个pip源和conda源即可) 4.安装PyTorch(CPU版) 5.安装Pycharm并破解&…

猫咪检测系统源码分享

猫咪检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

USDT自动化交易【Pinoex】【自动化分析】【ChatGPT量化脚本】

Pinoex 是一个相对较新的加密货币交易平台,虽然具体的自动交易算法细节对外部用户可能并不公开,但我们可以讨论一般情况下加密货币自动交易算法的常见策略和方法。以下是一些可能会被类似平台或个人交易者使用的自动交易算法和策略。 1. 市场制造商&…

Google 扩展 Chrome 安全和隐私功能

过去一周,谷歌一直在推出新特性和功能,旨在让用户在 Chrome 上的桌面体验更加安全,最新的举措是扩展在多个设备上保存密钥的功能。 到目前为止,Chrome 网络用户只能将密钥保存到 Android 上的 Google 密码管理器,然后…

计算机网络17——IM聊天系统——客户端核心处理类框架搭建

目的 拆开客户端和服务端,使用Qt实现客户端,VS实现服务端 Qt创建项目 Qt文件类型 .pro文件:配置文件,决定了哪些文件参与编译,怎样参与编译 .h .cpp .ui:画图文件 Qt编码方式 Qt使用utf-8作为编码方…

从零开始学习TinyWebServer

写在前面 项目参考:https://github.com/qinguoyi/TinyWebServer 写作框架/图参考:https://blog.csdn.net/qq_52313711/article/details/136356042?spm1001.2014.3001.5502 原本计划是,先将项目代码大概看一遍,然后再着手实现一下…

《高等代数》线性相关和线性无关(应用)

说明:此文章用于本人复习巩固,如果也能帮到大家那就更加有意义了。 注:1)线性相关和线性无关的证明方法中较为常用的方法是利用秩和定义来证明。 2)此外,线性相关和线性无关的证明常常也会用到反证法。 3&…

ChatGPT 4o 使用指南 (9月更新)

首先基础知识还是要介绍得~ 一、模型知识: GPT-4o:最新的版本模型,支持视觉等多模态,OpenAI 文档中已经更新了 GPT-4o 的介绍:128k 上下文,训练截止 2023 年 10 月(作为对比,GPT-4…

play-with-docker使用指南

Play-with-Docker(PWD)是一个在线平台,提供免费的 Docker 实验环境。它允许用户在浏览器中创建和管理 Docker 容器,适合学习和实验。国内访问需要借助于魔法工具,否则可能无法访问哦。 网站地址:https://labs.play-with-docker.com/ 一、登录play-with-docker 点击页面上…

深度学习自编码器 - 去噪自编码器篇

序言 在深度学习的广阔天地中,自编码器作为一种强大的无监督学习工具,通过重构输入数据的方式,不仅实现了数据的有效压缩,还探索了数据的内在表示。而去噪自编码器( Denoising Autoencoder, DAE \text{Denoising Auto…

Java | Leetcode Java题解之第424题替换后的最长重复字符

题目&#xff1a; 题解&#xff1a; public class Solution {public int characterReplacement(String s, int k) {int len s.length();if (len < 2) {return len;}char[] charArray s.toCharArray();int left 0;int right 0;int res 0;int maxCount 0;int[] freq n…

C++:多态(协变,override,final,纯虚函数抽象类,原理)

目录 编译时多态 函数重载 模板 运行时多态 多态的实现 实现多态的条件 协变 析构函数的重写 override 关键字 final 关键字 重载、重写、隐藏对比 纯虚函数和抽象类 多态的原理 多态是什么&#xff1f; 多态就是有多种形态 多态有两种&#xff0c;分别是编译时…

黑马智数Day1

src文件夹 src 目录指的是源代码目录&#xff0c;存放项目应用的源代码&#xff0c;包含项目的逻辑和功能实现&#xff0c;实际上线之后在浏览器中跑的代码就是它们 apis - 业务接口 assets - 静态资源 &#xff08;图片&#xff09; components - 组件 公共组件 constants…

LeetCode 面试经典 150 题回顾

目录 一、数组 / 字符串 1.合并两个有序数组 &#xff08;简单&#xff09; 2.移除元素 &#xff08;简单&#xff09; 3.删除有序数组中的重复项 &#xff08;简单&#xff09; 4.删除有序数组中的重复项 II&#xff08;中等&#xff09; 5.多数元素&#xff08;简单&am…

【全网最全】2024年华为杯研赛A题成品论文获取入口(后续会更新)

您的点赞收藏是我继续更新的最大动力&#xff01; 一定要点击如下的卡片&#xff0c;那是获取资料的入口&#xff01; 点击链接加入【2024华为杯研赛资料汇总】&#xff1a;https://qm.qq.com/q/hMgWngXvcQhttps://qm.qq.com/q/hMgWngXvcQ你是否在寻找数学建模比赛的突破点&am…

LabVIEW机动车动态制动性能校准系统

机动车动态制动性能测试系统通过高精度的硬件设备与LabVIEW软件的紧密配合&#xff0c;实现了对机动车制动性能的精确校准与评估。系统不仅提高了测试的精确性和效率&#xff0c;而且具备良好的用户交互界面&#xff0c;使得操作更加简便、直观。 项目背景 随着机动车辆数量的…

Redisson实现分布式锁(看门狗机制)

目录 可重入锁&#xff1a; 锁重试和看门狗机制&#xff1a; 主从一致性&#xff1a; 首先引入依赖&#xff0c;配置好信息 3.使用Redisson的分布式锁 可重入锁&#xff1a; 可重入锁实现是通过redsi中的hash实现的&#xff0c;key依旧是业务名称加id&#xff0c;然后第一个…

Cocos Creator3.x设置动态加载背景图并且循环移动

效果图 项目结构 项目层级结构&#xff1a; 预制&#xff1a; 代码 import { _decorator, CCFloat, Component, Node, Sprite, instantiate, Prefab, assert } from cc; const { ccclass, property } _decorator;/*** 背景脚本*/ ccclass(Background) export class Backg…

前端入门:HTML+CSS

引言&#xff1a; 前端三大件&#xff1a;HTML、CSS、JS&#xff0c;每一个部分都很重要&#xff0c;我听过比较形象的比喻就是HTML&#xff08;HYPER TEXT MARKUP LANGUAGE&#xff09;相当于骨架&#xff0c;而CSS就是装饰渲染&#xff0c;JS则是动作功能实现。 之前的文章…