【Redis进阶】Redis的持久化RDB和AOF

目录

持久化

RDB持久化

概念

原理

RDB 持久化的详细工作流程

1触发持久化:

2创建子进程:

3数据写入 RDB 文件:

4替换旧文件:

5回收子进程:

RDB持久化的触发方式

1.手动触发:

2.自动触发:

3.其他情况:

RDB持久化的优缺点

优点

缺点

AOF(Append Only File)持久化

原理

AOF文件的格式

写入机制

写入缓存

AOF持久化配置

AOF重写机制

AOF持久化的详细工作流程

适用场景

AOF和RDB对比


持久化

Redis是一个基于内存的数据库,它的数据都存储于内存当中,一旦出现服务故障或者其他原因导致服务器关机,那么它的数据也将一同消失。那么将Redis的数据也写入到磁盘当中保存,这个过程叫做数据持久化,其数据持久化功能是保证数据安全与持久性的关键。

RDB持久化

概念

RDB 持久化机制通过创建内存中数据的快照(snapshot),并将其保存到磁盘上的二进制文件中。这个文件通常称为 dump.rdb 文件。RDB 文件可以在 Redis 服务器重启时用于恢复数据。

原理

我们都知道Redis是一个单线程程序,采用IO多路复用同时负责多个客户端套接字的并发读写操作。在服务线上请求的同时,Redis还需要进行内存快照,内存快照要求必须进行文件IO操作,文件IO操作会严重降低服务请求的性能,还可能会阻塞处理线上的请求业务。为了解决这些问题,实现边持久化边处理请求,Redis使用操作系统的多进程COW(Copy On Write)机制来实现快照持久化。

Redis在持久化时会调用glibc的函数fork产生一个子进程,快照持久化完全交给子进程来处理,父进程处理客户端请求。

RDB 持久化的详细工作流程

  • 1触发持久化

    • RDB 持久化可以通过手动命令(如 SAVEBGSAVE)或自动配置(在配置文件中设置条件)触发。
    • 当满足条件时,Redis 会启动一个快照操作。
  • 2创建子进程

    • Redis 通过 fork 系统调用创建一个子进程。子进程是父进程的一个副本,拥有相同的内存数据。
    • 子进程负责将内存中的数据写入 RDB 文件,而父进程继续处理客户端请求。
  • 3数据写入 RDB 文件

    • 子进程遍历 Redis 内存中的所有数据结构,将它们序列化并写入一个临时 RDB 文件。
    • 序列化的过程将 Redis 的各种数据结构(如字符串、哈希、列表、集合、有序集合等)转换成 RDB 文件格式。
  • 4替换旧文件

    • 当子进程完成数据写入后,会用新的 RDB 文件替换旧的 RDB 文件。
    • 通过这种方式,确保在整个持久化过程中,磁盘上始终有一个完整且有效的 RDB 文件。
  • 5回收子进程

    • 子进程完成任务后会退出,操作系统回收子进程的资源。
    • 父进程通过等待子进程的退出信号,确保持久化操作成功完成。

RDB持久化的触发方式

1.手动触发

  • SAVE 命令:阻塞 Redis 服务器,生成 RDB 文件。适合在非生产环境或对短暂停顿不敏感的场景使用。
  • BGSAVE 命令:在后台生成 RDB 文件,不阻塞服务器。适用于生产环境。

2.自动触发

  • 在 Redis 配置文件 redis.conf 中配置 save 选项,定义在一定时间内数据变更的次数,满足这些条件时自动生成 RDB 文件。例如:
save 900 1   # 900秒(15分钟)内至少有1个键发生变化
save 300 10  # 300秒(5分钟)内至少有10个键发生变化
save 60 10000 # 60秒(1分钟)内至少有10000个键发生变化

3.其他情况

  • 当执行 FLUSHALLFLUSHDB 命令时,如果开启了 rdbcompression 配置,Redis 会先执行一次 RDB 持久化。

RDB持久化的优缺点

