面试笔记——Redis(双写一致、持久化)

双写一致

双写一致性: 当修改了数据库中的数据,也要更新缓存的数据,使缓存和数据库中的数据保持一致。
相关问题:使用Redis作为缓存,mysql的数据如何与Redis进行同步?——双写一致性问题
回答时,根据不同的业务背景,分为高要求一致场景和允许延迟一致场景。

高要求一致业务场景

策略一: 在进行写操作时采用延迟双删策略 ,过程如图:
在这里插入图片描述
在执行更新操作之前,先进行一次删除缓存操作(删除旧数据),等数据库修改之后,再进行一次删除缓存操作(确保删除旧数据),降低脏数据的出现。
延时删除:由于数据库一般采取的是主从模式,当主节点的数据发生改变时,需要一定的时间等待其他的从结点完成数据同步,因此需要延时删除缓存。因此,延时的度也不好控制,延时双删策略仍会存在脏数据的风险

特点: 有脏数据风险,代码耦合性高

策略二: 采用互斥锁,如图所示:
在这里插入图片描述
由上图可见,无论是读、写操作都要进行加锁访问数据库,这会大大降低服务器的性能。但在实际应用中,存入缓存中的数据大都是读多写少型数据(若需要经常修改数据,不建议放入缓存,直接访问数据库效率更高),因此可以采用(由Redisson提供的)读写锁 进行控制。
共享锁:读锁readLock,加锁之后,其他线程可以共享读操作
排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作
如图:
在这里插入图片描述
特点: 保证了数据的强一致性,但性能低,适合高要求一致的业务场景。

允许延迟一致业务场景

策略一: 异步通知保证数据的最终一致性
在这里插入图片描述
当我们将修改数据写入到MySQL后,就会发送一条消息到MQ,在缓存服务模块监听MQ,最终更新缓存。该方式保证最终一致性的关键在于——保证MQ的可靠性。

策略二: 基于Canal(由阿里开源的数据库变更监听工具)的异步通知:
在这里插入图片描述
当有数据被写入数据库,会把数据库发生的变化记录到BINLOG(二进制日志)文件中(如DDL【数据定义语言】语句和DML【数据操纵语言】语句),但不包括数据查询语句(如,SELECT、SHOW)。当Canal监听到BINLOG发生变化,则会通知缓存进行数据更新。

持久化

持久化是指将数据保存在非易失性存储介质(如,磁盘、固态硬盘等),主要目的是保证数据的持久性,即使在系统系统关闭或重启之后,数据仍然能够被恢复访问。Redis采用了两种持久化方式——RDB和AOF,这两种方式可以分别或同时使用,以满足不同的需求。

  1. RDB(Redis Database Backup file,Redis数据备份文件,也称为Redis数据快照)持久化

    • RDB持久化是通过将Redis的数据集快照写入磁盘来实现的。它将当前内存中的数据状态保存到一个二进制文件(称为RDB文件)中,以便在Redis重启时进行恢复。
    • 命令执行:
      在这里插入图片描述
      ps:对主进程进行数据快照时,会阻塞其他进程执行,所以一般使用bgsave命令对子进程进行RDB,以上是主动备份的方式——即需要程序员手动备份。Redis提供了自动触发RDB的机制,可以通过redis.conf进行设置,如下:
      在这里插入图片描述
    • RDB持久化通常用于数据备份和恢复,因为它可以在较短的时间内创建一个全量的数据快照。
    • RDB持久化的缺点是可能会造成一定程度的数据丢失,因为它是周期性地生成快照,如果Redis服务器突然崩溃,可能会丢失最后一次快照后的所有数据变更。
  2. AOF持久化(Append Only File)

    • AOF持久化记录了Redis服务器接收到的所有写操作命令,以追加的方式写入一个日志文件(称为AOF文件)中。(ps:AOF默认是关闭,我们需要修改配置文件redis.conf来开启AOP。)
      # 是否开启AOF功能,默认是no
      appendonly yes
      # AOF文件的名称
      appendfilename "appendonly.aof"
      
      设置AOF的命令记录的频率:
      # 表示每执行一次写命令,立即记录到AOF文件
      appendfsync always 
      # 写命令执行完先放入AOF缓冲区,然后表示每隔1秒将缓冲区数据写到AOF文件,是默认方案
      appendfsync everysec 
      # 写命令执行完先放入AOF缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
      appendfsync no
      
      在这里插入图片描述
      一般在项目中采取everysec的方式。
      Redis也会在触发阈值时自动去重写AOF文件。阈值也可以在redis.conf中配置:
      # AOF文件比上次文件 增长超过多少百分比则触发重写
      auto-aof-rewrite-percentage 100
      # AOF文件体积最小多大以上才触发重写 
      auto-aof-rewrite-min-size 64mb 
      
    • AOF持久化可以保证更高的数据完整性,因为它记录了每个写操作命令,可以通过重新执行这些命令来恢复数据。
    • AOF持久化的缺点是日志文件可能会变得很大,因此Redis提供了一些压缩和重写机制来减小AOF文件的体积。
