Redis 持久化

一、RDB

1.1 RDB持久化流程

fork子进程是阻塞的,如果同时开启RDB和AOF,默认使用AOF。

 1、Redis父进程首先判断: 当前是否在执行save,或bgsave/bgrewriteaof (aof文件重写命令)的子进程,如果在执行则bgsave命令直接返回。
2、父进程执行fork(调用OS函数复制主进程)操作创建子进程,这个复制过程中父进程是阻塞的,Redis不能执行来自客户端的任何命令
3、父进程fork后,bgsave命令返回”Bacground saving started"信息并不再阻塞父进程,并可以响应其他命令。
4、子进程创建RDB文件,根据父进程内存快照生成临时快照文件,完成后对原有文件进行原子替换。 (RDB始终完整)。
5、子进程发送信号给父进程表示完成,父进程更新统计信息。
6、父进程fork子进程后,继续工作。

1.2 redis配置

#1. 下面配置为默认配置,默认就是开启的,在一定的间隔时间中,检测key的变化情况,然后持久化数据
save 900 1           #900s后至少1个key发生变化则进行存储
save 300 10         #300s后至少10个key发生变化则进行存储
save 60 10000     #60s后至少10000个key发生变化则进行存储
#2. rdb文件的存储路径(默认当前目录下,文件名为dump.rdb)
dbfilename dump.rdb

1.3  RDB优缺点

优点
RDB是二进制压缩文件,占用空间小,便于传输 (传给slaver)主进程fork子进程,可以最大化Redis性能,主进程不能太大,复制过程中主进程阻塞。

缺点
不保证数据完整性,会丢失最后一次快照以后更改的所有数据。

二、AOF

2.1 AOF介绍

        AOF (append only file) 是Redis的另一种持久化方式。Redis默认情况下是不开启的。开启AOF持久化后Redis 将所有对数据库进行过写入的命令(及其参数) (RESP)记录到 AOF 文件,以此达到记录数据库状态的目的,这样当Redis重启后只要按顺序回放这些命令就会恢复到原始状态了。AOF会记录过程,RDB只管结果。

2.2 AOF持久化实现

 文件内容示例:

2.3 AOF写入过程 

        AOF文件中存储的是redis的命令,同步命令到 AOF 文件的整个过程可以分为三个阶段:

1、命令传播: Redis 将执行完的命令、命令的参数、命令的参数个数等信息发送到 AOF 程序中。
2、缓存追加: AOF 程序根据接收到的命令数据,将命令转换为网络通讯协议的格式,然后将协议内容追加到服务器的 AOF 缓存中。
3、文件写入和保存: AOF缓存中的内被写入到AOF文件末尾,如果设定的 AOF 保存条件被满足的话,fsync函数或者fdatasync函数会被调用,将写入的内容真正地保存到磁盘中。

2.4 AOF写入频率

AOF有这样几种配置用来控制读写的频率:

(1)appendfsync always:每次一收到写命令就立即强制写入磁盘,保证完全的持久化。

(2)appendfsync no:由操作系统决定何时同步数据。

(3)appendfsync everysec:每秒钟强制写入磁盘一次。

2.5 AOF重写

AOF重写的实现

为了减小aof文件的体量,可以手动发送“bgrewriteaof”指令,通过子进程生成更小体积的aof,然后替换掉旧的、大体量的aof文件。

AOF重写的工作原理

         需要注意的是,在这里子进程把数据转为写指令存入新的AOF文件时,记录的只是每个数据的最后一次写指令,也就是最新的数据,不会记录之前冗余的操作,所以这样会很大程度的缩小AOF的体量,同时,该操作是产生新的AOF文件进行写入,而不是在原有文件上的修改,通过上图也可以看出来。而缓存中叠加到新的aof的操作仍是新增的全部操作,但是这些数据已经很有限,相比之前的全部添加,这种机制很好的解决的AOF文件不断增大的问题。 

2.6 AOF重写的相关配置

1)auto-aof-rewrite-percentage 100
2)auto-aof-rewrite-min-size 64mb
在aof文件体量超过64mb,且比上次重写后的体量增加了100%时自动触发重写。

2.7 AOF服务重启恢复数据

        AOF文件里面包含了重建数据库状态所需的所有写命令,所以服务器只要读入并重新执行一遍AOF文件里面保存的写命令,就可以还原服务器关闭之前的数据库状态,步骤如下:
