Redis—持久化

news2024/11/20 7:13:02

这里写目录标题

  • AOF
    • 三种写回策略
    • 写回策略的优缺点
    • AOF 重写机制
    • AOF后台重写
    • AOF优缺点
    • 使用命令
  • RDB
    • RDB 持久化的工作原理
    • 执行快照时,数据能被修改吗
    • RDB 持久化的优点
    • RDB 持久化的缺点
  • 混合持久化
  • 大key对持久化的影响

AOF

保存写操作命令到日志的持久化方式,就是Redis里的AOF持久化功能(先写入到内存,再将记录命令写到日志同步到磁盘中)

三种写回策略

  • Always,这个单词的意思是「总是」,所以它的意思是每次写操作命令执行完后,同步将 AOF 日志数据写回硬盘;
  • Everysec,这个单词的意思是「每秒」,所以它的意思是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,然后每隔一秒将缓冲区里的内容写回到硬盘;
  • No,意味着不由 Redis 控制写回硬盘的时机,转交给操作系统控制写回的时机,也就是每次写操作命令执行完后,先将命令写入到 AOF 文件的内核缓冲区,再由操作系统决定何时将缓冲区内容写回硬盘。

写回策略的优缺点

  • Always:保证数据的持久性和一致性,但写入性能较低。高可靠

  • Everysec:在性能和数据持久性之间做了一定的平衡,适用于大多数应用场景。折中

  • No:写入性能最高,但在崩溃时可能会丢失数据,适用于对数据持久性要求不高或可以容忍少量数据丢失的场景。高性能

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZMzslZl4-1691542607867)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230809080739581.png)]

深入底层三种写回策略,其实调用fsync()函数的时机不同:

  • Always 策略就是每次写入 AOF 文件数据后,就执行 fsync() 函数;
  • Everysec 策略就会创建一个异步任务来执行 fsync() 函数;
  • No 策略就是永不执行 fsync() 函数;

AOF 重写机制

为了避免AOF文件越写越大,提供了AOF重写机制,当文件超过阀值就会启动AOF重写机制,来压缩文件,重写机制的妙处在于,尽管某个键值对被多条写命令反复修改,最终也只需要根据这个「键值对」当前的最新状态,然后用一条命令去记录键值对,代替之前记录这个键值对的多条命令,这样就减少了 AOF 文件中的命令数量。最后在重写工作完成后,将新的 AOF 文件覆盖现有的 AOF 文件。

AOF后台重写

AOF重写很耗时,所以,Redis 的重写 AOF 过程是由后台子进程 *bgrewriteaof* 来完成的,这么做可以达到两个好处:

  • 子进程进行 AOF 重写期间,主进程可以继续处理命令请求,从而避免阻塞主进程;
  • 子进程带有主进程的数据副本(数据副本怎么产生的后面会说),这里使用子进程而不是线程,因为如果是使用线程,多线程之间会共享内存,那么在修改共享内存数据的时候,需要通过加锁来保证数据的安全,而这样就会降低性能。而使用子进程,创建子进程时,父子进程是共享内存数据的,不过这个共享的内存只能以只读的方式,而当父子进程任意一方修改了该共享内存,就会发生「写时复制」,于是父子进程就有了独立的数据副本,就不用加锁来保证数据安全。

AOF优缺点

AOF(Append-Only File)持久化是 Redis 的一种持久化机制,它将所有的写操作追加到一个文件中,通过重新执行这些写操作来恢复数据。

AOF 持久化的优点包括:

  1. 数据完整性:AOF 持久化可以保证数据的完整性和持久性,每个写操作都会被追加到文件中,从而避免了数据丢失的风险。
  2. 灵活性:AOF 持久化采用追加写入的方式,因此可以在不中断服务的情况下进行持久化操作,提供了更好的灵活性。
  3. 可读性:AOF 文件是一个追加写入的日志文件,可以通过文本编辑器查看其中的写操作,方便进行故障排查和数据恢复。
  4. 高性能:AOF 持久化的写入性能通常比 RDB(Redis 数据库快照持久化)更高,尤其在写入频率较高的场景下。