RDB的执行原理

采用bgsave方式:

  1. 快照生成

    • RDB持久化通过生成数据库的快照来保存数据。当满足一定条件时(例如在一定的时间间隔内,或者在达到一定的写入操作次数时),Redis会fork一个子进程,将当前内存中的数据集以及服务器状态保存到一个临时文件中。
  2. 写入临时文件

    • 在生成快照期间,Redis主进程会继续处理客户端的读写请求。而子进程则负责将数据库的快照写入到临时文件中,这个过程不会阻塞主进程的运行。
  3. 替换原有文件

    • 当子进程完成快照的生成后,Redis会用新生成的临时文件替换掉旧的RDB文件,从而完成持久化操作。在这个过程中,Redis会使用原子操作来确保数据的完整性。

在这里插入图片描述
在上图中,主进程通过页表与内存进行数据交互。当进行数据备份时,主进程会创建一个新的子进程来完成该项任务(创建一个子进程和复制页表的时间消耗很少,因此对主进程的影响也小)。在子进程中,仍然是通过从主进程中复制的页表来读取内存中的数据。在子进程进行数据备份时,主进程不会发生阻塞,因此主进程可能会进行写操作,为了避免出现脏数据,因此对主/子进程共享的区域进行了操作限制,在子进程备份期间,该区域只允许读操作。当主进程执行写操作时,则会拷贝一份数据,执行写操作(如,数据B)。当子进程完成数据快照猴,替换掉磁盘上的旧RDB文件,保存当前读取的数据为新的RDB文件

fork采用的是copy-on-write技术:

  • 当主进程执行读操作时,访问共享内存;
  • 当主进程执行写操作时,则会拷贝一份数据,执行写操作。

特点: 定时对整个内存做数据备份。

优点:

  1. 高效的备份和恢复:RDB持久化通过生成数据库的快照来保存数据,生成的快照文件通常比较紧凑,恢复速度快,适合用于数据备份和恢复。

  2. 适用于大规模数据:RDB持久化在生成快照时会fork一个子进程,生成快照的过程中,主进程可以继续处理客户端的读写请求,因此适用于大规模数据的场景。

  3. 易于理解和操作:RDB持久化生成的快照文件是一个二进制文件,相对于AOF持久化的操作日志文件来说,更容易理解和操作。

  4. 适用于灾难恢复:RDB持久化生成的快照文件可以存档在磁盘上,以备份的形式存储,可以用于灾难恢复和数据迁移。

缺点:

  1. 可能造成数据丢失:RDB持久化是周期性生成快照文件,因此在两次快照之间的数据变更可能会丢失,尤其是在Redis服务器突然崩溃时可能会丢失最后一次快照后的所有数据变更。

  2. IO开销较大:生成快照文件需要将整个数据集写入磁盘,因此可能会造成一定的IO开销,影响系统的性能。

  3. 不适合频繁写入场景:由于生成快照需要将整个数据集写入磁盘,因此对于频繁写入的场景,RDB持久化可能会导致较大的性能开销。

  4. 不够实时:RDB持久化是基于时间间隔或写入操作次数触发的,因此无法做到实时保存数据,可能会有一定的数据延迟。

