Redis(四)持久化策略

news2024/11/28 22:31:20

文章目录

  • 持久化策略
    • 1、为什么Redis需要持久化
    • 2、Redis提供的两种持久化方式
      • (1)RGB持久化详解
          • 概述
          • RGB持久化的两种触发策略
            • 手动触发实例测试:
            • 自动触发实例测试:
          • 查看rdb的状态信息`info Persistence `
          • rdb模式的优缺点
      • (2)AOF持久化详解
          • AOF持久化步骤:
          • AOF的重写机制
          • AOF的两种触发方式
          • AOF的数据恢复
          • 查看AOF的状态信息`info Persistence `
          • AOF模式的优缺点
          • AOF和RDB的选择场景
      • (3)混合持久化


持久化策略

1、为什么Redis需要持久化

Redis对数据的操作都是基于内存的,当遇到了进程退出、服务器宕机等意外情况,如果没有持久化机制,那么Redis中的数据将会丢失无法恢复。有了持久化机制,Redis在下次重启时可以利用之前持久化的文件进行数据恢复

2、Redis提供的两种持久化方式

从配置文件中我们可以看出有两类持久化文件:
在这里插入图片描述

  • RDB持久化
  • AOF持久化

(1)RGB持久化详解

概述

RDB 即 快照 模式(将内存数据以二进制文件形式保存起来),它是 Redis 默认的数据持久化方式,它会将数据库的快照保存在 dump.rdb 这个二进制文件中。
在这里插入图片描述

RGB持久化的两种触发策略
  • 手动触发
    • save命令
      save由主线程执行,会阻塞客户端命令;

在这里插入图片描述

    • bgsave命令

      Redis会单独创建(fork)一个子进程来进行持久化(该子进程与父进程享有相同的地址空间),会先将数据写入一个临时RDB文件,待持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。注意:此时的主进程仍然可以对外提供服务
      在这里插入图片描述

    • flushall命令
    • 关掉redis也会产生dump.rdb文件
  • 自动触发

     用户可以通过 save 选项设置多个保存条件,
     但只要其中任意一个条件被满足,服务器就会执行     BGSAVE 命令。
    

在这里插入图片描述

手动触发实例测试:

通过CONFIG GET dir命令查看当前的工作目录
在这里插入图片描述

无论是使用RDB还是AOF持久化方式,持久化文件都会保存在Redis服务器的工作目录中。
通过find命令查看已经存在的dump.rdb文件
在这里插入图片描述
通过rm命令删除此文件
在这里插入图片描述

此时运行save命令,可以看到已经重新生成一个dump.rdb文件
在这里插入图片描述

bgsave命令测试

在这里插入图片描述
在这里插入图片描述flushall命令测试
在这里插入图片描述
关掉redis服务测试是否产生文件
在这里插入图片描述

自动触发实例测试:

修改配置文件:

 save 60 3      60秒3个改变进行持久化

在这里插入图片描述
注意:修改配置文件后一定要重启redis服务

查看rdb的状态信息info Persistence

在这里插入图片描述

rdb模式的优缺点

优点:

  • RDB可以最大化Redis的性能,父进程再保存RDB文件时唯一要做的就是fork出一个子进程,然后这个子进程就会处理接下来的所以保存工作,父进程无需执行任何磁盘I/O操作
  • 适合大规模的数据恢复
  • rdb文件为二进制数据,占用的内存更小

缺点:

  • 不能实时的保存数据,需要一定的时间间隔进行操作,如果redis意外宕机了,这个最后一次修改的数据就没有了。
  • 当数据量非常大的时候,从父进程fork子进程进行保存至rdb文件时需要一点时间,

(2)AOF持久化详解

从 1.1 版本开始, Redis 增加了一种完全耐久的持久化方式: AOF 持久化。
默认是不开启AOF持久化方式,需修改配置文件 (永久)

 appendonly no     默认是不开启,改为yes
 appendfilename "appendonly.aof"
 redis7后将会创建三个文件
 # For example, if appendfilename is set to appendonly.aof, the following file
# names could be derived:
#-appendonly.aof.1.base。rdb作为基本文件。
#appendonly.aof.1.incr.aof。aof作为增量文件。
#-appendonly.aof。manifest作为清单文件。
  appendfilename "appendonly.aof"
  appenddirname "appendonlydir"   //文件夹名