优点

  • 快速重启:RDB 文件是紧凑的二进制文件,加载速度快,适合用于快速恢复大量数据。
  • 性能开销低:持久化在子进程中进行,不会阻塞主进程的读写操作。
  • 数据完整性高:RDB 文件包含某一时刻的全量数据,文件格式稳定可靠,适合备份和灾难恢复。

缺点

  • 数据丢失风险:由于 RDB 是通过间隔一定时间创建快照,若在快照间隔期间 Redis 崩溃,则可能丢失这段时间内的数据。
  • 大数据量性能问题:对于非常大的数据集,RDB 文件的生成和写入过程可能会消耗较多的系统资源。

AOF(Append Only File)持久化

原理

AOF日志 通过记录 Redis 接收到的每个写操作命令,将其追加到一个日志文件中,从而实现数据的持久化。

AOF文件的格式

AOF 文件是文本文件,按顺序记录每次写操作命令。

假设 AOF 日志记录了自 Redis 实例创建以来所有的修改性指令序列,那么就可以通过对一个空的 Redis 实例顺序执行所有的指令,也就是「重放」,来恢复 Redis 当前实例的内存数据结构的状态。

写入机制

Redis在收到客户端修改命令后,先进性响应的校验如果没问题,就立刻将该命令追加到.aof文件中,也就是先存到磁盘中,然后服务器再执行命令。如果遇到了突发的宕机情况,也只需要将存储到.aof文件中的命令运行一次,就可以恢复到宕机前的状态。

写入缓存

上述过程中,将命令的写入是一个IO操作。Redis为了提升写入效率,它不会将内容直接写入磁盘中,而是将其放到一个内存缓存区(buffer)中,等到缓存区被填满时采用异步真正将缓存区中的内容写入到磁盘里。

但是会出现一个问题就是,如果机器突然宕机,AOF日志内容可能还没有拉的及完全刷到磁盘中,这个时候就会出现日志丢失。所以Redis为数据的安全性考虑,同样为AOF持久化提供了策略配置。

AOF持久化配置

AOF默认不开启,可以在 redis.conf 文件中对AOF进行配置开启

1.开启AOF配置

appendonly yes

 2.AOF文件名称

appendfilename "appendonly.aof"

3.同步策略

  • always:每次写操作后立即调用 fsync,确保数据立即写入磁盘,最安全但性能最差。
  • everysec:每秒调用一次 fsync,性能和安全性的折中方案,推荐使用。
  • no:完全依赖操作系统进行同步,性能最好但数据安全性最低。
appendfsync everysec

由于是 fsync 是磁盘 IO 操作,所以它很慢!如果 Redis 执行一条指令就要 fsync 一次(Always),那么 Redis 高性能将严重受到影响。

在生产环境的服务器中,Redis 通常是每隔 1s 左右执行一次 fsync 操作( Everysec),这样既保持了高性能,也让数据尽可能的少丢失。最后一种策略(No),让操作系统来决定何时将数据同步到磁盘,这种策略存在许多不确定性,所以不建议使用。

AOF重写机制

Redis在长期运行的过程中,aof文件会越来越大。如果机器宕机重启,运行整个aof文件会非常耗时,导致长时间Redis无法对外提供服务。因此需要对aof文件做一下”瘦身运动“。

AOF重写配置

auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

AOF 重写是减少 AOF 文件体积的重要手段。当满足以下条件之一时,Redis 会触发 AOF 重写:

  • AOF 文件的大小是上次重写后的 100%(即翻倍)。
  • AOF 文件的大小超过了 auto-aof-rewrite-min-size 设置的最小值。

AOF持久化的详细工作流程

1.记录写操作

  • 每当有写操作(如 SETLPUSH 等)执行时,Redis 会将该命令以文本形式追加到 AOF 文件末尾。

2.追加同步

  • 通过 fsync 操作,将追加的数据从缓冲区同步到磁盘,确保数据写入磁盘。
  • AOF 提供三种不同的同步策略,分别是:alwayseverysecno,详细见后文配置部分。

