Redis基础系列-持久化

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.mzph.cn/news/209744.shtml

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

相关文章

ubuntu22.04 安装cuda

CUDA(Compute Unified Device Architecture)是由 NVIDIA 开发的一种并行计算平台和编程模型。它允许开发者利用 NVIDIA 的 GPU(图形处理单元)进行高效的计算处理。CUDA 通过提供一系列的 C、C 和 Fortran 扩展,使得开发…

我的NPI项目之Android电源系列 -- 关于剩余充满时间的问题(一)

我的新项目是基于高通最新的5G平台,但是由于还没有拿到EVT。所以,就在目旧的平台和OS上进行学习。遇到第一个问题就是插上type-c之后,充满剩余时间异常的问题。 问题描述,在充电过程中,显示充满时间为“0 min left unt…

9.基于SpringBoot3+I18N实现国际化

1. 新建资源文件 在resources目录下新建目录i18n, 然后 新建messages_en.properties文件 user.login.erroraccount or password error!新建messages_zh_CN.properties文件 user.login.error帐户或密码错误!2. 新建LocaleConfig.java文件 Configurati…

2004-2021年上市公司环境规制强度相关数据

2004-2021年上市公司环境规制强度相关数据 1、时间:2004-2021年 2、指标:年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、所属省份-工业增加值_亿元、所属省份-治理废气…

AVFormatContext编解码层:理论与实战

文章目录 前言一、FFmpeg 解码流程二、FFmpeg 转码流程三、编解码 API 详解1、解码 API 使用详解2、编码 API 使用详解 四、编码案例实战1、示例源码2、运行结果 五、解码案例实战1、示例源码2、运行结果 前言 AVFormatContext 是一个贯穿始终的数据结构,很多函数都…

基于HSV空间色彩的图像分割方法(含python代码实现)

文章目录 1. 介绍2. HSV颜色空间3. python实现HSV图像分割3.1. 代码实现3.2. 运行结果 1. 介绍 HSV颜色系统简介: HSV 即使用色相(Hue)、饱和度(Saturation)、明度(Value)来表示色彩的一种方式…

HttpComponents: 领域对象的设计

1. HTTP协议 1.1 HTTP请求 HTTP请求由请求头、请求体两部分组成,请求头又分为请求行(request line)和普通的请求头组成。通过浏览器的开发者工具,我们能查看请求和响应的详情。 下面是一个HTTP请求发送的完整内容。 POST https://track.abc.com/v4/tr…

根据对数器找规律、根据数据量猜题目解法

题目一 小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。1)能装下6个苹果的袋子2)能装下8个苹果的袋子小虎可以自由使用两种袋子来装苹果,但是小虎有强迫症,他要求自己使用的袋子数量必须…

WordCount 源码解析 Mapper,Reducer,Driver

创建包 com.nefu.mapreduce.wordcount ,开始编写 Mapper , Reducer , Driver 用户编写的程序分成三个部分: Mapper 、 Reducer 和 Driver 。 ( 1 ) Mapper 阶段 ➢ 用户自定义的 Mapper 要继承自己的父…

《师兄啊师兄》第二季确认定档!海神扬名,稳健回归!

近日,《师兄啊师兄》第二季的定档海报和PV终于发布,确认将于12月14日上午10点强势回归!这部备受瞩目的国漫作品自第一季播出以来,便以其独特的剧情设定和唯美的画风,赢得了广大观众的喜爱。如今,动画第二季…

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

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

Qt 5.15.2 三维显示功能

Qt 5.15.2 三维显示功能 三维显示效果: .pro项目文件 QT core gui opengl 3dcore 3drender 3dinput 3dextrasgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In ord…

2023年法国经销商Solu-Watt来访安科瑞-安科瑞 蒋静

2023年4月10日上午9点,法国Solu-Watt公司Matthieu先生一行到安科瑞考察参观工厂的智能化出入库工作站、柔性化仪表生产车间及实验室。自1992年以来,Solu-Watt在电气设备市场中不断发展。能够提供量身定制的安装有线电气解决方案(电气柜、接线…

如何用Qt配置git项目并上传Gitee

1.进入到Qt项目文件夹内,打开 “Git Bash Here” 2.初始化,在“Git Bash Here”中输入 git init 3.加入所有文件,在“Git Bash Here”中输入 git add . (需要注意,git add 后面还有一个点) 4.添加备注,git com…

STL源码剖析笔记——哈希表、unordered_set、unordered_map、unordered_mutiset、unordered_mutimap

系列文章目录 STL源码剖析笔记——迭代器 STL源码剖析笔记——vector STL源码剖析笔记——list STL源码剖析笔记——deque、stack,queue STL源码剖析笔记——Binary Heap、priority_queue STL源码剖析笔记——AVL-tree、RB-tree、set、map、mutiset、mutimap STL源…

一套rk3588 rtsp服务器推流的 github 方案及记录 -01

我不生产代码,我只是代码的搬运工,相信我,看完这个文章你的图片一定能变成流媒体推出去。 诉求:使用opencv拉流,转成bgr数据,需要把处理后的数据(BGR)编码成264,然后推流…

字符串函数strtok

1.调用格式: 2.调用形式:char*strtok(char*p1,const char*p2),其中第二个是由分隔符组成的字符串,第一个为需要分隔的字符串 3.调用目的:将分隔符之间的字符串取出 4.调用时一般将源字符串拷贝后调用,因为此函数会将…

基于Unity3D 低多边形地形模型纹理贴图

在线工具推荐: 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 当谈到游戏角色的3D模型风格时,有几种不同的风格&#xf…

【工程实践】使用modelscope下载大模型文件

前言 Modelscope(魔搭社区)是阿里达摩院的一款开源模型平台,里面提供了很多的热门模型供使用体验,其中的模型文件可以通过git clone 快速下载。并且为模型提供了Notebook的快速开发体验,使用阿里云服务,不需…

【优选算法系列】【专题二滑动窗口】第三节.904. 水果成篮和438. 找到字符串中所有字母异位词

文章目录 前言一、水果成篮 1.1 题目描述 1.2 题目解析 1.2.1 算法原理 1.2.2 代码编写 1.2.3 题目总结二、找到字符串中所有字母异位词 2.1 题目描述 2.2 题目解析 2.2.1 算法原理 2.2.2 代码编写 …