Redis 持久化八股文

目录

Redis的持久化机制

持久化方式对比

RDB

RDB 持久化

RDB 的优缺点

优点

缺点

RDB 快照时运行修改数据吗

RDB 快照时修改数据过程

写时复制技术

RDB 的执行频率

增量快照

AOF

如何开启AOF

AOF 为什么要采用后写日志呢?

后写日志的弊端

AOF 的优缺点

优点

缺点

AOF 日志写回磁盘的策略

AOF 如何选择写回策略

AOF日志过大的危害

AOF 重写过程

AOF 重写的潜在风险

混合持久化(4.0)

如何开启混合持久化

混合持久化的好处

混合持久化的过程

持久化的选择


Redis的持久化机制

Redis 提供两种持久化机制: RDB(默认) 和 AOF 机制,在 Redis4.0 之后还提供了混合持久化
1. RDB:是指内存快照,指内存中的数据在某一个时刻的状态记录。
2. AOF:AOF日志 里记录的是 Redis 收到的每一条命令,这些命令是以文本形式保存的。
3. 混合持久化:RDB 以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作

持久化方式对比

RDB 持久方式适合大规模的数据恢复场景, 如备份,全量复制等

没办法做到实时持久化/秒级持久化。新老版本存在 RDB 格式兼容问题

AOF 持久方式数据的一致性和完整性更高AOF 记录的内容越多,文件越大,数据恢复变慢
混合持久化结合了 RDB 和 AOF 的优点,使得数据恢复的效率大幅提升

跨版本兼容性不是很好,Redis-4.x 新增,虽然最终的文件也是.aof 格式的文件,但在 4.0 之前版本都不识别

RDB

RDB 持久化

1. 内存快照,就是指内存中的数据在某一个时刻的状态记录, 保存到硬盘中,对应产生的数据文件为dump.rdb, 和 AOF 相比,RDB 记 录的是某一时刻的数据,并不是操作,所以,在做数据恢复时,我们可以直接把 RDB 文件读入内存,不是重新执行命令。
2. Redis 的数据都在内存中,为了提供所有数据的可靠性保证,它执行的是 全量快照 ,也就是说,把内存中的所有数据都记录到磁盘中。

RDB 的优缺点

优点

1. 整个Redis数据库将只包含一个文件dump.rdb,方便持久化。
2. 容灾性好,方便备份。
3. 性能最大化,fork 子进程来完成写操作。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了Redis的高性能 4. 相对于数据集大时, 比AOF的启动效率更高。

缺点

1. 数据安全性低。RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候 。
2. 由于RDB是通过fork子进程来协助完成数据持久化工作的,因此,如果当数据集较大时,可能会导致整个服务器停止服务几百毫秒,甚 至是1秒钟,会占用cpu。

RDB 快照时运行修改数据吗

1. 快照为了保证快照完整性不能进行写操作,但是为了快照而暂停写操作,肯定是不能接受的.。
2. Redis 就会借助操作系统提供的写时复制技术(Copy-On-Write, COW),在执行快照的同时,正常处理写操作。

RDB 快照时修改数据过程

1. bgsave 子进程是由主线程 fork 生成的,共享主线程的所有内存数据。bgsave 子进程运行后,开始读取主线程的内存数据,并把它们 写入 RDB 文件。
2. 如果主线程对这些数据是读操作,主线程和bgsave 子进程相互不影响。
3. 如果主线程要进行写操作修稿某个数据,这块数据就会被复制一份,生成该数据的副本bgsave 子进程会把这个副本数据写入 RDB 文件,而在这个过程中,主线程仍然可以直接修改原来的数据

写时复制技术

