【Redis】持久化

文章目录

  • 一、RDB
    • 1.1、RDB的自动备份与手动备份
      • 1.1.1、自动备份
      • 1.1.2、手动备份
    • 1.2、RDB优点
    • 1.3、RDB缺点
    • 1.4、RDB快照
    • 1.5、RDB优化配置项
  • 二、AOF
    • 2.1、AOF工作流程
    • 2.2、AOF写回策略
    • 2.3、MP-AOF实现
    • 2.4、AOF优缺点
    • 2.5、AOF重写机制
  • 三、RDB+AOF混合持久化
    • 3.1、数据恢复顺序和加载流程
  • 四、纯缓存模式

一、RDB

RDB持久化是以指定的时间间隔,将内存中的数据集快照写入磁盘。其保存的文件是 dump.rdb文件。

1.1、RDB的自动备份与手动备份

1.1.1、自动备份

RDB触发备份
将配置修改如下

save 5 2
dir /myredis/dumpfiles
dbfilename dump.rdb

redis中执行两次操作时会保存一次dump.rdb文件。
此时若使用FLUSHDB,redis会保存空数据到dump.rdb
此时若使用SHUTDOWN,redis会把当前的数据保存到dump.rdb

RDB 恢复备份
  重启redis时,redis会通过加载redis.conf中的dump.rdb的文件路径来恢复redis数据库。
:不可以把备份文件dump.rdb和生产redis服务器放在同一台机器,必须分开各自存储,以防生产机物理损坏后备份文件也挂了。

1.1.2、手动备份

  Redis手动生成了两个命令来生成RDB文件,分别是SAVEBGSAVE,其中一般使用BGSAVE
  由于使用SAVE会在主程序中执行会阻塞当前redis服务器,直到持久化工作完成。执行SAVE命令期间,Redis不能处理其他命令,所以在线上禁止使用SAVE
  使用BGSAVE会在后台异步进行快照操作,不阻塞快照同时还可以响应客户端请求,该触发方式会fork一个子进程由子进程复制持久化过程。
  并且还可以使用LASTSAVE命令获取最后一次成功执行快照的时间。

1.2、RDB优点

  • RDB非常适合灾难恢复,它是一个可以传输到远程数据中心的压缩文件。
  • RDB最大限度地提高了Redis的性能,因为Redis父进程为了持久化而需要做的唯一工作就是派生一个将所有其余工作都完成的子进程。父进程永远不会执行磁盘I/O或类似操作。
  • 与AOF相比,RDB允许使用大数据集更快地重启。
  • 在副本上,RDB支持重启和故障转移后的部分重新同步。

1.3、RDB缺点

  • 如果Redis由于任何原因没有在正常关闭的情况下停止工作,那最新分钟的数据可能会丢失。
  • 内存数据的全量同步,如果数据量太大会导致I/O严重影响服务器性能。
  • RDB需要经常fork()以便使用子进程在磁盘上持久化。如果数据集很大,fork()会很耗时。

1.4、RDB快照

  触发RDB快照的操作有:

  • 配置文件中默认的快照配置
  • 手动SAVE/BGSAVE命令
  • 执行FLUSHDB/FLUSHALL命令
  • 执行SHUTDOWN且没有设置开启AOF持久化
  • 主从复制时,主节点自动触发

禁用快照的方法:

  • 动态停止RDB保存规则的方法:redis-cli config set save ""
  • 快照禁用,在配置文件redis.conf中修改save ""

1.5、RDB优化配置项

  RDB的优化配置项在配置文件redis.confSNAPSHOTTING模块中

save <seconds> <changes>
# 在规定的时间内或者几次修改后自动保存到磁盘dbfilename  # dump.rdb的文件名dir # dump.rdb所在的路径stop-writes-on-bgsave-error
# 默认为yes,在bgsave报错后停止写入
# no表示在快照写入失败时,也能确保redis继续接受新的写请求。rdbcompression
# 对于存储到磁盘的快照是否压缩存储。
# yes,redis会使用LZF算法进行压缩
# no,减少CPU在这方面的消耗rdbchecksum
# 合法性校验
# 默认yes,redis使用CRC64算法进行数据校验
# no,关闭校验,提高性能rdb-del-sync-files
# 默认no,禁用此选项