3.AOF 重写

  • 随着时间推移,AOF 文件会越来越大。为减少文件体积,Redis 提供了 AOF 重写机制。
  • 重写过程生成一个新的 AOF 文件,包含当前数据库状态的最小命令集。
  • 重写通过一个后台子进程完成,子进程会读取当前内存数据并将其转换为命令写入新的 AOF 文件。

4.文件替换

  • 当新的 AOF 文件生成后,Redis 会替换旧的 AOF 文件,并继续记录新的写操作。 

适用场景

AOF 持久化适用于以下场景:

  1. 高数据安全性要求:如金融系统、交易平台等需要最小化数据丢失的场景。
  2. 需要可读日志:如开发调试、运维分析时需要可读的日志文件。
  3. 频繁写操作:适用于写操作频繁且数据变动较多的应用。

缺点

  • 比RDB占用更多的磁盘空间
  • 恢复备份速度要慢
  • 每次读写都同步的话,有一定的性能压力
  • 存在个别bug,造成不能恢复

AOF和RDB对比

RDB持久化AOF持久化
全量备份,一次保存真个数据库增量备份,一次只保存一个修改数据库的命令
每次执行持久化操作的间隔时间较长保存的间隔默认为一秒钟(Everysec)
数据保存为二进制格式,其还原速度快。使用文本格式还原数据,所以数据还原速度一般。
执行SAVE命令时会阻塞服务器,但手动或者自动触发的BGSAVE不会阻塞服务器AOF持久化无论何时都不会阻塞服务器

官方推荐两个都启用。

如果对数据不敏感,可以单独用RDB。

不建议单独使用AOF,因为可能会出现BUG。

如果只是做纯内存缓存,可以都不用。

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

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

相关文章

FFmpeg推流

目录 一. 环境准备 二. 安装FFmpeg 三. 给docker主机安装docker服务 四. 使用 FFmpeg 进行推流测试 FFmpeg是一个非常强大的多媒体处理工具,它可以用于视频和音频的录制、转换以及流处理。在流处理方面,FFmpeg可以用来推流,即将本地媒体…

【第17章】Spring Cloud之Gateway服务调用

文章目录 前言一、用户服务二、网关服务1. 负载均衡2. 服务调用3. 登录拦截器 三、单元测试1. 启动服务2. 用户不存在3. 正常登录 总结 前言 在上一章我们使用JWT简单完成了用户认证,【第16章】Spring Cloud之Gateway全局过滤器(安全认证),上一章内容已…

端点区间影响

前言:这一题本来想就是直接来一个前缀和来写,直接左边加一,右边减一,但是细想好像有问题,我们平时做的题目左边端点造成的影响会对这一段区间造成影响,但是这一题的话超过了左边端点就不会有影响了 那这一题…

vue3-ts:husky + prettier / 代码格式化工具

一、Prettier简介 Prettier是一个流行的代码格式化工具,它的主要作用是帮助开发者自动规范化代码的格式,提高代码的可读性和一致性。Prettier通过解析代码并使用自己的规则重新打印它,以确保代码风格的一致性和符合预设的格式化标准。 二、…

WPF学习(8)- Button按钮

1. 用法解析 Button因为继承了ButtonBase&#xff0c;而ButtonBase又继承了ContentControl&#xff0c;所以&#xff0c;Button可以通过设置Content属性来设置要显示的内容。例如 <Button Content"确定"/>我们使用Button的时机&#xff0c;通常是鼠标点击事件…

【Dash】使用 dash_mantine_components 创建图表

一、Styling Your App The examples in the previous section used Dash HTML Components to build a simple app layout, but you can style your app to look more professional. This section will give a brief overview of the multiple tools that you can use to enhan…

树莓派5进行YOLOv8部署的4种不同部署方式检测速度对比:pytorch、onnx、ncnn、tflite

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

Python 异步编程:Asyncio 实现原理

常见的并发模型 多进程/多线程异步ActorPub/Sub Python 异步的基石&#xff1a;协程 协程简介 概念&#xff1a;协作式多任务的子程序&#xff0c;用户态线程或微线程&#xff08;Coroutine&#xff09;。 特点&#xff1a;子程序执行可以中断&#xff0c;恢复后不会丢失之…