1. 写入时复制(Copy-on-write)是存储系统中使用的基本更新策略之一。
2. COW核心思想就是如果有多个调用者同时请求相同资源(如内存或磁盘上的数据存储),他们会共同获取相同的指针指向相同的资 源,直到某个调用者试图修改资源的内容时,系统才会真正复制一份专用副本给该调用者,而其他调用者所见到的最初的资源仍然保持不变。
3. COW 是一种优化策略,fork 子进程是linux提供的创建新线程的方法,大多数的 fork 实现借用了COW 策略来节省内存空间。

RDB 的执行频率

1. 频率过低,某一时间发生了宕机了,那么就会丢失较多数据
2. 频率过高,虽然bgsave执行时不阻塞主线程,但是如果频繁地执行全量快照,也会带来两方面的开销
        2.1. 频繁将全量数据写入磁盘,会给磁盘带来很大压力,多个快照竞争有限的磁盘带宽,前一个快照还没有做完,后一个又开始做
了,容易造成恶性循环。
       
        2.2. bgsave 子进程需要通过 fork 操作从主线程创建出来。虽然,子进程在创建后不会再阻塞主线程,但是,fork 这个创建过程本身
会阻塞主线程,而且主线程的内存越大,阻塞时间越长。如果频繁 fork 出 bgsave 子进程,这就会频繁阻塞主线程了。

增量快照

由于快照的频率不好把握,所以可以通过增量快照的方式解决全量快照的弊端。
增量快照:做了一次全量快照后,后续的快照只对修改的数据进行快照记录,这样可以避免每次全量快照的开销。
增量快照会带来额外的空间开销,因为需要额外的元数据信息去记录哪些数据被修改,这对于内存资源宝贵的 Redis 来说,有些得不偿失

AOF

1. AOF持久化(即Append Only File持久化),以日志的形式记录服务器所处理的每一个写,删除操作,而查询操作不会记录。
2. AOF采用的是写后日志的方式,Redis先执行命令把数据写入内存,然后再记录日志到文件中。
 

如何开启AOF

在redis的默认配置中AOF持久化机制是没有开启的,需要在配置文件中开启
1. 修改 appendonly yes 开启持久化
2. 修改 appendfilename " appendonly.aof" 指定生成文件名称

AOF 为什么要采用后写日志呢?

AOF采用的是 "写后日志"的方式,我们平时用的MySQL则采用的是 "写前日志"。
1. 可以避免出现记录错误命令的情况 。Redis在向AOF里面记录日志的时候,并不会先去对这些命令进行语法检查。所以,如果先记日志再执行命令的话,若命令有错,并在记日志之后发生宕机,日志中就有可能记录了错误的命令,Redis在使用日志恢复数据时,就可能出错。
2. 它在命令执行后才记录日志 ,不会阻塞当前的写操作。

后写日志的弊端

后写日志主要有两个风险可能会发生:
1. 数据可能会丢失:如果 Redis 刚执行完命令,此时发生故障宕机,会导致这条命令存在丢失的风险。
2. 可能阻塞其他操作:AOF 日志其实也是在主线程中执行,所以当 Redis 把日志文件写入磁盘的时候,还是会阻塞后续的操作无法执 行。

AOF 的优缺点

优点

1. 数据安全
2. 通过append模式写文件,即使中途服务器宕机也不会破坏已经存在的内容,可以通过
redis-check-aof工I具解决数据一致性问题。
3. AOF 机制的rewrite模式。定期对AOF文件进行重写,以达到压缩的目的

缺点

1. AOF文件比RDB文件大,且恢复速度慢。
2. 数据集大的时候,比RDB启动效率低。
3. 运行效率没有RDB高

AOF 日志写回磁盘的策略

AOF 机制给我们提供了三个选择,也就是 AOF 配置项 appendfsync 的三个可选值
1. Always,同步写回:每个写命令执行完,立马同步地将日志写回磁盘;
2. Everysec,每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘;
3. No,操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘;

AOF 如何选择写回策略

1. 想要获得高性能,就选择 No 策略;
2. 如果想要得到高可靠性保证,就选择Always 策略;
3. 如果允许数据有一点丢失,又希望性能别受太大影响的话,那么就选择 Everysec 策略;