二、AOF

  AOF是以日志形式来记录每个写操作,将Redis执行过的所有写指令记录下来,并且只允许追加文件不允许改写文件,在redis启动的时候读取该文件并且将写指令从前往后执行一遍以完成数据的恢复工作。
  默认情况下,redis没有开启AOF,通过appendonly yes来开启。它保存的文件名为appendonly.aof

2.1、AOF工作流程

在这里插入图片描述

序号详细步骤
1客户端会产生请求命令发送至服务端
2命令到达服务端后,并没有直接写入AOF文件,先保存在AOF缓存中,AOF缓存的目的是当这些命令到达一定数量后再写入磁盘,避免频繁的磁盘IO操作
3AOF缓存根据AOF缓冲区同步文件的三种写回策略将命令写入磁盘的AOF文件
4由于AOF文件内容的增加,为了避免膨胀,进行AOF重写完成命令的合并,从而达到AOF文件压缩的目的
5服务端重启后,会从AOF文件载入数据

2.2、AOF写回策略

  AOF有三种写回策略,默认是everysec

配置项写回时机优点缺点
always同步写回可靠性高、数据不丢失每个写命令都要写磁盘,IO量大,性能影响较大
everysec每秒写回性能适中宕机时丢失1秒内的数据
no由操作系统控制写回性能好宕机时丢失的数据较多

2.3、MP-AOF实现

  MP-AOF就是将原来的单个AOF文件拆分成多个AOF文件。AOF的类型有:

  • BASE:基础AOF,由子进程通过重写产生,最多只有一个
  • INCR:增量AOF,一般会在AOFRW开始执行时创建,可能存在多个
  • HISTORY:AOFRW成功完成后,所有的BASEINCR AOF都变成HISTORY,该类型的AOF会被Redis自动删除。

  为了管理这些AOF文件,还引入了manifest文件来追踪管理这些AOF,总的来说,Redis7以后的AOF文件结构如下:

// 几种类型文件的前缀,后面跟着有关序列和类型的附加信息
appendfilename "appendonly.aof"//新版本增加的目录配置项目
appenddirname "appendonlydir"//具体文件
1、基本文件appendonly.aof.1.base.aof
2、增量文件appendonly.aof.1.incr.aofappendonly.aof.2.incr.aof
3、清单文件appendonly.aof.manifest

2.4、AOF优缺点

优势

  • 使用AOF Redis更加持久,使用每秒fsync策略既可以保证写入性能,也可以减少redis宕机时丢失的数据。
  • AOF日志是一个仅附加的日志,因此不会出现寻道问题,也不会在断电时出现损坏问题,即使日志以写一半的命令结尾,redis-check-aof工具也能轻松修复。
  • Redis能够自动重写AOF,从而减少AOF的磁盘占用空间。
  • 即使使用FLUSHALL命令刷新了所有内容,也可以通过删除AOF中的最新内容来恢复数据。

劣势

  • AOF文件通常比相同数据集的RDB文件大,回复速度慢于RDB
  • AOF运行效率低于RDB,每秒同步策略效率好,不同步的话效率和RDB相同。

2.5、AOF重写机制

  重写机制通过启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。它并不是对源文件进行重新整理,而是直接读取服务器现有的键值对,然后用一条命令去代替之前记录这个键值对的多条命令,生成一个新的文件去替换原来的AOF文件。
触发机制
  手动方式通过命令bgrewriteaof命令触发
  自动方式通过配置文件的选项触发

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 这里表示被重写的aof文件既要达到之前大小的一倍又要超过64mb才会自动重写

  触发重写后,相应AOF文件的序号会增加,例如:

appendonly.aof.1.base.aof
appendonly.aof.1.incr.aof## 变成appendonly.aof.2.base.aof
appendonly.aof.2.incr.aof

