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,一经查实,立即删除!

相关文章

剑指offer专题2:队列和栈

用两个栈模拟队列 class CQueue {stack<int> stack1;stack<int> stack2; public:CQueue() {}void appendTail(int value) {stack1.push(value);}int deleteHead() {int val-1;if(!stack2.empty()){val stack2.top();stack2.pop();}else if(!stack1.empty()){while…

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

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

Terraform 系列-批量创建资源时如何根据某个字段判断是否创建

系列文章 Terraform 系列文章Grafana 系列文章 概述 前文 Grafana 系列 - Grafana Terraform Provider 基础 介绍了使用 Grafana Terraform Provider 创建 Datasource. 这几天碰到这么一个现实需求&#xff1a; 使用 Terraform 批量创建日志数据源时, 有的数据源类型是 El…

MongoDB 数据库详细介绍

MongoDB 数据库详细介绍 MongoDB&#xff08;来自“Humongous”&#xff0c;意为巨大的&#xff09;是一个开源、高性能、无模式&#xff08;NoSQL&#xff09;、文档导向的分布式数据库。它以其灵活性、可扩展性和强大的查询功能而闻名于世。MongoDB 使用 JSON 格式的文档来存…

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

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

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

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

排查docker无法启动问题

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

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

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

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…

数据库连接池

什么是数据库连接池 使用数据库连接池的好处是减少了连接的创建和关闭的开销&#xff0c;提高了数据库访问的性能和效率。 为什么我们要使用数据库连接池 我们使用数据库连接池的主要原因是为了提高应用程序访问数据库的性能和效率。使用数据库连接池的好处: 连接重用&…

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

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

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

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

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

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

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…

vb+sql汽车配件管理系统设计与实现

摘 要 目前汽车配件销售企业大多数在其连锁店的管理还是手工进行,随着汽车配件行业的迅速发展,手工管理的种种弊端暴露无疑,给销售企业的发展带来了不必要的麻烦。为了规范企业内部管理,提高企业业务管理水平,更好的为客户服务,应采用计算机来管理汽车配件的进销存业务。…

【Sklearn】基于朴素贝叶斯算法的数据分类预测(Excel可直接替换数据)

【Sklearn】基于朴素贝叶斯算法的数据分类预测(Excel可直接替换数据) 1.模型原理2.模型参数3.文件结构4.Excel数据5.下载地址6.完整代码7.运行结果1.模型原理 模型原理: 朴素贝叶斯分类是基于贝叶斯定理的一种分类方法。它假设特征之间相互独立(朴素性),从而简化计算过…

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模块是一个用于实现网络…