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

news2024/11/15 6:57:12

双写一致

双写一致性: 当修改了数据库中的数据,也要更新缓存的数据,使缓存和数据库中的数据保持一致。
相关问题:使用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.coloradmin.cn/o/1537020.html

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

相关文章

携程旅行web逆向

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章…

List系列集合:ArrayList、LinkedList --java学习笔记

List系列集合 特点:有序、可重复、有索引 ArrayList:有序、可重复、有索引LinkedList:有序、可重复、有索引 List集合的特有方法 List集合因为支持索引,所以多了很多与索引相关的方法,当然,Collection的…

(附源码)基于Spring Boot与Vue的宠物用品销售系统设计与实现

前言 💗博主介绍:✌专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2024年Java精品实战案例《100套》 🍅文末获取源码联系🍅 &#x1f31…

如何使用人工智能和ChatGPT来优化营销转化率

人工智能 (AI) 和营销的交集正在彻底改变企业与客户互动的方式,最终改变营销转化率。人工智能能够分析大量数据、理解模式和自动执行任务,它不仅是一项创新技术,而且是营销领域的根本性转变。这种转变允许更加个性化、…

基于python+vue学生作业管理系统flask-django-nodejs-php

快速发展的社会中,人们的生活水平都在提高,生活节奏也在逐渐加快。为了节省时间和提高工作效率,越来越多的人选择利用互联网进行线上打理各种事务,然后线上管理系统也就相继涌现。与此同时,人们开始接受方便的生活方式…

【并发编程】并发并行,同步异步,线程安全,线程的几种状态并发三要素?创建线程的方法?线程间的通信方式?进程的通信方式?多线程的上下文切换?CAS 算法

目录 并发并行,同步异步,线程安全 线程的几种状态 并发三要素? 创建线程的方法? 线程间的通信方式? 进程的通信方式? 多线程的上下文切换? CAS 算法 并发并行,同步异步,线程…

CICD流水线(发布后端代码)!!!

1、新建流水线 2、添加流水线源 3、测试环节 4、构建上传 ①java构建上传 ②java镜像构建 5、部署 1、Docker部署 6、开启代码推送自动部署 ①开启自动部署 ②找到你代码提交的私有仓库 7、整体叙述 ①:新建流水线 ②:添加流水线源,选择代码…

python发艺美发店管理系统flask-django-php-nodejs

系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对发艺美发店管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…

(南京观海微电子)——LCD与OLED优缺点对比

屏幕区别 如何区分OLED屏幕和LCD屏幕? 我们可以通过简单的方式区分OLED屏幕和LCD屏幕,打开一部手机的相机,调整到专业模式,快门调到最高,然后对着点亮的屏幕观察,如果出现规则的条纹就是OELD屏幕&#xff…

基于多态的职工管理系统学习记录

职工管理系统 1、管理系统需求 公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责 普通员工职责:完成经理交给的任务 经理职责:完成老板交给的任务&#xff0c…

人脸表情识别系统项目完整实现详解——(二)使用SSD模型检测人脸

摘要:人脸检测是人脸表情识别系统中至关重要的一环,其准确性直接影响到整个系统的性能表现。本文介绍了使用SSD模型和OpenCV进行高效人脸检测的完整代码实现。我们详细介绍了SSD人脸检测器的工作原理,包括如何加载预训练的SSD模型&#xff0c…

【C++】1311. 分跳绳

问题:1311. 分跳绳 类型:基本运算、整数运算 题目描述: 学校新买来 m 根跳绳,每个班分 n 根,最多可以分给几个班的同学,还剩多少根?(m≥n)。 输入: 两个整…

【python绘图colorbar对齐】

[Toc]# 1、问题描述 python在绘图过程中,可能会出现colorbar高度与主图不匹配情况,需要进行调整,使得与主图高度对齐,使图像更美观。示例:colorbar位置高于主图 2、解决方法 通过调整shrink参数匹配对齐,pad调整x轴…

2024 年 AI 辅助研发趋势将更加强调智能化、自动化和个性化

目录 前言 AI辅助研发的技术进展 行业应用案例 医药行业 汽车行业 电子行业 面临的挑战与机遇 技术挑战 伦理问题 数据安全 机遇和解决方案 未来趋势预测 1. 深度融合AI与研发流程 2. 智能研发平台的崛起 3. 强化AI与人类智慧的融合 前言 当谈到人工智能&#xff…

台达变频通过Modbus转Profinet网关可以在环网冗余中使用

Modbus转Profinet网关(如XD-MDPN100)是一种能够实现Modbus协议与Profinet协议之间转换的设备。它支持Modbus RTU协议和Profinet协议还支持MRP环网冗余系统,,可以通过配置软件进行协议转换,使得原本只能使用Modbus协议的设备可以与…

禁止区域入侵检测

1. 物体检测 Object detection with deep learning and OpenCV In the first part of today’s post on object detection using deep learning we’ll discuss Single Shot Detectors and MobileNets. When combined together these methods can be used for super fast, real…

马蹄集oj赛(双周赛第二十三次)

目录 数列分割 小码哥的地毯 小码哥的三色墙 palace 高数考试 新全排列 黑白双煞 等差 数三角形 区间修改 相对马高 小码哥剪绳子 数列分割 难度:黄金 时间限制:1秒巴 占用内存:64 M 小码哥给你一个长度为n的数列,求将该数列分割成两个左右两个部分且两…

【CVTE 一面凉经Ⅰ】循环依赖如何解决

目录 一.🦁 开始前的废话二. 🦁 什么是循环依赖?三. 🦁Spring 容器解决循环依赖的原理是什么?五. 🦁 三级缓存解决循环依赖的原理六. 🦁 由有参构造方法注入属性的循环依赖如何解决?七.&#x…

【算法分析与设计】相同的树

题目 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示…

IDEA创建Maven项目实现数据库表查询

在此之前,务必确保你本地环境已经正确配置了 JDK 和 Maven,并且相关的环境变量已经设置。这是你踏上编程之旅的第一步,也是你与代码交互的基础。可通过命令提示符中输入 java -version 和 mvn -v 命令,以验证你的 JDK 和 Maven 是…