AOF 持久化的缺点包括:

  1. 文件体积较大:AOF 文件相对于 RDB 文件通常会更大,因为它包含了所有的写操作。这可能会占用更多的磁盘空间。
  2. 恢复速度较慢:由于 AOF 持久化是通过重新执行写操作来恢复数据的,当 AOF 文件较大时,恢复过程可能比 RDB 持久化更慢。
  3. 可能存在数据冗余:由于 AOF 文件记录了所有的写操作,可能会导致一些数据操作的冗余,尤其是在写入频率较高的情况下。

需要根据具体的业务需求、数据安全性和性能要求来选择合适的持久化方式。可以采用 AOF 持久化来提供更好的数据完整性和灵活性,但也要注意管理 AOF 文件的大小和恢复速度。

使用命令

需要使用CONFIG命令来修改appendonly参数的值(Yes/No)

RDB

  • AOF文件的内容是操作命令
  • RDB文件的内容是二进制数据

Redis 提供了两个命令来生成 RDB 文件,分别是 savebgsave,他们的区别就在于是否在「主线程」里执行:

  • 执行了 save 命令,就会在主线程生成 RDB 文件,由于和执行操作命令在同一个线程,所以如果写入 RDB 文件的时间太长,会阻塞主线程
  • 执行了 bgsave 命令,会创建一个子进程来生成 RDB 文件,这样可以避免主线程的阻塞

Redis 的快照是全量快照,也就是说每次执行快照,都是把内存中的「所有数据」都记录到磁盘中。

Redis RDB(Redis Database)是一种快照持久化机制,用于将 Redis 的内存数据保存到磁盘上的二进制文件中。

RDB 持久化的工作原理

  1. Redis 通过fork一个子进程来执行持久化操作,父进程继续处理客户端请求。
  2. 子进程将当前的内存数据快照写入到临时文件中。
  3. 写入完成后,子进程将临时文件重命名为持久化文件(默认名为dump.rdb)。
  4. Redis 将旧的持久化文件(如果存在)替换为新的持久化文件。

执行快照时,数据能被修改吗

执行 bgsave 过程中,Redis 依然可以继续处理操作命令的,也就是数据是能被修改的,关键的技术就在于写时复制技术(Copy-On-Write, COW)。

RDB 持久化是通过将 Redis 的内存数据快照写入磁盘的方式来实现的。为了保证数据的一致性,Redis 在执行 RDB 快照时会使用子进程来处理持久化操作,而父进程继续处理客户端请求。在子进程执行 RDB 快照期间,父进程仍然可以处理客户端的写操作。这意味着,在执行 RDB 持久化期间,Redis 可能会接收到新的写操作,并且这些写操作会修改内存中的数据。然而,这些被修改的数据不会被立即写入到 RDB 文件中。子进程在完成 RDB 持久化后,会将当前内存中的数据快照写入到临时文件中,并将临时文件重命名为持久化文件。因此,在 RDB 快照执行期间,写操作对于持久化操作来说是不可见的。

RDB 持久化的优点

  1. 性能较高:RDB 持久化是通过将内存数据快照写入磁盘的方式来实现持久化,速度较快,适合大规模数据的备份和恢复。
  2. 文件体积较小:RDB 文件是二进制格式,相对于 AOF(Append-Only File)持久化产生的日志文件,文件体积较小,节省磁盘空间。
  3. 恢复速度较快:由于 RDB 文件是 Redis 数据的快照,恢复数据时只需加载 RDB 文件即可,速度较快。

RDB 持久化的缺点

  1. 可能会丢失数据:RDB 持久化是通过周期性地将内存数据快照写入磁盘来实现的,如果 Redis 在持久化之间发生崩溃,可能会丢失最后一次持久化后的数据。
  2. 不适合实时备份:RDB 持久化是通过在后台进行快照操作来实现的,不适合实时备份,因此在数据恢复时可能会丢失最新的数据。

需要根据具体的业务需求、数据安全性和性能要求来选择合适的持久化方式。可以使用 RDB 持久化来提供较高的性能和较小的文件体积,但需要注意定期执行持久化操作以避免数据丢失。

混合持久化

aof-use-rdb-preamble yes

混合持久化工作在AOF日志重写过程