默认是不开启AOF持久化方式,通过命令暂时开启 (暂时)config set appendonly yes
在这里插入图片描述
redis6或者之前的版本,那么在目录下会直接在/usr/local/bin/ 目录下生成一个appendonly.aof文件
会在你的工作目录下创建一个appendonlydir目录,并创建以下三个文件:
在这里插入图片描述 appendonly.aof.1.incr.aof里保存的就是刚才的写入命令

在这里插入图片描述
该命令格式为Redis的序列化协议(RESP)。*3代表这个命令有三个参数,$3表示该参数长度为3

AOF持久化步骤:

AOF需要记录Redis的每个写命令,步骤为:命令追加(append)、文件写入(write)和文件同步(sync)

  • 命令追加:开启AOF持久化功能后,服务器每执行一个写命令,都会把该命令以协议格式先追加到aof_buf缓存区的末尾,而不是直接写入文件,避免每次有命令都直接写入硬盘,减少硬盘IO次数
  • 文件写入与文件同步:然后通过 write() 系统调用,将 aof_buf 缓冲区的数据写入到 AOF 文件,此时数据并没有写入到硬盘,而是拷贝到了内核缓冲区 page cache,等待内核将数据写入硬盘;

为了提高文件的写入效率,当用户调用write函数,将一些数据写入到文件的时候,操作系统通常会将写入数据暂时保存在一个内存缓冲区里面,等到缓冲区的空间被填满、或者超过了指定的时限之后,才真正地将缓冲区中的数据写入到磁盘里面。
这种做法虽然提高了效率,但也为写入数据带来了安全问题,因为如果计算机发生停机,那么保存在内存缓冲区里面的写入数据将会丢失。为此,系统提供了fsync和fdatasync两个同步函数,它们可以强制让操作系统立即将缓冲区中的数据写入到硬盘里面,从而确保写入数据的安全性。

Redis 提供了 3 种写回硬盘的策略:

  appendfsync always 每执行一个命令就保存一次,安全性最高,最多只丢失一个命令的数据,但是性能也最低(频繁的磁盘IO)
  appendfsync everysec 每一秒保存一次,推荐使用,在安全性与性能之间折中,最多丢失一秒的数据
  appendfsync no 依赖操作系统来执行(一般大概30s一次的样子),安全性最低,性能最高,如果系统宕机,丢失操作系统最后一次AOF文件的数据
AOF的重写机制

AOF的工作原理是将写操作追加到文件中,文件的冗余内容会越来越多。所以Redis 新增了重写机制。当AOF文件的大小超过所设定的阈值时,Redis就会对AOF文件的内容压缩。

例如:
set k1 k1
set k1 k2
。。。将k1一共更改100次
如果没有重写机制,持久化文件就有100条写入的命令记录
而有重写机制,只保留最后一条,消除无效信息

在这里插入图片描述

  • 重写会有大量的写入操作,所以服务器进程会fork一个子进程
  • 子进程遍历 Redis 内存快照中数据写入临时 AOF 文件,同时会将新的写指令写入 aof_buf 和 aof_rewrite_buf 两个重写缓冲区,前者是为了写回旧的 AOF 文件,后者是为了后续刷新到临时 AOF 文件中,防止快照内存遍历时新的写入操作丢失
  • 当子进程完成重写之后,会给父进程一个信号,然后父进程会把AOF重写缓冲区的内容写进新的AOF临时文件中,再对新的AOF文件改名完成替换,这样可以保证新的AOF文件与当前数据库数据的一致性
AOF的两种触发方式
  • 手动触发

    • bgrewriteaof命令
      在这里插入图片描述
      重新生成了这三个文件:
      在这里插入图片描述

      可以看到appendonly.aof.2.base.rdb文件有
      在这里插入图片描述

  • 自动触发

     auto-aof-rewrite-percentage 100 AOF文件重写的大小比例,100代表100%表示当前AOF文件比上一次大一倍才会触发重写机制
     auto-aof-rewrite-min-size 64mb允许AOF重写的最小文件容量
     no-appendfsync-on-rewrite=no
     如果 no-appendfsync-on-rewrite=yes ,不写入aof文件只写入缓存,用户请求不会阻塞,但是在这段时间如果宕机会丢失这段时间的缓存数据。(降低数据安全性,提高性能)
     如果 no-appendfsync-on-rewrite=no, 还是会把数据往磁盘里刷,但是遇到重写操作,可能会发生阻塞。(数据安全,但是性能降低)
    
