Redis__数据持久化

news2024/11/16 1:54:08

文章目录

😊 @ 作者:Lion J
💖 @ 主页: https://blog.csdn.net/weixin_69252724
🎉 @ 主题:Redis__数据持久化
⏱️ @ 创作时间:2024年05月01日
————————————————

这里写目录标题

  • 文章目录
  • Redis的持久化
    • RDB持久化是什么?
    • AOF持久化
      • 什么是 AOF 持久化?
      • AOF的工作流程
      • AOF 持久化方式有哪些?
      • AOF为什么是在命令执行之后记录日志?
      • AOF重写是什么?
      • AOF的写操作的原理?
    • 如何选择RDB AOF?

由于Redis是缓存数据库, 但是为了保证在某些特殊情况下, 比如要求数据的重用 机器故障,数据库重启,或者是为了同步数据(分布式情况的主从数据库一致)。使用缓存的时候,我们经常需要对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中。

Redis的持久化

使用缓存的时候,我们经常需要对内存中的数据进行持久化也就是将内存中的数据写入到硬盘中。就叫做数据的持久化

Redis 支持持久化,主要是支持 3 种持久化方式:

  1. 快照(RDB)
  2. 只追加文件(AOF)
  3. RDB 和 AOF 的混合持久化

RDB持久化是什么?

Redis 可以通过创建快照来获得存储在内存里面的数据在 某个时间点 上的副本,将创建的快照写入到磁盘中写入到二进制的文件中,默认的文件名为 dump.rdb。
Redis 创建快照之后,可以对快照进行备份,可以将快照复制到其他服务器从而创建具有相同数据的服务器副本(Redis 主从结构,主要用来提高 Redis 性能),还可以将快照留在原地以便重启服务器的时候使用。快照持久化是 Redis 默认采用的持久化方式,在 redis.conf 配置文件中默认有此下配置:

  • 触发RDB的快照的时机?\

快照持久化是 Redis 默认采用的持久化方式,在 redis.conf 配置文件中默认有此下配置:

如下配置:
save 900 1 :表示 900 秒钟内至少 1 个键被更改则进行快照。
save 300 10 :表示 300 秒内至少 10 个键被更改则进行快照。
save 60 10000 :表示 60 秒内至少 10000...

如果不需要持久化,那么你可以注释掉所有的 save 行来停用保存功能. 也可以在客户端通过 save

  • RDB 创建快照时会阻塞主线程吗?
  1. save : 同步保存操作,会阻塞 Redis 主线程;
  2. bgsave : fork 出一个子进程,子进程执行,不会阻塞 Redis 主线程,默认选项。

AOF持久化

什么是 AOF 持久化?

以日志的形式来记录每个写操作,将 Redis 执行过的所有指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis 启动之初会读取该文件

重新构建数据,换言之,redis 重启的话就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作

与快照持久化相比,AOF 持久化的实时性更好。默认情况下 Redis 没有开启 AOF方式的持久化(Redis 6.0 之后已经默认是开启了),可以通过 appendonly 参数开启:

appendonly yes

如何持久化

开启 AOF 持久化后每执行一条会更改 Redis 中的数据的命令,Redis 就会将该命令写入到 AOF 缓冲区 server.aof_buf 中然后再写入到 AOF 文件中(此时还在系统内核缓存区未同步到磁盘),最后再根据持久化方式( fsync策略)的配置来决定何时将系统内核缓存区的数据同步到硬盘中的。
同步到磁盘中才算持久化保存,否则依然存在数据丢失的风险. 比如说:系统内核缓存区的数据还未同步,磁盘机器就宕机了,那这部分数据就算丢失了。
AOF 文件的保存位置和 RDB 文件的位置相同,默认的文件名是 appendonly.aof。

AOF的工作流程

  1. 命令追加(append):所有的写命令会追加到 AOF 缓冲区中。
  2. 文件写入(write):将 AOF 缓冲区的数据写入到 AOF 文件中。这一步需要调用write函数(系统调用),write将数据写入到了系统内核缓冲区之后直接返回了(延迟写)。注意!!!此时并没有同步到磁盘。
  3. 文件同步(fsync):AOF 缓冲区根据对应的持久化方式( fsync 策略)向硬盘做同步操作。这一步需要调用 fsync 函数(系统调用), fsync 针对单个文件操作,对其进行强制硬盘同步,fsync 将阻塞直到写入磁盘完成后返回,保证了数据持久化。
  4. 文件重写(rewrite):随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的。
  5. 重启加载(load):当 Redis 重启时,可以加载 AOF 文件进行数据恢复。
    在这里插入图片描述
  • write:写入系统内核缓冲区之后直接返回(仅仅是写到缓冲区),不会立即同步到硬盘。虽然提高了效率,但也带来了数据丢失的风险。同步硬盘操作通常依赖于系统调度机制,
    Linux 内核通常为 30s 同步一次,具体值取决于写出的数据量和 I/O 缓冲区的状态。
  • fsync:fsync用于强制刷新系统内核缓冲区(同步到到磁盘),确保写磁盘操作结束才会返回。