当开启了混合持久化时,在 AOF 重写日志时,fork 出来的重写子进程会先将与主线程共享的内存数据以 RDB 方式写入到 AOF 文件,然后主线程处理的操作命令会被记录在重写缓冲区里,重写缓冲区里的增量命令会以 AOF 方式写入到 AOF 文件,写入完成后通知主进程将新的含有 RDB 格式和 AOF 格式的 AOF 文件替换旧的的 AOF 文件。

也就是说,使用了混合持久化,AOF 文件的前半部分是 RDB 格式的全量数据,后半部分是 AOF 格式的增量数据。这样的好处在于,重启 Redis 加载数据的时候,由于前半部分是 RDB 内容,这样加载的时候速度会很快。加载完 RDB 的内容后,才会加载后半部分的 AOF 内容,这里的内容是 Redis 后台子进程重写 AOF 期间,主线程处理的操作命令,可以使得数据更少的丢失

大key对持久化的影响

Redis 中的大 key 指的是占用比较大的键值对,通常是字符串类型的值,其大小超过了 Redis 的配置参数 hash-max-ziplist-value(默认为 64 字节)或 list-max-ziplist-value(默认为 8KB)。

大 key 对持久化的影响如下:

  1. RDB 持久化:在执行 RDB 持久化时,Redis 会将内存中的数据快照写入到磁盘的 RDB 文件中。如果存在大 key,特别是大字符串类型值,会导致 RDB 文件的大小增加,从而增加持久化操作的耗时和占用的磁盘空间。
  2. AOF 持久化:在执行 AOF 持久化时,Redis 会将写操作追加到 AOF 文件中。如果存在大 key,每次对该键进行修改操作时,都会导致 AOF 文件的增长,从而增加持久化操作的耗时和占用的磁盘空间。

大 key 对持久化的影响主要体现在持久化文件的大小和持久化操作的性能上。较大的持久化文件可能会增加恢复数据的时间,而频繁的持久化操作可能会降低 Redis 的写入性能。

为了减少大 key 对持久化的影响,可以考虑以下措施:

  • 将大 key 拆分为多个较小的键值对,以减少单个键值对的大小。
  • 对于大字符串类型值,可以考虑是否需要拆分为多个较小的字符串进行存储。
  • 根据业务需求和数据访问模式,合理设置 Redis 的配置参数,如 hash-max-ziplist-valuelist-max-ziplist-value,以控制大 key 的大小。

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

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

相关文章

Codeforces-Round-891-Div-3

Codeforces Round 891 (Div. 3) A. Array Coloring 题目 给你一个由 n n n个整数组成的数组。您的任务是确定是否可以将其所有元素着色为两种颜色,使得两种颜色的元素之和具有相同的奇偶性,并且每种颜色至少有一个元素着色。 例如,如果数…

ArcGIS Pro应用—暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用全流程科研能力提升教程

详情点击链接:ArcGIS Pro应用—暨基础入门、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合、案例应用全流程科研能力提升教程 第一:GIS及ArcGIS Pro 1.GIS基本原理及常用软件 2.ArcGIS Pro 安装与配置 3.ArcGIS Pro 3.0 的新…

Detecting Everything in the Open World: Towards Universal Object Detection