AOF的数据恢复

打开aof文件,对其进行修改

在这里插入图片描述
重启服务,发现连接失败
在这里插入图片描述
通过命令修复redis-check-aof --fix appendonly.aof.1.incr.aof

在这里插入图片描述会删除错误的那段数据
在这里插入图片描述

查看AOF的状态信息info Persistence

在这里插入图片描述

AOF模式的优缺点

优点:

  • 数据更完整,安全性更高,秒级数据丢失(取决fsync策略,如果是everysec,最多丢失1秒的数据)
  • AOF文件是一个只进行追加的日志文件,且写入操作是以Redis协议的格式保存的,内容是可读的,适合误删紧急恢复’

缺点:

  • 对于相同的数据集,AOF文件的体积要大于RDB文件,数据恢复也会比较慢
  • 在Redis负载比较高的情况下,RDB比AOF的性能好。
AOF和RDB的选择场景

在这里插入图片描述

  • 如果是数据比较重要,不想再从其他地方获取,且可以承受数分钟的数据丢失,比如缓存等,那么可以只使用RDB
  • 有很多用户都只使用 AOF 持久化, 但并不推荐这种方式: 因为定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比 AOF 恢复的速度要快。
  • 如果是用做内存数据库,要使用Redis的持久化,建议是RDB和AOF都开启,或者定期执行bgsave做快照备份,RDB方式更适合做数据的备份,AOF可以保证数据的不丢失

(3)混合持久化

Redis4.0开始支持RDB和AOF的混合持久化:

 通过修改配置开启
 aof-use-rdb-preamble yes
其中 yes 表示已经开启混合持久化,no 表示关闭,默认值为 yes。

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

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

相关文章

近期复盘 | 想多了都是问题,想开了都是答案

文章目录 🌹四月坚持背单词,五月坚持利用AI写文章😊六月会坚持干什么🙌23年7月:毕业两年,参保两年👀强制存储,消费降级,开源节流😜好好深耕能力🎁…

JavaScript 进阶 (一)

目录 作用域 局部作用域 函数作用域 块作用域 全局作用域 作用域链 JS垃圾回收机制 闭包 变量提升 函数进阶 函数提升 函数参数 箭头函数 基本语法 箭头函数参数 箭头函数this 解构赋值 数组解构 对象解构 遍历数组 forEach 方法(重点) …

shell SNAT与DNAT

文章目录 SNATSNAT原理与应用SNAT实验 DNATDNAT原理与应用DNAT实验 SNAT SNAT原理与应用 SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet(私有不能早Internet中正常路由) SNAT原理:修改数据包的源地址。 SNAT转换前提…

文心一言 VS 讯飞星火 VS chatgpt (23)-- 算法导论4.2 5题

五、V.Pan 发现一种方法,可以用 132 464 次乘法操作完成 68 x 68 的矩阵相乘,发现另一种方法,可以用 143 640 次乘法操作完成 70 x 70 的矩阵相乘,还发现一种方法,可以用155 424次乘法操作完成 72 x 72 的矩阵相乘。当…

数据安全治理科技产品能力-数据安全复合治理框架和模型解读(2)

数据治理,数据安全治理行业在发展,在实践,所以很多东西是实践出来的,哪有什么神仙理论指导,即使有也是一家之说,但为了提高企业投产比,必要的认知是必须的,落地数据安全治理科技水平差异直接决定产品和项目是否可持续性,当前和未来更需要专业和有效创新。数据安全治理…

自动驾驶业内动态简讯

1. 引言 参与自动驾驶领域相关研发工作已有多年,针对该领域的快速发展,收集业内各大科技公司最新进展和技术突破,供伙伴们交流探讨。 闲话少说,直接开始吧! 2. 博世 据新闻介绍,博世在德国道路上测试L4级无人驾驶汽…

java 区分缺陷Defects/感染Infections/失败Failure

java 区分缺陷Defects/感染Infections/失败Failure 缺陷Defects 软件故障总是从代码中一个或多个缺陷的执行开始。 缺陷只是一段有缺陷、不正确的代码。 缺陷可能是程序语句的一部分或完整部分,也可能对应于不存在但应该存在的语句。 尽管程序员要对代码中的缺陷负…

基于SSM的甜品店商城系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着社会经济的发展和…

Altium Designer 相同电路多组复制布线

