Redis基础系列-持久化

news2024/11/19 3:16:31

Redis基础系列-持久化

文章目录

  • Redis基础系列-持久化
    • 1. 什么是持久化
    • 2. 为什么要持久化
    • 3. 持久化的两种方式
      • 3.1 持久化方式1:RDB(redis默认持久化方式)
        • 3.11 配置步骤-自动触发
        • 3.12 配置步骤-手动触发
        • 3.12 优点
        • 3.13 缺点
        • 3.14 检查和修复RDB快照文件
        • 3.15 哪些情况会触发RDB快照
        • 3.16 如何禁用快照
        • 3.17 RDB优化配置项详解
      • 3.2 持久化方式2:AOF
        • 3.2.1 AOF持久化工作流程
        • 3.2.2 三种写回策略
        • 3.2.3 AOF配置说明
        • 3.2.4 AOF文件说明
        • 3.2.5 AOF恢复
        • 3.2.6 AOF文件修复
        • 3.2.7 AOF重写机制
        • 3.2.8 总结
      • 3.3 持久化方式3:混合模式RDB+AOF
        • 3.3.1 混合模式介绍
        • 3.3.2 开启混合方式设置
        • 3.3.3 数据的加载流程
      • 3.4 纯缓存模式
    • 4. 参考和感谢

1. 什么是持久化

内存中的数据保存到磁盘中

2. 为什么要持久化

Redis持久化可以将内存中的数据保存到硬盘上,保证Redis的数据持久性和可靠性以避免数据在异常情况下丢失和损坏。持久化是保证Redis应用安全的重要手段。

3. 持久化的两种方式

redis持久化官网介绍

3.1 持久化方式1:RDB(redis默认持久化方式)

RDB(Redis DataBase)模式是Redis的默认持久化模式。它会将Redis在某个时间点上的数据生成一个快照,并将快照以二进制形式保存在磁盘上。RDB模式的优点在于快速且紧凑,适合用于备份和恢复数据。然而,由于定期生成快照的特性,可能会导致在两次快照之间的数据丢失。

适用场景: 对数据的实时性要求不高,可以接受一定程度的数据丢失,同时对于需要频繁备份和恢复数据的场景。

3.11 配置步骤-自动触发
  • 操作步骤:

1.修改5秒2次变更

save 5 2


2.修改快照文件保存路径(需优先创建:dumpfiles目录)

dir /myredis/dumpfiles

3.修改快照名称

dbfilename dump6379.rdb

  1. 重启redis验证配置是否成功(略)
127.0.0.1:6379> config get save
1) "save"
2) "5 2"
127.0.0.1:6379> config get dir
1) "dir"
2) "/myredis/dumpfiles"
127.0.0.1:6379> config get dbfilename
1) "dbfilename"
2) "dump6379.rdb"
127.0.0.1:6379>
  • 触发配置
// 变更两次,查看是否会生产快照文件
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> 

  • 备份恢复
    • redis 执行flushall也会产生dump文件,不过是空的
    • redis 执行shutdown也会产生dump文件,不过是空的
    • redis 直接重启就会加载备份的快照文件
3.12 配置步骤-手动触发
  • save命令

在主程序中执行会阻塞当前redis服务器,直到持久化工作完成执行save命令期间,Redis不能处理其他命令,线上禁止使用

  • bgsave(Background Save)命令(默认)

Redis会使用bgsave对当前内存中的所有数据做快照这个操作是子进程在后台完成的,这就允许主进程同时可以修改数据

可以通过lastsave命令获取最后一次成功执行快照的时间

127.0.0.1:6379> lastsave
(integer) 1701683772
127.0.0.1:6379> 
[root@Docker110]# date -d @1701683772
2023年 12月 04日 星期一 17:56:12 CST
3.12 优点
  • 适合大规模的数据恢复按照业务定时备份
  • 对数据完整性和一致性要求不高
  • RDB文件在内存中的加载速度要比 AOF 快得多
3.13 缺点
  • 在一定间隔时间做一次备份,所以如果redis章外down掉的话,就会丢失从当前至最近一次快照期间的数据,快照之间的数据会丢失
  • 内存数据的全量同步,如果数据量太大会导致I/O严重影响服务器性能RDB依赖于主进程的fork,在更大的数据集中,这可能会导致服务请求的瞬间延迟。fork的时候内存中的数据被克隆了一分,大致2倍的膨胀性,需要考虑