重写原理

  • 在重写开始前,redis会创建一个“重写子进程”,这个子进程会读取现有的AOF文件,并将其包含的指令分析压缩并写入一个临时文件中。
  • 主进程将新接收到的写指令一边累计到内存缓冲区中,一边继续写入到原有的AOF文件中,保证了AOF文件的可用性,避免在重写过程中出现意外。
  • 当“重写子进程”完成重写工作后,它会给父进程发送一个信号,父进程收到信号后将内存中缓存的写指令追加到新AOF文件中。
  • 追加结束后,redis使用新的aof文件替换旧的aof文件,之后新的写指令都会追加到新的aof文件中。
  • 重写aof文件的操作,并没有读取旧的aof文件,而是将整个内存中的数据库用命令的方式重写了一个新的aof文件

三、RDB+AOF混合持久化

  结合了RDBAOF的优点,既能快速加载又能避免丢失过多的数据。这种混合方式的具体流程是先使用RDB进行快照存储,然后使用AOF持久化记录所有写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样重启服务的时候会从RDBAOF两方恢复数据,兼具了数据完整性和性能。
  简单来说,混合持久化使得AOF=RDB头部+AOF混写

3.1、数据恢复顺序和加载流程

  在RDB和AOF都启用的情况下,AOF的优先级高于RDB,redis会先判断AOF文件是否存在,如果不存在的话才会使用RDB
在这里插入图片描述


四、纯缓存模式

  纯缓存模式是关闭redis服务器的持久化功能从而提高服务器性能的方式。主要方法是同时关闭RDB和AOF

禁用rdb
  修改配置文件参数save "",禁用rdb持久化模式下,我们仍然可以使用命令save、bgsave生成rdb文件

禁用aof
  修改配置文件参数appendonly no,禁用aof持久化模式下,我们仍然可以使用命令bgwriteaof生成aof文件

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

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

相关文章

【JavaSE】接口 详解(下)

前言 欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 前言 接口实例运用 代码举例理解 比较对象的年龄 比较对象的姓名 利用冒泡排序实现Array.sort 年龄比较器 姓名比较器 比较示例测试 clone接口 浅拷贝和深拷贝 浅…

C语言 | Leetcode C语言题解之第17题电话号码的字母组合

题目&#xff1a; 题解&#xff1a; char phoneMap[11][5] {"\0", "\0", "abc\0", "def\0", "ghi\0", "jkl\0", "mno\0", "pqrs\0", "tuv\0", "wxyz\0"};char* digits…

BERT论文解读及情感分类实战

文章目录 简介BERT文章主要贡献BERT模型架构技术细节任务1 Masked LM&#xff08;MLM&#xff09;任务2 Next Sentence Prediction (NSP)模型输入 下游任务微调GLUE数据集SQuAD v1.1 和 v2.0NER 情感分类实战IMDB影评情感数据集数据集构建模型构建超参数设置训练结果注意事项 简…

python把视频按帧转化为图片并保存

参考链接&#xff1a;pythonopencv 将.mp4视频每一帧转为jpg图片_将mp4每一帧转化为图片-CSDN博客 from cv2 import VideoCapture from cv2 import imwrite# 定义保存图片函数 # image:要保存的图片名字 # addr&#xff1b;图片地址与相片名字的前部分 # num: 相片&#xff0c…

系统架构最佳实践 -- 智慧图书管理系统架构设计

随着数字化时代的到来&#xff0c;智慧图书管理系统在图书馆和机构中扮演着重要的角色。一个优秀的图书管理系统不仅需要满足基本的借阅管理需求&#xff0c;还需要具备高效的性能、良好的扩展性和稳定的安全性。本文将讨论智慧图书管理系统的架构设计与实现&#xff0c;以满足…

Debian安装1panel管理面板教程-最新

1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 1Panel面板是一个强大的服务器管理工具&#xff0c;它通过提供一站式管理、易于使用的界面、高度的可定制性、安全可靠的性能、强大的扩展性以及活跃的社区支持&#xff0c;为用户提供了一个高效、便捷的管理解决方案…

test4101

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和…

Vue项目自动注入less、sass、scss、stylus全局变量