在进行设计开发的时候,总会遇到相同的电路,或者模块,这些电路可以使用相同的布局和走线。我们可以画好其中一部分,然后直接复制,就可以提高效率。下面记录我自己的实际操作过程,有一些地方遇到了问题&#…

Android | Android OS 源码结构

参考:AndroidXRef (http://androidxref.com/)版本:Pie - 9.0.0_r3 整体结构 对于 Android OS 的源码目录来说,各个版本的结构大同小异,随不同版本特性会有个别目录差异。编译后会额外产生一个 out 文件夹用于存储编译产生的文件。…

Unity使用SteamVR2.0实现基本功能(瞬移,抓取物品,射线点击,UI交互等)

基础设置 把SteamVR的Player预制件拖到一个空场景,删掉场景内原本的相机 一.瞬移 新建一个Plane,当做地板找到SteamVR的人物瞬移控制器 Teleporting ,把它拖到场景里 1. 范围移动 我们需要在可以移动的区域,也就是碰撞器上,挂TeleportArea脚本 这个脚本会自动修改你的材质球…

抖音seo源码--开源,支持二开不加密

抖音seo源码,抖音seo矩阵系统源码技术搭建,抖音seo源码技术开发思路梳理搭建 开发思路: 抖音seo源码如何搭建?抖音seo排名优化系统软件部分源码分析,代码打包中。。。 场景:在 python 中,你可…

windows下修改PyCharm默认terminal 在Git Bash中使用conda

windows下修改PyCharm默认terminal & 在Git Bash中使用conda windows下修改PyCharm默认terminal在Git Bash中使用conda windows下修改PyCharm默认terminal PyCharm的terminal默认使用的是powershell,但是conda环境是通过cmd运行的,因此可以将PyChar…

安捷伦N5182A是德KEYSIGHT N5182B 100KHZ至3G/6G信号发生器

Agilent N5182A、Keysight N5182A MXG 射频矢量信号发生器,100 kHz - 3 GHz 或 6 GHz ​Keysight N5182A (Agilent) MXG 射频矢量信号发生器具有快速频率、幅度和波形切换、带电子衰减器的高功率和高可靠性 – 所有这些都集成在两个机架单元 (2RU) 中。Keysight N5…

H743 USBHOST协议栈 CPU占用率高的问题。

经过查看,是因为USBHOST频繁的进入中断导致,单步执行发现,是因为发生了USB_OTG_HCINT_CHH或者USB_OTG_HCINT_NAK中断了,只在CHH中断服务函数里,给USB主线程发了1个消息,又引起了USBH_Process_OS主线程的频繁…

YOLOV7训练TT100K交通标识符数据集

《临江仙》 作者:缠中说禅 浊水倾波三万里,愀然独坐孤峰。龙潜狮睡候飙风。无情皆竖子,有泪亦英雄。 长剑倚天星斗烂,古今过眼成空。乾坤俯仰任穷通。半轮沧海上,一苇大江东。 一、yolov7环境搭建 参…

【内网穿透】远程访问RabbitMQ服务

文章目录 前言1.安装erlang 语言2.安装rabbitMQ3. 内网穿透3.1 安装cpolar内网穿透(支持一键自动安装脚本)3.2 创建HTTP隧道 4. 公网远程连接5.固定公网TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址 转载自cpolar内网穿透的文章:无公网IP&…

【C语言】刷题训练营 —— 每日一练

文章目录 前言 BC113 小乐乐定闹钟BC114 小乐乐排电梯BC115 小乐乐与欧几里得BC116 小乐乐改数字BC107 矩阵转置BC117 小乐乐走台阶BC118 小乐乐与序列BC119 小乐乐与字符串BC121 小乐乐学编程BC122 小乐乐算平均分完结 前言 大家好,继续更新专栏 c_牛客&#xff0…

【C++】二叉搜索树Binary Search Tree

Binary Search Tree 二叉搜索树的概念二叉搜索树的操作二叉搜索树的实现查找插入删除 二叉搜索树的应用二叉搜索树的性能分析 二叉搜索树的概念 二叉搜索树又被称为二叉排序树,顾名思义,当我们使用中序遍历时,会得到一个有序的序列。二叉搜索…

进程信号的保存和处理

目录 🏆一、信号的保存 ①信号的捕捉 ②sigset_t ③sigaction 🏆二、不可重入函数 🏆三、volatile 🏆四、SIGCHLD 🏆一、信号的保存 在聊信号保存之前,我们不妨想一个问题,如果把所有信号…