3.14 检查和修复RDB快照文件
redis-check-rdb /myredis/dumpfiles/dump6379.rdb

3.15 哪些情况会触发RDB快照
  • 配置文件中默认的快照配置
  • 手动save/bgsave命令
  • 执行flushall/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义
  • 执行shutdown且没有设置开启AOF持久化
  • 主从复制时,主节点自动触发
3.16 如何禁用快照
  • 命令方式:
redis-cli config set save ""
  • 修改配置文件:
3.17 RDB优化配置项详解
  • stop-writes-on-bgsave-error


默认yes
如果配置成no,表示你不在乎数据不一致或者有其他的手段发现和控制这种不一致,那么在快照写入失败时,
也能确保redis继续接受新的写请求
  • rdbcompression

默认yes
对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis会采用LZF算法进行压缩。
如果你不想消耗CPU来进行压缩的话,可以设置为关闭此功能
  • rdbchecksum

默认yes
在存储快照后,还可以让redis使用CRC64算法来进行数据校验,但是这样做会增加大约10%的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能
  • rdb-del-sync-files

rdb-del-sync-files:在没有持久性的情况下删除复制中使用的RDB文件启用。默认情况下no,此选项是禁用的。

3.2 持久化方式2:AOF

AOF(Append Only File)模式是另一种常用的持久化模式。它会将每个写操作都追加到一个日志文件中,从而记录了Redis的所有操作命令。在恢复数据时,Redis会重新执行这些操作命令以还原数据。AOF模式的优点在于数据的持久化更加可靠,不会丢失任何写操作。然而,由于需要记录每一条写命令,相对于RDB模式,AOF模式的写入性能较差。

适用场景: 对数据的可靠性要求较高,需要最大程度地避免数据丢失的场景

3.2.1 AOF持久化工作流程

序号描述
1Client作为命令的来源,会有多个源头以及源源不断的请求命令。
2在这些命令到达Redis Server以后并不是直接写入AOF文件,会将其这些命令先放入AOF缓存中进行保存。这里的AOF缓冲区实际上是内存中的一片区域,存在的目的是当这些命令达到一定量以后再写入磁盘,避免频繁的磁盘IO操作。
3AOF缓冲会根据AOF缓冲区同步文件的三种写回策略将命令写入磁盘上的AOF文件。
4随着写入AOF内容的增加为避免文件膨胀,会根据规则进行命令的合并(又称AOF重写),从而起到AOF文件压缩的目的。
5当Redis Server服务器重启的时候会从AOF文件载入数据。
3.2.2 三种写回策略
配置项写回时机优点缺点
Always同步写回可靠性高,数据基本不丢失每个写命令都要落盘,性能影响较大
Everysec(默认)每秒写回性能适中宕机时丢失1秒内的数据
No操作系统控制性能好宕机时丢失数据较多
3.2.3 AOF配置说明
配置指令描述配置示例
appendonly是否开启AOFappendonly yes
appendfilenameAOF文件名称appendfilename “appendonly.aof”
dir+appenddirnameAOF文件路径dir /myredis+“appendonlydir”
appendfsyncAOF同步写回方式everysec/always/no
no-appendfsync-on-rewriteAOF重写期间是否同步写回no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage
auto-aof-rewrite-min-size
AOF重写触发配置,触发重写的比例阈值和最小文件大小阈值;
满足配置文件中的选项后,Redis会记录上次重写时的AOF大小
默认配置是当AOF文件大小是上次rewrite后大小的一倍目文件大于64M时
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
3.2.4 AOF文件说明

Redis7.0 Multi Part AOF的设计
顾名思义,MP-AOF就是将原来的单个AOF文件拆分成多个AOF文件(redis6只有一个文件)。在MP-AOF中,我们将AOF分为三种类型分别为:
它一般由子进程通过重写产生,该文件最多只有一个

  • BASE: 表示基础AOF
  • INCR: 表示增量AOF,
    它一般会在AOFRW开始执行时被创建,该文件可能存在多个。
  • HISTORY: 表示历史AOF,它由BASE和INCR AOF变化而来,每次AOFRW成功完成时本次AOFRW之前对应的BASE和INCR AOF都将变为HISTORY,HISTORY类型的AOF会被Redis自动删除为了管理这些AOF文件我们引入了一个manifest (清单) 文件来跟踪、管理这些AOF。同时,为了便于AOF备份和拷贝,我们将所有的AOF文件和manifest文件放入一个单独的文件目录中,目录名由appenddirname配置
    (Redis 7.0新增配置项) 决定。