AOF执行原理
  1. 写入操作记录

    • 当Redis接收到写入操作(如SET、DEL等)时,它将相应的写操作以追加(Append)的方式记录到AOF文件中,即将操作命令追加到AOF文件的末尾。
  2. 数据恢复

    • 在Redis重启时,会读取AOF文件中的操作记录,并按顺序重新执行这些写操作命令,以重建数据集的状态。

因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。
在这里插入图片描述
特点: 记录每次执行的写入操作命令。

优点:

  1. 数据完整性更好:AOF持久化记录了每个写操作的命令,因此可以更精确地恢复数据,减少数据丢失的可能性。

  2. 易于恢复:AOF文件中的操作记录是顺序写入的,因此在恢复数据时,只需要按顺序执行操作记录即可,恢复速度比较快。

  3. 可读性强:AOF文件中的写操作是以命令的形式记录的,易于人类阅读和理解。

缺点:

  1. 文件体积较大:AOF文件中记录了大量的操作命令,因此AOF文件的体积通常比较大,可能会占用较多的磁盘空间。

  2. 写入性能较差:由于AOF持久化需要将每个写操作追加到文件末尾,因此可能会造成文件的频繁写入,影响了写入性能。

  3. 数据恢复耗时:由于AOF文件体积较大,重启时需要读取并执行整个AOF文件中的操作记录,因此在数据恢复时可能会花费较长的时间。

RDB与AOF对比

在这里插入图片描述
RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

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

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

相关文章

五、分布式锁-redission

源码仓库地址:gitgitee.com:chuangchuang-liu/hm-dingping.git 1、redission介绍 目前基于redis的setnx特性实现的自定义分布式锁仍存在的问题: 问题描述重入问题同一个线程无法多次获取统一把锁。当方法A成功获取锁后,调用方法B&#xff0…

说说webpack中常见的Loader?解决了什么问题?

文章目录 一、是什么配置方式 二、特性三、常见的loadercss-loaderstyle-loaderless-loaderraw-loaderfile-loaderurl-loader 参考文献 一、是什么 loader 用于对模块的"源代码"进行转换,在 import 或"加载"模块时预处理文件 webpack做的事情…

【JS】如何避免输入中文拼音时触发input事件

现有一段代码&#xff0c;监听input事件。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" con…

自动驾驶感知新范式——BEV感知经典论文总结和对比(一)

自动驾驶感知新范式——BEV感知经典论文总结和对比&#xff08;一&#xff09; 博主之前的博客大多围绕自动驾驶视觉感知中的视觉深度估计&#xff08;depth estimation&#xff09;展开&#xff0c;包括单目针孔、单目鱼眼、环视针孔、环视鱼眼等&#xff0c;目标是只依赖于视…

elment-ui el-tabs组件 每次点击后 created方法都会执行2次

先看错误的 日志打印: 错误的代码如下: 正确的日志打印: 正确的代码如下: 前言: 在element-ui的tabs组件中,我们发现每次切换页面,所有的子组件都会重新渲染一次。当子页面需要发送数据请求并且子页面过多时,这样会过多的占用网络资源。这里我们可以使用 v-if 来进行…

数据结构面试常见问题之串的模式匹配(KMP算法)系列-大师改进实现以及原理

&#x1f600;前言 KMP算法是一种改进的字符串匹配算法&#xff0c;由D.E.Knuth&#xff0c;J.H.Morris和V.R.Pratt提出的&#xff0c;因此人们称它为克努特—莫里斯—普拉特操作&#xff08;简称KMP算法&#xff09;。KMP算法的核心是利用匹配失败后的信息&#xff0c;尽量减少…

Jackson 2.x 系列【2】生成器 JsonGenerator

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-seata-demo 文章目录 1. 前言2. 案例演示2.1 创建 JsonFactory2.2 创建 JsonGenerator2.3 写入操作2.4 查…

stm32使用定时器实现PWM与呼吸灯

PWM介绍 STM32F103C8T6 PWM 资源&#xff1a; 高级定时器&#xff08; TIM1 &#xff09;&#xff1a; 7 路 通用定时器&#xff08; TIM2~TIM4 &#xff09;&#xff1a;各 4 路 例如定时器2 PWM 输出模式&#xff1a; PWM 模式 1 &#xff1a;在 向上计数 时&#xff0…