一、Vue2项目 // vue.config.js const path require(path) module.exports {css: {loaderOptions: {// 给 sass-loader 传递选项sass: {// / 是 src/ 的别名// 所以这里假设有 src/assets/style/var.sass 这个文件// 注意&#xff1a;在 sass-loader v8 中&#xff0c;这个选…

QT_数据库

查看QT支持的数据库类型 主要代码: QStringList sl QSqlDatabase::drivers(); foreach(QString str, sl) {qDebug() << str; }程序输出: "QSQLITE" "QODBC" "QODBC3" "QPSQL" "QPSQL7"如果想使用其他数据库&#…

提问cpp之编译单元

提问cpp之编译单元 提问1&#xff1a;回答1&#xff1a;为什么模板都写在头文件里&#xff0c;写在.cpp文件会怎样&#xff1f;头文件中直接定义int a会有什么问题&#xff1f;为什么重复定义会出问题&#xff0c;这是谁判断的&#xff1f; 提问2&#xff1a;回答2&#xff1a;…

featup入坑笔记

一、新建环境 在conda中建立一个虚拟环境featup&#xff0c; conda create -n featup python3.9 二、开始配置&#xff1a; 我是先下载了FeatUp&#xff0c;之后 pip install -e . -i https://mirrors.aliyun.com/pypi/simple/ 但是&#xff0c;突然出错了&#xff0c;说无法…

leetcode2529-正整数和负整数的最大计数

题目: 给你一个按 非递减顺序 排列的数组 nums &#xff0c;返回正整数数目和负整数数目中的最大值。 换句话讲&#xff0c;如果 nums 中正整数的数目是 pos &#xff0c;而负整数的数目是 neg &#xff0c;返回 pos 和 neg二者中的最大值。 注意&#xff1a;0 既不是正整数…

MyBatis输出映射

1 resultType resultType: 执行 sql 得到 ResultSet 转换的类型&#xff0c;使用类型的完全限定名或别名。如果返回的是集合&#xff0c;设置的是集合元素的类型&#xff0c;而不是集合本身。resultType 和 resultMap&#xff0c;不能同时使用。 1.1 输出简单类型 案例&…

记Kubernetes(k8s):访问 Prometheus UI界面:Warning: Error fetching server time

记Kubernetes&#xff08;k8s&#xff09;&#xff1a;访问 Prometheus UI界面:Warning: Error fetching server time 1、报错详情2、解决3、再次访问 PrometheusUI界面 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、报错详情 Warning:…

软件杯 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…

MyBatis事务管理

MyBatis的事务管理是由TransactionFactory和Transaction两个接口定义的&#xff0c;TransactionFactory负责生成Transaction&#xff0c;这是一个典型的工厂模式。 官方提供了事务管理的两种模式&#xff1a; Managed&#xff1a;对应ManagedTransactionFactory和ManagedTran…

第四百四十一回 再谈flutter_native_splash包

文章目录 1. 知识回顾2. 使用方法3. 示例代码4. 经验与总结4.1 经验分享4.2 内容总结 我们在上一章回中介绍了"overlay_tooltip简介"相关的内容&#xff0c;本章回中将 再谈flutter_native_splash包.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我…

视频插针调研

视频插针 1、评估指标2、准确度3、实时4、视频流处理3、实时RIFE视频插帧测试 1、评估指标 参考&#xff1a;https://blog.csdn.net/weixin_43478836/article/details/104159648 https://blog.csdn.net/weixin_43605641/article/details/118088814 PSNR和SSIM PSNR数值越大表…

面试准备 集合 List

ArrayList 底层实现 使用Object[] 动态数组进行存储 特性 支持存储null值非线程安全支持快速访问 初始化方法 无参–返回一个空的列表&#xff08;DEFAULTCAPACITY_EMPTY_ELEMENTDATA&#xff09;指定初始容量&#xff1a; new ArrayList(20);指定集合 new ArrayList(col…

Opencv驱动摄像头

Opencv驱动摄像头&#xff0c;此段代码只能驱动电脑自带摄像头&#xff0c;目前没有分析出为何不能驱动另外连接的相机&#xff01; #include<iostream> #include<opencv2\core.hpp> #include<opencv2\highgui.hpp> #include<opencv2\imgproc.hpp> #i…