AOF日志过大的危害

AOF 是以文件的形式在记录接收到的所有写命令。随着接收的写命令越来越多,AOF文件会越来越大,所以注意AOF 文件过大带来的性能问题。
1. 文件系统本身对文件大小有限制,无法保存过大的文件;
2. 如果文件太大,之后再往里面追加命令记录的话,效率也会变低;
3. 如果发生宕机,AOF 中记录的命令要一个个被重新执行,用于故障恢复,如果日志文件太大,整个恢复过程就会非常缓慢,这就会影响到 Redis 的正常使用。

AOF 重写过程

1. 主线程 fork 出后台的bgrewriteaof 子进程,并把fork 会把主线程的内存(包含了最新数据)拷贝一份给 bgrewriteaof 子进程,子进程负责记入重写日志,fork子进程时,子进程是会拷贝父进程的页表,即虚实映射关系,而不会拷贝物理内存
2. 此时主线程并未阻塞,仍然可以接受请求,如果有写操作,Redis 会把这个操作写到AOF 日志的缓冲区,避免重写过程中宕机而造成的数据丢失。
3. 重写过程接受的写操作作也会被写到重写日志的缓冲区,等到拷贝数据的所有操作记录重写完成后,重写日志记录的这些最新操作也会写入新的 AOF 文件,以保证数据库最新状态的记录

AOF 重写的潜在风险

Redis采用fork子进程重写AOF文件时,潜在的阻塞风险包括:fork子进程 和 AOF重写过程中父进程产生写入bigkey的场景
1. fork子进程,fork这个瞬间一定是会阻塞主线程的。fork时并不会一次性拷贝所有内存数据给子进程,fork采用操作系统提供的写实复制(Copy On Write)机制,就是为了避免一次性拷贝大量内存数据给子进程造成的长时间阻塞问题,但fork子进程需要拷贝进程必要的 数据结构,其中有一项就是拷贝内存页表(虚拟内存和物理内存的映射索引表),这个拷贝过程会消耗大量CPU资源,拷贝完成之前 整个进程是会阻塞的,阻塞时间取决于整个实例的内存大小,实例越大,内存页表越大,fork阻塞时间越久。拷贝内存页表完成后, 子进程与父进程指向相同的内存地址空间,也就是说此时虽然产生了子进程,但是并没有申请与父进程相同的内存大小。那什么时候 父子进程才会真正内存分离呢?“写实复制”顾名思义,就是在写发生时,才真正拷贝内存真正的数据,这个过程中,父进程也可能会 产生阻塞的风险。
2. fork出的子进程指向与父进程相同的内存地址空间,此时子进程就可以执行AOF重写,把内存中的所有数据写入到AOF文件中。但是此 时父进程依旧是会有流量写入的。如果父进程操作的是一个已经存在的key,那么这个时候父进程就会真正拷贝这个key对应的内存数 据,申请新的内存空间,这样逐渐地,父子进程内存数据开始分离,父子进程逐渐拥有各自独立的内存空间。因为内存分配是以页为 单位进行分配的,默认4k,如果父进程此时操作的是一个bigkey,重新申请大块内存耗时会变长,可能会产阻塞风险。另外,如果操 作系统开启了内存大页机制(Huge Page,页面大小2M),那么父进程申请内存时阻塞的概率将会大大提高,所以在Redis机器上需要关 闭Huge Page机制。Redis每次fork生成RDB或AOF重写完成后,都可以在Redis log中看到父进程重新申请了多大的内存空间。

混合持久化(4.0)

Redis 4.0 中提出了一个混合使用 AOF 日志和内存快照的方法。简单来说,内存快照以一定的频率执行,在两次快照之间,使用 AOF 日志记录这期间的所有命令操作。

如何开启混合持久化

1.将save配置修改为以下格式,表示同时使用RDB和AOF持久化机制:
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