AOF 持久化方式有哪些?

在 Redis 的配置文件中存在三种不同的 AOF 持久化方式( fsync策略),它们分别是:

  • appendfsync always:主线程调用 write 执行写操作后,后台线程( aof_fsync 线程)立即会调用 fsync 函数同步 AOF 文件(刷盘),fsync 完成后线程返回,这样会严重降低 Redis 的性能(write + fsync)。
  • appendfsync everysec:主线程调用 write 执行写操作后立即返回,由后台线程( aof_fsync 线程)每秒钟调用 fsync 函数(系统调用)同步一次 AOF 文件(write+fsync,fsync间隔为 1 秒)
  • appendfsync no:主线程调用 write 执行写操作后立即返回,让操作系统决定何时进行同步,Linux 下一般为 30 秒一次(write但不fsync,fsync 的时机由操作系统决定)
    这 3 种持久化方式的主要区别在于 fsync 同步 AOF 文件的时机(刷盘的时机不一样)。

为了兼顾数据和写入性能,可以考虑 appendfsync everysec 选项 ,让 Redis 每秒同步一次 AOF 文件,Redis 性能受到的影响较小。而且这样即使出现系统崩溃,用户最多只会丢失一秒之内产生的数据。
当硬盘忙于执行写入操作的时候,Redis 还会优雅的放慢自己的速度以便适应硬盘的最大写入速度。

AOF为什么是在命令执行之后记录日志?

关系型数据库(如 MySQL)通常都是执行命令之前记录日志(方便故障恢复,如undo log),而 Redis AOF 持久化机制是在执行完命令之后再记录日志。

  • 避免额外的检查开销,AOF 记录日志不会对命令进行语法检查;
  • 在命令执行完之后再记录,不会阻塞当前的命令执行。
    同时这样也带来了问题
  • 如果刚执行完命令 Redis 就宕机会导致对应的修改丢失;
  • 可能会阻塞后续其他命令的执行(AOF 记录日志是在 Redis 主线程中进行的)。

在同步策略里,比如每个写命令、每秒钟同步一次等。如果选择了每个写命令都进行同步,那么每次写入操作都会触发一次磁盘同步,可能会导致主线程在等待同步完成时被阻塞。,这样就会频繁IO操作,与主线程竞争资源

AOF重写是什么?

当 AOF 变得太大时,Redis 能够在后台自动重写 AOF 产生一个新的 AOF 文件,这个新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。

在这里插入图片描述

AOF 重写(rewrite) 是一个有歧义的名字,该功能是通过读取数据库中的键值对来实现的,程序无须对现有 AOF 文件进行任何读入、分析或者写入操作。
并不是对本身AOF文件做出任何操作

由于 AOF 重写会进行大量的写入操作,为了避免对 Redis 正常处理命令请求造成影响,Redis 将 AOF 重写程序放到子进程里执行。

AOF的写操作的原理?

  • AOF 文件重写期间,Redis 还会维护一个 AOF 重写缓冲区,该缓冲区会在子进程创建新 AOF 文件期间,记录服务器执行的所有写命令。
  • 当子进程完成创建新 AOF 文件的工作之后,服务器会将重写缓冲区中的所有内容追加到新 AOF 文件的末尾,使得新的 AOF 文件保存的数据库状态与现有的数据库状态一致。
  • 最后,服务器用新的 AOF 文件替换旧的 AOF 文件,以此来完成 AOF 文件重写操作。

开启 AOF 重写功能:

可以调用 BGREWRITEAOF 命令手动执行,也可以设置下面两个配置项,让程序自动决定触发时机:

  • auto-aof-rewrite-min-size:如果 AOF 文件大小小于该值,则不会触发 AOF 重写。默认值为 64 MB;auto-aof-rewrite-- -------
  • percentage:执行 AOF 重写时,当前 AOF 大小(aof_current_size)和上一次重写时 AOF 大小(aof_base_size)的比值。如果当前 AOF 文件大小增加了这个百分比值,将触发 AOF 重写。将此值设置为 0 将禁用自动 AOF 重写。默认值为 100

Redis 7.0 版本之前,如果在重写期间有写入命令,AOF 可能会使用大量内存,重写期间到达的所有写入命令都会写入磁盘两次。