生物反应器对Organoids培养有啥帮助?有几种?快来看看!

Bioreactor Technologies for Enhanced Organoid Culture是《INTERNATIONAL JOURNAL OF MOLECULAR SCIENCES》上的一篇文章&#xff0c;介绍了用于类器官培养的生物反应器&#xff0c;包括搅拌式、微流体、旋转壁容器和电刺激四类。搅拌式生物反应器通过改善氧合和实现适当的谱…

【iOS多线程(二)】GCD其他方法详解

GCD其他方法 dispatch_semaphore &#xff08;信号量&#xff09;什么是dispatch_semaphore(信号量)?dispatch_semaphore主要的三个方法dispatch_semaphore主要作用线程安全线程同步 dispatch_afterdispatch_time_t 两种形式 GCD 一次性代码&#xff08;只执行一次&#xff09…

面向 RAG 应用开发者的实用指南和建议

向量搜索并非轻而易举&#xff01; 向量搜索&#xff0c;也称为向量相似性搜索或最近邻搜索&#xff0c;是一种常见于 RAG 应用和信息检索系统中的数据检索技术&#xff0c;用于查找与给定查询向量相似或密切相关的数据。业内通常会宣传该技术在处理大型数据集时非常直观且简单…

【C语言】C语言期末突击/考研--结构体与C++引用

一、结构体--结构体对齐--结构体数组 1.1.结构体的定义、初始化、结构体数组 有时候需要将不同类型的数据组合为一一个整体&#xff0c;以便于引用。 例如&#xff0c;一名学生有学号、姓 名、性别、年龄、地址等属性&#xff0c;如果针对学生的学号、姓名、年龄等都单独定义一…

【MYSQL】表操作

目录 查看当前数据库含有表查看表结构创建表插入&#xff08;新增create&#xff09;查询&#xff08;retrieve&#xff09;全列查询指定列查询查询列是表达式别名查询(as)去重查询(distinct)排序查询(order by)条件查询(where)比较/逻辑运算符使用 分页查询(limit) 一条语句各…

【若依项目-RuoYi】掌握若依前端的基本流程

搞毕设项目&#xff0c;使用前后端分离技术&#xff0c;后端springBoot&#xff0c;前端vue3element plus。自己已经写好前端与后端代码&#xff0c;但想换一个前端界面所以使用到了若依&#xff0c;前前后后遇到许多坑&#xff0c;记录一下&#xff0c;方便之后能够快速回忆。…

尚硅谷谷粒商城项目笔记——八、安装node.js【电脑CPU:AMD】

八、安装node.js 注&#xff1a; [!NOTE] 查看本机系统 官网选择node.js版本 1傻瓜式安装&#xff0c;注意选择路径 图一 图二 至此&#xff0c;nodejs安装完成&#xff01; 2环境配置 找到安装nodejs的路径新增 node_global 和node_cache文件夹 创建完两个空文件夹&#x…

如何快速入门 PyTorch ?

PyTorch是一个机器学习框架&#xff0c;主要依靠深度神经网络&#xff0c;目前已迅速成为机器学习领域中最可靠的框架之一。 PyTorch 的大部分基础代码源于 Ronan Collobert 等人 在 2007 年发起的 Torch7 项目&#xff0c;该项目源于 Yann LeCun 和 Leon Bottou 首创的编程语…

0207、创建场景状态的三个子类

VS使用的是3.5框架&#xff0c;会自带Linq这一行&#xff0c;Unity不支持&#xff0c;需要删除 一、创建三个场景 二、创建三个子类

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用

本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——5Webscoket节点的使用 ​ 有了前面几篇文章的铺垫&#xff0c;现在已经可以实现我到手测试那一步的 1.解读usb_websocket_display.launch.py ​ 首先进入这个目录/root/dev_ws/src/origincar/originca…

Java语言程序设计——篇十二

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…