其中,appendonly配置为yes,表示开启AOF持久化机制;appendfilename配置AOF文件名,默认为appendonly.aof;appendfsync配置为每秒同步一次,也可以根据需求修改为always或no。

2.在redis.conf配置文件中添加以下配置,表示启用混合持久化机制:

aof-use-rdb-preamble yes
  1. 此配置表示在AOF文件开头加入RDB文件的内容,可以提高数据恢复的速度。

  2. 修改完配置后,保存文件并重启Redis服务器使配置生效。

混合持久化的好处

1. 快照不用很频繁地执行,这就避免了频繁 fork 对主线程的影响;
2. AOF日志也只用记录两次快照间的操作,就不会出现文件过大的情况了,也可以避免重写开销。

混合持久化的过程

1. T1 和 T2 时刻的修改,用 AOF 日志记录
2. 第二次全量快照时,可以清空 AOF 日志,此时数据都记录到快照中了,数据恢复时可以不依赖于日志了。

持久化的选择

1. 数据不能丢失时,内存快照和 AOF 的混合使用是一个很好的选择;
2. 如果允许分钟级别的数据丢失,可以只使用 RDB;
3. 如果只用 AOF,优先使用 everysec 的配置选项,因为它在可靠性和性能之间取了一个平衡

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pdf转成word | ppt | jpg图片,免费一键转换教程

我不允许真的还有人不知道如何免费将pdf转成 ppt、word 或者 jpg图片! 职场小伙伴是不是会经常遇到pdf怎么转成word,pdf怎么转成word,pdf怎么jpg图片等问题?别再为pdf转化格式难、而且还要付费而发愁了!这份pdf免费一…

Python OpenCV3 计算机视觉秘籍:6~9

原文:OpenCV 3 Computer Vision with Python Cookbook 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候&…

IDAPython入门基础语法

文章目录 参考文章IDAPython简介常用函数获取界面地址的函数数值获取函数数值判断函数patch操作函数去除花指令实例 参考文章 IDAPython入门教程 基于IDA7.5_Python3 第一讲 简介与地址获取 IDAPython简介 IDAPython拥有强大的功能,在使用IDA分析程序时非常有用,可以简化许多…

QT 插件通信接口调用 CTK开发(四)

CTK 为支持生物医学图像计算的公共开发包,其全称为 Common Toolkit。为医学成像提供一组统一的基本功能;促进代码和数据的交互及结合;避免重复开发;在工具包(医学成像)范围内不断扩展到新任务,而不会增加现有任务的负担;整合并适应成功的解决方案。 本专栏文章较为全面…

信息安全复习三:古典密码之设计好的密码算法

一.章节梗概 讨论以下算法,理解怎么设计好的密码算法的关键问题 1.Caesar cipher 2.单字母表密码 3.Playfairmima 4.维吉尼亚密码 5.自动生成密码 二.Caesar cipher 2.1 穷举攻击 穷举攻击定义:尝试所有密钥直到有一个合法密钥能够把密文还原成明文&…

Docker私有仓库Harbor搭建及使用

文章目录 一、Harbor简介二、Harbor仓库部署三、Harbor仓库使用 一、Harbor简介 官网地址:https://github.com/goharbor/harbor Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等…

如何在Web上实现激光点云数据在线浏览和展示?

无人机激光雷达测量是一项综合性较强的应用系统,具有数据精度高、层次细节丰富、全天候作业等优势,能够精确测量三维现实世界,为各个行业提供了丰富有效的数据信息。但无人机激光雷达测量产生的点云数据需要占用大量的存储空间,甚…

SpringSecurity之权限模块设计

目录 前言 实现思路 代码结构 使用说明 前言 前面我们了解了关于微服务权限设计方案以及J W T的相关介绍,今天我们来聊一下,如何避免自己重复的写相同的代码,一次代码实现,即可完美复制到任何项目中实现权限相关的功能。 实现…