GETSHELL方法总结上

渗透的总步骤 1.信息收集找到弱漏洞 2.漏洞挖掘 漏洞验证 3.有一定权限 getshell 4.提权后---渗透 5.内网渗透】 前后台拿shell方法汇总 接下来我们实操一波dedecms也就是织梦cms 如果你们的靶场是空白的 可能是php版本 我们修改为5.2 可能是源码问题 我们不要急着上传…

c++常考基础知识(2)

二.c关键字 关键字汇总 c中共有63个关键字&#xff0c;其中包括int&#xff0c;char&#xff0c;double等类型关键字&#xff0c;if&#xff0c;else&#xff0c;while&#xff0c;do&#xff0c;等语法关键字&#xff0c;还有sizeof等函数关键字。 三.数据结构 1.数组&#x…

【算法】小强爱数学(迭代公式+数论取模)

文章目录 1. 问题2. 输入3. 输出4. 示例5. 分析6. 思路7. 数论&#xff0c;取模相关公式8. 数论&#xff0c;同余定理9. 代码 1. 问题 小强发现当已知 x y B xyB xyB以及 x y A xyA xyA时,能很轻易的算出 x n x_ {n} xn​ y n y_ {n} yn​ 的值.但小强想请你在已知A和B的…

数据结构(五)——树森林

5.4 树和森林 5.4.1 树的存储结构 树的存储1&#xff1a;双亲表示法 用数组顺序存储各结点&#xff0c;每个结点中保存数据元素、指向双亲结点(父结点)的“指针” #define MAX_TREE_SIZE 100// 树的结点 typedef struct{ElemType data;int parent; }PTNode;// 树的类型 type…

【Mysql】硬盘性能压测(Sysbench工具)

1、IOPS和吞吐量介绍 IOPS&#xff08;每秒输入/输出操作数&#xff09;&#xff1a;是衡量存储设备每秒能够执行的输入/输出操作的数量。对于数据库等需要频繁读写的应用程序而言&#xff0c;IOPS 是一个关键的性能指标。更高的 IOPS 意味着存储设备能够处理更多的读写请求&am…

【Vue】三、使用ElementUI实现图片上传

目录 一、前端代码实现 二、后端代码实现 三、调试效果实现 一、前端代码实现 废话不多说直接上代码 <el-form-item prop"image" label"上传图片" v-model"form.image"><el-upload:action"http://localhost:8…

基于springboot+vue的智慧生活商城系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Stable Diffusion 本地训练端口与云端训练端口冲突解决办法

方法之一&#xff0c;修改本地训练所用的端口 1 首先&#xff0c;进入脚本训练器的根目录 例如&#xff1a;C:\MarkDeng\lora-scripts-v1.7.3 找到gui.py 2 修改端口号 因为云端训练器也是占用28000和6006端口 那么本地改成27999和6007也是可以的 保存退出&#xff0c;运行启动…

如何在C语言中使用命令行参数

C语言文章更新目录 C语言学习资源汇总&#xff0c;史上最全面总结&#xff0c;没有之一 C/C学习资源&#xff08;百度云盘链接&#xff09; 计算机二级资料&#xff08;过级专用&#xff09; C语言学习路线&#xff08;从入门到实战&#xff09; 编写C语言程序的7个步骤和编程…

【C++】关联式容器——map和set

1 关联式容器 STL中我们常用的部分容器&#xff0c;比如&#xff1a;vector、list、deque、forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。 那什么是关联式容器呢&#xff1f;它与序…

阿里云服务器2核4G服务器收费价格表,1个月和一年报价

阿里云2核4G服务器多少钱一年&#xff1f;2核4G服务器1个月费用多少&#xff1f;2核4G服务器30元3个月、85元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

JAVA面向对象编程 JAVA语言入门基础

类与对象的概念 类 (Class) 和对象 (Object) 是面向对象程序设计方法中最核心的概念。 类是对某一类事物的描述(共性)&#xff0c;是抽象的、概念上的定义&#xff1b;而对象则是实际存在的属该类事物的具体的个体&#xff08;个性&#xff09;&#xff0c;因而也称为实例(In…