因为此时在原来的AOF上上做文章, 同时新的AOF又是在新的数据上

如何选择RDB AOF?

  1. RDB 比 AOF 优秀的地方:
  • RDB 文件存储的内容是经过压缩的二进制数据, 保存着某个时间点的数据集,文件很小,适合做数据的备份,灾难恢复。AOF 文件存储的是每一次写命令,类似于 MySQL 的 binlog 日志,通常会比 RDB 文件大很多。当 AOF 变得太大时,Redis 能够在后台自动重写 AOF。新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。不过, Redis 7.0 版本之前,如果在重写期间有写入命令,AOF 可能会使用大量内存,重写期间到达的所有写入命令都会写入磁盘两次。
  • 使用 RDB 文件恢复数据,直接解析还原数据即可,不需要一条一条地执行命令,速度非常快。而 AOF 则需要依次执行每个写命令,速度非常慢。也就是说,与 AOF 相比,恢复大数据集的时候,RDB 速度更快。
  1. AOF 比 RDB 优秀的地方:
  • RDB 的数据安全性不如 AOF,没有办法实时或者秒级持久化数据。生成 RDB 文件的过程是比较繁重的, 虽然 BGSAVE 子进程写入 RDB 文件的工作不会阻塞主线程,但会对机器的 CPU 资源和内存资源产生影响,严重的情况下甚至会直接把 Redis 服务干宕机。AOF 支持秒级数据丢失(取决 fsync 策略,如果是 everysec,最多丢失 1 秒的数据),仅仅是追加命令到 AOF 文件,操作轻量。
  • RDB 文件是以特定的二进制格式保存的,并且在 Redis 版本演进中有多个版本的 RDB,所以存在老版本的 Redis 服务不兼容新版本的 RDB 格式的问题。
  • AOF 以一种易于理解和解析的格式包含所有操作的日志。你可以轻松地导出 AOF 文件进行分析,你也可以直接操作 AOF 文件来解决一些问题。比如,如果执行FLUSHALL命令意外地刷新了所有内容后,只要 AOF 文件没有被重写,删除最新命令并重启即可恢复之前的状态。

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

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

相关文章

Qt | QFrame容器