// 如有下的aof文件存在
1.基本文件
appendonly.aof.1base .rdb
2.增量文件
appendonly.aof.1.incr.aof
appendonly.aof.2.incr.aof
3.清单文件
apendonly.aof.manifest

AOF路径说明

redis7.0 AOF文件路径:dir + appenddirname 其中

  • dir是RDB和AOF共用配置参数
  • appenddirname 是redis7新增的aof独特配置
// 几种类型文件的前缀,后跟有关序列和类型的附加信息
appendfilename"appendonly.aof
//新版本增加的目录配置项目
appenddirname "appendonlydir"
3.2.5 AOF恢复

采用 flushdb + shutdown模拟redis异常终止,需要注意的是:

  • flushdb也是写操作,也会写入aof文件,所以在执行flushdb之前备份aof文件,flushdb之后可以使用 备份的aof 覆盖掉aof文件
  • 也可以不备份,在执行完flushdb + shutdown操作之后,手动删除增量文件中的最后flushdb命令
  • 为了防止RDB文件的干涉,重启之前删除RDB文件,或者模拟整个过程中关闭RDB持久化

最后,重启reids便可加载aof文件进行数据恢复

3.2.6 AOF文件修复

故意破环aof增量文件

[root@Docker110 appendonlydir]# vim appendonly.aof.1.incr.aof 
*2
$6
......
$1
0
jasitfgjwaior943q294r534jiosa(*(u

重启启动之后查看

居然启动失败,赶紧查看一下日志,日志文件

日志文件路径的配置

建议让我们修复一下aof文件

再次启动,成功恢复

3.2.7 AOF重写机制

AOF 文件的不断增长可能会导致性能问题。为了解决这个问题,Redis 实现了 AOF 重写机制。AOF 重写是一种优化技术,通过在后台进程中重构 AOF 文件的数据,来减小 AOF 文件的大小。
启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集

也就是说 AOF 文件重写并不是对原文件进行重新整理,而是直接读取服务器现有的键值对,
然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件后去替换原来的 AOF 文件。
AOF 文件重写触发机制: 过 redis.conf 配置文件中的 auto-aofrewrite-percentage: 默认值为100,以及auto-aofrewritemin-size: 64mb 配置,
也就是说默认Redis会记录上次重写时的AOF大小,默认配置是当AOF文件大小是上次rewrite后大小的一倍目文件大于64M时触发
  • 重写机制的配置

注意 ,同时满足,且的关系才会触发
1 根据上次重写后的aof大小,判断当前aof大小是不是增长了1倍
2 重写时满足的文件大小
  • 触发方式
1. 自动触发:满足重写机制配置条件,就会自动后台执行重写,也就是压缩aof
2. 手动触发: 客户端向服务器发送 bgrewriteaof 命令
  • 重写原理
1.AOF 重写机制的原理是根据 Redis 进程内的数据生成一个新的 AOF 文件,只包含当前有效和存在的数据的写入命令,而不是历史上所有的写入命令 。
2.AOF 重写机制是通过 fork 出一个子进程来完成的,子进程会扫描 Redis 的数据库,并将每个键值对转换为相应的写入命令,然后写入到一个临时文件中 。
3.在子进程进行 AOF 重写的过程中,主进程还会继续接收和处理客户端的请求,如果有新的写操作发生,主进程会将这些写操作追加到一个缓冲区中,并通过管道通知子进程 。
4.子进程在完成 AOF 重写后,会将缓冲区中的写操作也追加到临时文件中,然后向主进程发送信号,通知主进程可以切换到新的 AOF 文件了 。
5.主进程在收到子进程的信号后,会将缓冲区中的写操作再次追加到临时文件中(以防止在此期间有新的写操作发生),然后用临时文件替换旧的 AOF 文件,并关闭旧的 AOF 文件 
  • 验证
文件大小调整为 1k 方便验证

反复多次设置k1

查看增量aof内容的的变化、aof文件名称以及大小的变化

可以清晰的看到重写之后的变化:

  1. base基础aof由0变成130、增量aof由384变成0、清单aof没有变化,整体大小进行了压缩
  2. 文件序号由1变成了
3.2.8 总结

更好的保护数据不丢失 、性能高、可做紧急恢复相同数据集的数据而言aof文件要远大于rdb文件,恢复速度慢于rdbaof运行效率要慢于rdb,每秒同步策略效率较好,不同步效率和rdb相同

3.3 持久化方式3:混合模式RDB+AOF

3.3.1 混合模式介绍

我们首先看看官网对混合模式的介绍:

一般来说,如果你想要一个与PostgreSQL相媲美的数据安全程度,你应该使用这两种持久化方法。RDB镜像做全量持久化,AOF做增量持久化
结合了RDB和AOF的优点,既能快速加载又能避免丢失过多的数据

3.3.2 开启混合方式设置
设置aof-use-rdb-preamble的值为 yes   yes表示开启,设置为no表示禁用

先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。
简单来说:混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式(AOF包括了RDB头部+AOF混写)

3.3.3 数据的加载流程

在同时开启rdb 和aof 持久化时,重启时只会加载 aof 文件,不会加载 rdb 文件,rdb做为一个万一的策略

3.4 纯缓存模式

同时关闭RDB+AOF

  • 禁用RDB(save "")
    禁用RDB持久化模式下,我们仍然可以使用命令save、bgsave生成rdb文件
  • 禁用AOF(appendonly no)
    禁用AOF持久化模式下,我们仍然可以使用命令bgrewriteaof生成aof文件

4. 参考和感谢

尚硅谷Redis零基础到进阶,最强redis7教程,阳哥亲自带练

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

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

相关文章

【华为数据之道学习笔记】3-2 基础数据治理

基础数据用于对其他数据进行分类,在业界也称作参考数据。基础数据通常是静态的(如国家、币种),一般在业务事件发生之前就已经预先定义。它的可选值数量有限,可以用作业务或IT的开关和判断条件。当基础数据的取值发生变…

小航助学2023年6月GESP_Scratch四级真题(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号 单选题2.00分 删除编辑附件图文 答案:D 第1题高级语言编写的程序需要经过以下( )操作,可以生成在计算机上运行的可执行代码。 A、编辑B、…

MQTT 协议入门:轻松上手,快速掌握核心要点

文章目录 什么是 MQTT?MQTT 的工作原理MQTT 客户端MQTT Broker发布-订阅模式主题QoS MQTT 的工作流程开始使用 MQTT:快速教程准备 MQTT Broker准备 MQTT 客户端创建 MQTT 连接通过通配符订阅主题发布 MQTT 消息MQTT 功能演示保留消息Clean Session遗嘱消…

【C语言】7-32 刮刮彩票 分数 20

7-32 刮刮彩票 分数 20 全屏浏览题目 切换布局 作者 DAI, Longao 单位 杭州百腾教育科技有限公司 “刮刮彩票”是一款网络游戏里面的一个小游戏。如图所示: 每次游戏玩家会拿到一张彩票,上面会有 9 个数字,分别为数字 1 到数字 9&#xf…

前端自动化测试Vue中TDD和单元测试示例详解

1、简单用例入门 Vue 提供了 vue/test-utils 来帮助我们进行单元测试,创建 Vue 项目的时候勾选测试选项会自动帮我们安装 先来介绍两个常用的挂载方法: mount:会将组件以及组件包含的子组件都进行挂载shallowMount:浅挂载&…

计算机网络复习资料

一、题型 选择题(包括单选和多选,共30分。其中单选每题1分,计20分;多选每题2分,计10分) 简答题(每题5分,共20分) 分析计算题(共40分,共4题) 论述题(本题10分,共1题) 二、考试大纲[人工智能…

防止企业敏感数据泄露

敏感数据泄露是指意外或故意泄露关键信息,例如个人身份信息(PII)、支付卡信息(PCI)、受保护的电子健康信息(ePHI)和知识产权(IP),数据保护措施不足的组织会在…

点滴生活记录2

我从小跟着我爷爷奶奶,小学六年级转到县城上小学,就没跟我奶奶他们住一起了。十一回家,把奶奶接到我这住,细想,自六年级之后,就很少跟奶奶住一起了。 奶奶(间歇性)耳聋,为…

Linux 驱动开发需要掌握哪些编程语言和技术?

Linux 驱动开发需要掌握哪些编程语言和技术? 在开始前我有一些资料,是我根据自己从业十年经验,熬夜搞了几个通宵,精心整理了一份「Linux从专业入门到高级教程工具包」,点个关注,全部无偿共享给大家&#xf…

(C语言实现)高精度除法 (洛谷 P2005 A/B Problem II)

前言 本期我们分享用C语言实现高精度除法,可通过该题测试点我点我,洛谷 p2005。 那么话不多说我们开始吧。 讲解 大家还记不记得小学的时候我们是怎么做除法的?我们以1115为例。 我们的高精度除法也将采用这个思路进行,分别用两…

JavaSE基础50题:23. 数组拷贝(数组练习题)

文章目录 概述方法一:运用for循环进行拷贝方法二:Java内置方法进行拷贝方法三:指定区间进行拷贝 概述 数组拷贝。 注意: public static void main(String[] args) {int[] array1 {1,2,3,4};System.out.println(myToString(array…

python爬取 HTTP_2 网站超时问题的解决方案

问题背景 在进行网络数据爬取时,使用 Python 程序访问支持 HTTP/2 协议的网站时,有时会遇到超时问题。这可能会导致数据获取不完整,影响爬虫程序的正常运行。 问题描述 在实际操作中,当使用 Python 编写的爬虫程序访问支持 HTT…

第一课【习题】给应用添加通知和提醒

构造进度条模板通知,name字段当前需要固定配置为downloadTemplate。 给通知设置分发时间,需要设置showDeliveryTime为false。 OpenHarmony提供后台代理提醒功能,在应用退居后台或退出后,计时和提醒通知功能被系统后台代理接管…

【开源】基于Vue+SpringBoot的教学过程管理系统

项目编号: S 054 ,文末获取源码。 \color{red}{项目编号:S054,文末获取源码。} 项目编号:S054,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 教师端2.2 学生端2.3 微信小程序端2…

使用 KubeRay 和 Kueue 在 Kubernetes 中托管 Ray 工作负载

在 KubeCon CN 2023 的「 Open AI 数据 | Open AI Data」专题中,火山引擎软件工程师胡元哲分享了《使用 KubeRay 和 Kueue 在 Kubernetes 中托管 Ray 工作负载|Sailing Ray workloads with KubeRay and Kueue in Kubernetes议题。以下是本次演讲的文字…

区块链实验室(28) - 拜占庭节点劫持区块链仿真

在以前的FISCO环境中仿真拜占庭节点攻击区块链网络。该环境共有100个节点,采用PBFT作为共识机制,节点编号分别为:Node0,Node,… ,Node99。这100个节点的前2010区块完全相同,自区块2011开始分叉。…

Qt/C++音视频开发58-逐帧播放/上一帧下一帧/切换播放进度/实时解码

一、前言 逐帧播放是近期增加的功能,之前也一直思考过这个功能该如何实现,对于mdk/qtav等内核组件,可以直接用该组件提供的接口实现即可,而对于ffmpeg,需要自己处理,如果有缓存的数据的话,可以…

一文了解半导体检测的利器—探针台

探针台是半导体行业重要的检测装备之一,其广泛应用于复杂、 高速器件的精密电气测量,旨在确保质量及可靠性,并缩减研发时间和器件制造工艺的成本。 半导体测试可以按生产流程可以分为三类:验证测试、晶圆测试测试、封装检测。探针…

王炸升级!PartyRock 10分钟构建 AI 应用

前言 一年一度的亚马逊云科技的 re:Invent 可谓是全球云计算、科技圈的狂欢,每次都能带来一些最前沿的方向标,这次也不例外。在看完一些 keynote 和介绍之后,我也去亲自体验了一些最近发布的内容。其中让我感受最深刻的无疑是 PartyRock 了。…

首次发布亚马逊云科技生成式AI技术堆栈,re:Invent大会重磅发布

亚马逊云科技总是在不断重构,以推动创新,而今年re:Invent的主角毫无疑问是生成式AI。这从亚马逊云科技副总裁、首席布道师Jeff Barr在re:Invent 2023之前就迫不及待地写了一篇关于PartyRock的体验试玩教程即可窥见一斑。 事实也确实如此。在Las Vegas&am…