1、创建一个不带网络连接的伪客户端 (fake client)[因为Redis的命令只能在客户端上下文中执行,而载入AOF文件时所使用的命令直接来源于AOF文件而不是网络连接,所以服 务器使用了一个没有网络连接的伪客户端来执行AOF文件保存的写命令,伪客户端执行命令的效果和带网络连接的客户端执行命令的效果完全一样。
2、从AOF文件中分析并读取出一条写命令。
3、使用伪客户端执行被读出的写命令,一直执行步骤2和步骤3,直到AOF文件中的所有写命令都被处理完毕为止。
4、当完成以上步骤之后,AOF文件所保存的数据库状态就会被完整地还原出来,整个过程如下图所示:

2.8 AOF配置

#二. AOF存储
#1.默认是关闭的,日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据,启用的话通常使用每隔一秒持久化一次的策略appendonly no(默认no) --> appendonly yes (开启aof)                
# appendfsync always       #每一次操作都进行持久化appendfsync everysec     #每隔一秒进行一次持久化
# appendfsync no          # 不进行持久化
#2. aof文件路径 (默认为当前目录下,文件名为 appendonly.aof)
appendfilename "appendonly.aof"
dir ./        (同上)
#3. 控制触发自动重写机制频率
# auto-aof-rewrite-min-size 64mb //aof文件至少要达到64M才会自动重写,文件太小恢复速度本来就很快,重写的意义不大
# auto-aof-rewrite-percentage 100 //aof文件自上一次重写后文件大小增长了100%则再次触发重写 

三、混合持久化

3.1 混合持久化介绍及配置

         RDB和AOF各有优缺点,Redis 4.0 开始支持 rdb 和 aof 的混合持久化,5.0以后默认开启。如果把混合持久化打开,AOF Rewrite 的时候就直接把 RDB 的内容写到 aof 文件开头。(RDB的头+AOF的身体---->appendonly.aof)
开启混合持久化

#三. 混合持久化
#1. 开启混合持久化配置 (5.0版本默认就是yes)
aof-use-rdb-preamble yes
#2. rdb和aof自身的配置也都需要开启

3.2 混合持久化原理 

        开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件。
1、重写这一刻之前的内存做RDB快照处理(重写期间执行的指令和之后的指令仍然是转换成resp指令吸入aof文件)。
2、将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,会覆盖原有的AOF文件,完成新旧两个AOF文件的替换。
3、Redis重启的时候,可以先加载RDB的内容,然后再重放增量AOF日志就可以完全替代之前的AOF全量文件重放,因此重启效率大幅得到提升。

3.3 演示

(3). 演示

 A. 开启混合持久化机制 【aof-use-rdb-preamble yes】

 B. 运行指令【bgrewriteaof】手动进行aof重写(前提内存中有内容),此时查看aof文件中的内容,类似乱码的东西,就是rdb快照处理

 C. 再任意执行几个set指令,然后查看aof文件中内容。

四、应用场景

1、内存数据库 rdb+aof 数据不容易丢。
2、有原始数据源: 每次启动时都从原始数据源中初始化 ,则不用开启持久化(数据量较小)
3、缓存服务器一般性能高rdb
4、在数据还原时:
    有rdb+aof 则还原aof,因为RDB会造成文件的丢失,AOF相对数据要完整。
    只有rdb,则还原rdb。

五、实际场景 

1、追求高性能: 都不开redis宕机从数据源恢复。
2、字典库:不驱逐,保证数据完整性,不开持久化。
3、用作DB不能主从 数据量小。
4、做缓存 较高性能: 开rdb。
5、Redis数据量存储过大,性能突然下降: fork 时间过长 阻塞主进程,则只开启AOF。

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

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

相关文章

【左神算法刷题班】第18节:汉诺塔问题、岛屿问题、最大路径和问题

第18节 题目1:汉诺塔问题(变体) 体系学习班18节有讲暴力递归的汉诺塔原题。 给定一个数组arr,长度为N,arr中的值只有1,2,3三种 arr[i] 1,代表汉诺塔问题中,从上往下第…

主从同步介绍、主从同步原理、主从同步结构、构建思路、配置一主一从、配置一主多从、读写分离介绍、工作原理、配置mycat服务、添加数据源、创建集群、指定主机角

Top NSD DBA DAY07 案例1:MySQL一主一从案例2:配置一主多从结构案例3:数据读写分离 1 案例1:MySQL一主一从 1.1 问题 数据库服务器192.168.88.53配置为主数据库服务器数据库服务器192.168.88.54配置为从数据库服务器客户端192…

网络编程(8.14)TCP并发服务器模型

作业: 1. 多线程中的newfd,能否修改成全局,不行,为什么? 2. 多线程中分支线程的newfd能否不另存,直接用指针间接访问主线程中的newfd,不行,为什么? 多线程并发服务器模型原代码&…

排查docker无法启动问题

查看Linux系统操作日志(最后200行就可以排查): tail -200f /var/log/messages

数据分析--帆软报表--大数据大屏

进入国企公司学习有一段时间了,岗位是数据分析方向------ 母前使用的是帆软工具进行的开发。 可以进行大数据大屏 也可使嵌入到手机端。 下面是例子

Python-OpenCV中的图像处理-GrabCut算法交互式前景提取

Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 Python-OpenCV中的图像处理-GrabCut算法交互式前景提取 cv2.grabCut(img: Mat, mask: typing.Optional[Mat], rect, bgdModel, fgdModel, iterCount, mode…) img…

【Apple】Logic Pro导入7.1.4.wav并自动分析多声道

Step1: 创建空项目 Step2: 选中下图“使用麦克风或...”这一项,底下要创建的轨道数填1就行。 点击创建之后: Step3: 拖动文件、拖动文件、拖动文件到项目中,并选中复选框“所有所选文件都源自一个项目(将创建一个智能速度多轨道集…

[NLP]LLM 训练时GPU显存耗用量估计

以LLM中最常见的Adam fp16混合精度训练为例,分析其显存占用有以下四个部分: GPT-2含有1.5B个参数,如果用fp16格式,只需要1.5G*2Byte3GB显存, 但是模型状态实际上需要耗费1.5B*1624GB. 比如说有一个模型参数量是1M,在…

什么是前端框架?怎么学习? - 易智编译EaseEditing

前端框架是一种用于开发Web应用程序界面的工具集合,它提供了一系列预定义的代码和结构,以简化开发过程并提高效率。 前端框架通常包括HTML、CSS和JavaScript的库和工具,用于构建交互式、动态和响应式的用户界面。 学习前端框架可以让您更高效…

nginx的负载均衡

nginx的负载均衡 文章目录 nginx的负载均衡1.以多台虚拟机作服务器1.1 在不同的虚拟机上安装httpd服务1.2 在不同虚拟机所构建的服务端的默认路径下创建不同标识的文件1.3 使用windows本机的浏览器分别访问3台服务器的地址 2.在新的一台虚拟机上配置nginx实现反向代理以及负载均…

使用element UI 的el-upload上传图片并携带参数的用法

直接看代码&#xff1a;前端实现 <div class"upload"><el-uploadclass"upload-demo"name"upload_name":data"{user_name:user_name}"action"http://localhost:8000/api/deal_pest_Image":show-file-list"fal…

01|Java中常见错误或不清楚

补充&#xff1a;length vs length() vs size() 1 java中的length属性是针对数组说的,比如说你声明了一个数组,想知道这个数组的长度则用到了length这个属性. 2 java中的length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法. 3.java中的siz…

【Vue-Router】命名视图

命名视图 同时 (同级) 展示多个视图&#xff0c;而不是嵌套展示&#xff0c;例如创建一个布局&#xff0c;有 sidebar (侧导航) 和 main (主内容) 两个视图&#xff0c;这个时候命名视图就派上用场了。 可以在界面中拥有多个单独命名的视图&#xff0c;而不是只有一个单独的出…

Python获取、修改主机名称和IP地址实践

Python获取、修改主机名称和IP地址的方法有多种&#xff0c;内置socket模块、执行系统命令、第三方模块等等&#xff0c;本文只是完成功能的一次成功的实践。 1. 获取、修改主机名称 本案例使用python的socket模块获取、修改主机名称&#xff0c;socket模块是一个用于实现网络…

UML-A 卷-知识考卷

UML-A 卷-知识考卷 UML有多少种图&#xff0c;请列出每种图的名字&#xff1a; 常用的几种UML图&#xff1a; 类图&#xff08;Class Diagram&#xff09;&#xff1a;类图是描述类、接口、关联关系和继承关系的图形化表示。它展示了系统中各个类之间的静态结构和关系。时序…

TFRecords详解

内容目录 TFRecords 是什么序列化(Serialization)tf.data 图像序列化&#xff08;Serializing Images)tf.Example函数封装 小结 TFRecords 是什么 TPU拥有八个核心&#xff0c;充当八个独立的工作单元。我们可以通过将数据集分成多个文件或分片&#xff08;shards&#xff09;…

2023年7月京东洗衣机行业品牌销售排行榜(京东数据分析软件)

2023年上半年&#xff0c;洗衣机市场表现平淡&#xff0c;同环比来看出货量都有一定程度的下滑。7月份&#xff0c;洗衣机市场仍未改变这一下滑态势。 根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;7月份&#xff0c;京东平台洗衣机的销量为109万&#xff0c;环比下降…

web图书管理系统Servlet+JSP+javabean+MySQL图书商城图书馆 源代码

本项目为前几天收费帮学妹做的一个项目&#xff0c;Java EE JSP项目&#xff0c;在工作环境中基本使用不到&#xff0c;但是很多学校把这个当作编程入门的项目来做&#xff0c;故分享出本项目供初学者参考。 一、项目描述 web图书管理系统ServletJSPjavabeanMySQL 系统有1权限…

ChatGPT能代替搜索引擎吗?ChatGPT和搜索引擎有什么区别?

ChatGPT和搜索引擎是两种在信息获取和交流中常用的工具&#xff0c;ChatGPT是一种基于人工智能技术的聊天机器人&#xff0c;而搜索引擎是一种在互联网上搜索信息的工具。尽管它们都是依托互联网与信息获取和交流有关&#xff0c;部分功能重合&#xff0c;但在很多方面存在着明…

2023年7月京东美妆护肤品小样行业数据分析(京东数据挖掘)

如今&#xff0c;消费者更加谨慎&#xff0c;消费决策也更加理性。在这一消费环境下&#xff0c;美妆护肤市场中&#xff0c;面对动辄几百上千的化妆品&#xff0c;小样或体验装无疑能够降低消费者的试错成本。由此&#xff0c;这门生意也一直备受关注。 并且&#xff0c;小样…