01、QFrame 一、QFrame 类 1、QFrame类是带有边框的部件的基类,带边框部件的特点是有一个明显的边框,QFrame 类就是用来实现边框的不同效果的(把这种效果称为边框样式),所有继承自 QFrame 的子 类都可以使用 QFrame 类实现的效果。 2、部件通常是矩形的(其他形状的原理…

O32系统学习

O32系统学习 一、什么是O32系统 O32系统即基金投资管理系统,最开始是为基金公司开发的投资交易管理系统,到后来逐步涉及到券商、券商资管、保险、信托、期货,私募,甚至财务公司,金融控股集团,非标交易所等…

Apollo:开源多语言医疗大型语言模型

前言 医疗知识的整合与人工智能一直是研究界的焦点,每一点进步都可能带来更好的患者体验和更高的治愈率。尽管医疗大型语言模型(LLM)前景广阔,但现有工作主要集中在中文和英文上,对于其他语言的多语言适配还有待进一步探索。 为了将最先进的…

[华为OD]C卷 机场航班调度 ,XX市机场停放了多架飞机,每架飞机都有自己的航班号100

题目: XX市机场停放了多架飞机,每架飞机都有自己的航班号CA3385, CZ6678, SC6508 等,航班号的前2个大写字母(或数字)代表航空公司的缩写,后面4个数字代表航班信息。 但是XX市机场只有一条起飞用跑道&am…

使用ipxe安装现有的装机环境

iPXE和传统PXE区别 iPXE和传统PXE(Pre-boot Execution Environment,预启动执行环境)的主要区别在于它们的功能和协议支持。以下是两者的主要区别: 协议支持: PXE仅支持TFTP(trivial file transfer protoco…

【精选文献】JAG|基于时序Sentinel-1 SAR影像小农耕作区烟草空间分布制图

目录 文章简介 01 文章摘要 02 研究背景、目标及创新点 03 研究区域与数据集 04 研究方法 05 研究结果 06 研究讨论 07 研究结论 08 文章引用 文章简介 论文名称:Mapping tobacco planting areas in smallholder farmlands using Phenological-Spatial-Te…

hadoop学习---基于hive的航空公司客户价值的LRFCM模型案例

案例需求: RFM模型的复习 在客户分类中,RFM模型是一个经典的分类模型,模型利用通用交易环节中最核心的三个维度——最近消费(Recency)、消费频率(Frequency)、消费金额(Monetary)细分客户群体,从而分析不同群体的客户价值。在某些…

python - 3D图表绘制

Pyecharts 和 3D 图表绘制 Pyecharts 是一个用于生成各种图表的 Python 库,它基于 Echarts,支持大量的图表类型,非常适合用于数据分析和可视化。Pyecharts 主要优点是易于使用,可以直接在 Python 环境中绘制富有交互性的图表&…

数据分析及AI技术在旅游行业的应用

引言 旅游行业是一个充满潜力和机遇的领域,而数据分析和人工智能(AI)技术的迅猛发展为这个行业带来了前所未有的机遇和挑战。本文将探讨数据分析及AI技术在旅游行业中的具体应用及其带来的影响。 数据分析在旅游行业的4种应用 在旅游行业…

Java Web 开发 - 掌握拦截器和监听器

目录 深入了解Java Web的拦截器和监听器 拦截器(Interceptor) 拦截器的使用场景 拦截器实例 思维导图 ​编辑 监听器(Listener) 监听器的使用场景 监听器类型 监听器实例 思维导图​编辑 总结 深入了解Java Web的拦截器…

Linux专栏05:Linux基本指令之目录处理指令

博客主页:Duck Bro 博客主页系列专栏:Linux专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Linux基本指令之目录处理指令 编号:05 文章目录 Linux基…

打破失联困境:门店如何利用AI智能名片B2B2C商城小程序重构与消费者的紧密连接?

在如今这个消费者行为日益碎片化的时代,门店经营者们时常感叹:消费者进店如同一场不期而遇的缘分,然而一旦离开门店,就仿佛消失在茫茫人海中,难以再觅其踪迹。这种“进店靠缘分,离店就失联”的困境&#xf…

Tracecat:开源 SOAR

Tracecat 是一个面向安全团队的开源自动化平台。 开发人员认为,每个人都应该可以使用安全自动化,特别是人手不足的中小型团队。 核心功能、用户界面和日常工作流程基于一流安全团队的现有最佳实践。 使用专门的人工智能模型来标记、总结和丰富警报。 …

(三十二)第 5 章 数组和广义表(稀疏矩阵的十字链表存储表示实现)

1. 背景说明 2. 示例代码 1) errorRecord.h // 记录错误宏定义头文件#ifndef ERROR_RECORD_H #define ERROR_RECORD_H#include <stdio.h> #include <string.h> #include <stdint.h>// 从文件路径中提取文件名 #define FILE_NAME(X) strrchr(X, \\) ? strrch…

第12章 软件测试基础(第一部分)概念、质量保证、测试用例、测试执行过程

一、软件测试 &#xff08;一&#xff09;定义 动态验证计算机程序对有限的测试用例集是否可产生期望的结果的过程。测试计划是描述了要进行的测试活动的范围、方法、资源和进度的文档。编写测试计划目的&#xff1a;使测试工作顺利进行、使项目参与人员沟通更舒畅、使测试工…

第十五届蓝桥杯

经历半年以来的学习&#xff0c;终于出结果了。期间无数次想要放弃&#xff0c;但是我都挺过来了&#xff0c;因为我还不能倒下。期间有很多次焦虑&#xff0c;一直在想&#xff0c;我要是没拿奖我是不是白学了。但是学到最后就释怀了&#xff0c;因为在备赛期间&#xff0c;我…

OpenCV如何为等值线创建边界旋转框和椭圆(63)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇:OpenCV 为轮廓创建边界框和圆(62) 下一篇:OpenCV的图像矩(64) 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 cv::minAreaRect使用 OpenCV 函数 cv::fitEllipse cv::min…

ClickHouse安装(成功安装)

1.下载安装包 下面通过阿里镜像&#xff08;https://mirrors.aliyun.com/clickhouse/rpm/lts/&#xff09;进行下载&#xff0c;下载哪里&#xff0c;自行指定。 # deb包下载使用如下4行 wget https://mirrors.aliyun.com/clickhouse/deb/pool/stable/clickhouse-client_22.8…

B站评论区自动私信关注助手

电脑协议版本&#xff0c;不支持安卓系统 支持一键采集评论区精准用户&#xff0c;可通过关键词进行筛选&#xff0c;导出数据表格 支持全自动关注私信&#xff0c;实现评论区截流曝光&#xff0c;日引500精准粉 支持一台电脑批量账号矩阵&#xff0c;定点爆破&#xff0c;全…

Mac 版 安装NVM

优质博文IT-BLOG-CN NVM&#xff08;Node Version Manager&#xff09;是一个用于管理多个Node.js版本的工具。它允许开发者在同一台机器上安装和切换不同版本的Node.js&#xff0c;以便在不同的项目中使用不同的Node.js版本。macOS用户可以使用homebrew来安装NVM。 一、安装h…