RK3568平台开发系列讲解(驱动基础篇)SMP(Symmetrical Multi-Processing)

🚀返回专栏总目录 文章目录 一、linux SMP 和 AMP二、linux SMP的启动流程三、CPU的描述:cpumask四、CPU之间的关系沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 SMP(Symmetrical Multi-Processing)。 一、linux SMP 和 AMP 目前支持多核处理器的实时操…

CxImage学习使用1:环境搭建

目录 前言 一、CxImage相关介绍 二、编译源码 三、将CxImage使用到自己的工程中 前言 CxImage是一个可以用于MFC 的C图像处理类库类,它可以打开,保存,显示,转换各种常见格式的图像文件,比如BMP, JPEG, GIF, PNG, TI…

300元的蓝牙耳机什么牌子好?300内无线蓝牙耳机推荐

感受过无线的自在舒适后,越来越多的小伙伴爱上了蓝牙耳机白天出街更潇洒,目前市面上蓝牙耳机琳琅满目可选择性较多价格从几十、几百元到数千元不等然而蓝牙耳机的安全性、舒适性如何?连接稳吗?下面整理了几款300元价位的耳机分享给…

【CSDN周赛】第46期题解

👨‍💻个人主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 本文章收录于专栏 【CSDN周赛】 本篇文章目录 🌏一、吃吃吃🌸题目描述🌸题解 🌏二、n …

Java核心技术 卷1-总结-12

Java核心技术 卷1-总结-12 具体的集合链表数组列表 具体的集合 下表中除了以 Map结尾的类之外, 其他类都实现了 Collection 接口,而以 Map结尾的类实现了 Map 接口。 集合类型描述ArrayList一种可以动态增长和缩减的索引序列LinkedList一种可以在任何位…

MySQL高级篇——索引的创建与设计原则

导航: 【黑马Java笔记踩坑汇总】JavaSEJavaWebSSMSpringBoot瑞吉外卖SpringCloud黑马旅游谷粒商城学成在线牛客面试题 目录 一、索引的分类与使用 1.1 索引的分类 1.1.1. 普通索引 1.1.2. 唯一性索引 1.1.3. 主键索引(唯一非空) 1.1.4…

百度ai智能写作工具-百度ai自动写文章

百度AI智能写作工具:让创作更快捷、高效! 在当今竞争激烈的文化创意市场中,创作一篇高质量的文章需要投入大量时间和精力。然而,有了百度AI智能写作工具,创作变得更快捷、高效了。 百度AI智能写作工具采用最先进的人…

数据可视化神器!Matplotlib Python教程 | 从入门到精通绘制各种类型的图形和保存图形

大家好,我是爱吃熊掌的鱼,今天我要给大家带来一篇有趣开朗的Matplotlib Python教程。Matplotlib是Python中最流行的数据可视化库之一,它可以帮助我们将数据转化为易于理解的图表和图形。无论你是初学者还是专业人士,Matplotlib都是…

ThreadPoolExecutor源码阅读流程图

1.创建线程池 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), def…

巧用千寻位置GNSS软件| 线路施工放样应用技巧

线路施工放样主要是解决线路工程和水利工程施工中&#xff0c;线路及渠道中线和边坡施工放样编辑的专用程序。千寻位置GNSS软件中完成线路施工放样可按照下述步骤操作。 点击【测量】->【线路施工放样】&#xff0c;选择一条线路放样&#xff0c;如图 5.6-1所示。 图 5.6-1…

IT人员选择光缆的五大原因

基于铜和光纤的信号都会受到衰减&#xff0c;或者波形信号随着距离的推移而减弱。然而&#xff0c;光纤电缆可以在更长的距离上传输数据。事实上&#xff0c;差异是巨大的。 当构建需要长距离、高速和/或高带宽连接的网络时&#xff0c;毫无疑问&#xff1a;光纤电缆会赢得胜利…