1. 论文简介 论文题目《Detecting Everything in the Open World: Towards Universal Object Detection》发表情况,CVPR2023[论文地址][https://arxiv.org/pdf/2303.11749.pdf][代码地址][https://github.com/zhenyuw16/UniDetector] 2.背景与摘要 本文旨在解决通…

面试热题(岛屿数量)

给你一个由 1(陆地)和 0(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均…

关于三次握手和四次挥手,面试官到底想听到怎样的回答?

我一看到 TCP,啪就点进来了,很快啊。 TCP报文 一个完整的 TCP 报文头部共有 20 个字节,其中包括: 源端口号(16位)和目的端口号(16位):再加上 ip 首部的源 ip 地址和目…

canvas实现代码雨

学习抖音&#xff1a; 渡一前端必修课 效果图&#xff1a; 全部代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge">&…

实现 Notification 通知

如图这种效果 可以使用 Notification API来进行实现 代码如下 注意&#xff1a;一定要用服务端打开。不然不会弹出来。vscode可以安装 live Serve 插件服务端打开 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8">…

git-指令

1.名称和邮箱 git config --global user.name test git config --global user.email testatguigu.com 这里的--global表示全局配置&#xff0c;后续的所有文件操作都会使用该用户名称及邮箱。此时在操作系统的用户目录C:\Users\Administrator&#xff0c;会产生新的配置文件.gi…

【Python】基础:标准库常用模块

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍标准库常用模块。 学其所用&#xff0c;用其所学。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下&#xff0c;下次更新不迷路&#…

什么是Milvus

原文出处&#xff1a;https://www.yii666.com/blog/393941.html 什么是Milvus Milvus 是一款云原生向量数据库&#xff0c;它具备高可用、高性能、易拓展的特点&#xff0c;用于海量向量数据的实时召回。 Milvus 基于 FAISS、Annoy、HNSW 等向量搜索库构建&#xff0c;核心是…

开发工具Eclipse的使用

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Eclipse使用的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Eclipse是什么 二.使用Eclipse的…

OLED透明屏选购指南:性能、品牌与预算的平衡

引言&#xff1a;OLED透明屏作为一种创新的显示技术&#xff0c;正在迅速发展并广泛应用于各个领域。 然而&#xff0c;面对市场上琳琅满目的OLED透明屏产品&#xff0c;如何选择适合自己需求的高品质产品成为了采购者们的重要任务。 对此&#xff0c;尼伽将为您提供一份OLED…

webshell链接工具-Behinder(冰蝎)

“冰蝎”动态二进制加密网站管理客户端 项目地址&#xff1a; https://github.com/rebeyond/Behinder

大模型“瘦身”进手机 下一个iPhone时刻将至?

一股“端侧大模型”浪潮正在涌来。华为、高通等芯片巨头正探索将AI大模型植入端侧&#xff0c;让手机实现新一代物种进化。 相比ChatGPT、Midjourney等AI应用依赖云端服务器提供服务&#xff0c;端侧大模型主打在本地实现智能化。它的优势在于能够更好地保护隐私&#xff0c;同…

以太网UDP协议(十一)

目录 一、端口号 二、UDP 一、端口号 端口号&#xff0c;用来识别同一台计算机中进行通信的不同应用程序&#xff0c;也别成为程序地址。 备注&#xff1a;端口号由其使用的传输层协议决定。因此&#xff0c;不同的传输协议可以使用相同的端口号。即TCP和UDP可以同时使用相同…

php实现登录的例子

界面&#xff1a; 登录界面login.html代码&#xff1a; <!DOCUMENT html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns"http://www.w3.org/1999/xhtml"…

css的transform样式计算-第一节

本文作者为 360 奇舞团前端开发工程师 引言 在使用 css 样式进行样式的缩放、旋转等设置时&#xff0c;思考了一下它的较浅层的原理&#xff0c;恩&#xff0c;这个阶段都 是一些初高的数学计算&#xff0c;从新看这里的时候顺便捡了捡初高中的数学&#xff0c;比如三角函数之类…

重生之我要学C++第七天(匿名对象、内部类)

构造函数的隐式类型转化 1.单参数构造函数隐式类型转换 来看下面的代码 #include<iostream> using namespace std; class A { public:A(int x){_a x;} private:int _a; }; int main() {A a 3;return 0; } 此处这句代码 A a 3; 对于这里&#xff0c;编译完全正确&…

【Java从0到1学习】07 Java异常

尽管人人希望自己身体健康&#xff0c;处理的事情都能顺利进行&#xff0c;但在实际生活中总会遇到各种状况&#xff0c;比如感冒发烧&#xff0c;工作时电脑蓝屏、死机等。同样&#xff0c;在程序运行的过程中&#xff0c;也会发生各种非正常状况&#xff0c;比如程序运行时磁…

工作区与GOPATH

在学习go语言时&#xff0c;我们会从官网下载go语言的二进制包&#xff0c;然后解压并安装到某个目录&#xff0c;最后会配置环境变量&#xff0c;通过输入命令go version来验证是否安装成功。 配置了path环境后&#xff0c;我们还需要再配置3个环境变量&#xff0c;GOROOT、G…