当前位置: 首页 > news >正文

面试笔记——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各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。

相关文章:

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

双写一致 双写一致性: 当修改了数据库中的数据,也要更新缓存的数据,使缓存和数据库中的数据保持一致。 相关问题:使用Redis作为缓存,mysql的数据如何与Redis进行同步?——双写一致性问题 回答时&#xff0…...

【漏洞复现】科立讯通信指挥调度平台editemedia.php sql注入漏洞

漏洞描述 在20240318之前的福建科立讯通信指挥调度平台中发现了一个漏洞。该漏洞被归类为关键级别,影响文件/api/client/editemedia.php的未知部分。通过操纵参数number/enterprise_uuid可导致SQL注入。攻击可能会远程发起。 免责声明 技术文章仅供参考,任何个人和组织使…...

css的active事件在手机端不生效的解决方法

需求:需求就是实现点击图中的 “抽奖” 按钮,实现一个按钮Q弹的放大缩小动画 上面是实现的效果,pc端,点击触发 :active 问题:但是这种方式在模拟器上可以,真机H5一调试就没生效了,下面是简单…...

00. 认识 Java 语言与安装教程

认识 Java Java 在 20 多年发展过程中,与时俱进,为了适应时代的需要,经历过两次重大的版本升级,一个是 Java 5,它提供了泛型等重要的功能。另一个是提供了 Lambda 表达式等重要的功能的 Java 8。 一些重要的 Java 的…...

数据结构-栈-004

1链栈 1.1栈结点结构体定义 /*定义一个数据结构*/ typedef struct student {char name[32];char sex;int age; }DATA_TYPE;/*定义一个栈结点*/ typedef struct stack_node {DATA_TYPE data;//数据域struct stack_node *pnext;//指针域 }STACK_NODE;1.2栈顶结点结构体定义 /*…...

(第76天)XTTS 升级:11GR2 到 19C

参考文档: 11G - Reduce Transportable Tablespace Downtime using Cross Platform Incremental Backup (Doc ID 1389592.1)V4 使用跨平台增量备份减少可传输表空间的停机时间 (Doc ID 2940565.1)前言 XTTS(Cross Platform Transportable Tablespaces,跨平台迁移表空间)是…...

修改网站源码,给电子商城的商品添加图片时商品id为0的原因

修改网站源码,给电子商城的商品添加图片时商品id为0的原因。花了几个小时查找原因。后来,由于PictureControl.class.php是复制CourseControl.class.php而来,于是对比了这两个文件,在CourseControl.class.php找到了不一样的关键几条…...

ffmpeg开发异步AI推理Filter

ffmpeg开发异步AI推理Filter 1.环境搭建、推理服务及客户端SDK2.编译原版ffmpeg3.测试原版ffmpeg的filter功能4.准备异步推理filter5.修改点6.重新编译ffmpeg7.测试异步推理filter本文旨在阐述如何开发一个FFmpeg Filter,该模块利用gRPC异步通信机制调用远程视频处理服务。这一…...

python与excel第七节 拆分工作簿

一个工作簿中多个工作表拆分为多个工作簿 假设一个excle工作簿中有多个工作表,现在需要将每个工作表拆分为单独的工作簿。 例子: import xlwings as xw# 设置生成文件的路径path D:\\TEST\\dataIn# 源文件的路径workbook_name D:\\TEST\\dataIn\\产…...

JS08-DOM节点完整版

DOM节点 查找节点 父节点 <div class="father"><div class="son">儿子</div></div><script>let son = document.querySelector(.son)console.log(son.parentNode);son.parentNode.style.display = none</script>通过…...

【python】python3基础

文章目录 一、安装pycharm 二、输入输出输出 print()文件输出&#xff1a;格式化输出&#xff1a; 输入input注释 三、编码规范四、变量保留字变量 五、数据类型数字类型整数浮点数复数 字符串类型布尔类型序列结构序列属性列表list &#xff0c;有序多维列表列表推导式 元组tu…...

计算机三级网络技术 选择+大题234笔记

上周停去准备计算机三级的考试啦&#xff0c;在考场上看到题目就知道这次稳了&#xff01;只有一周的时间&#xff0c;背熟笔记&#xff0c;也能稳稳考过计算机三级网络技术&#xff01;...

智能合约 之 ERC-721

ERC-721&#xff08;Non-Fungible Token&#xff0c;NFT&#xff09;标准 ERC-721是以太坊区块链上的一种代币标准&#xff0c;它定义了一种非同质化代币&#xff08;Non-Fungible Token&#xff0c;NFT&#xff09;的标准。NFT是一种加密数字资产&#xff0c;每个代币都具有独…...

== 和 equals 的区别是什么?

和 equals() 在 Java 中都是用于比较两个对象&#xff0c;但它们之间存在显著的差异&#xff1a; 比较的内容&#xff1a; &#xff1a;这是 Java 中的基本比较运算符&#xff0c;对于基本数据类型&#xff08;如 int, char, double 等&#xff09;&#xff0c;它比较的是值&a…...

VUE:内置组件<Teleport>妙用

一、<Teleport>简介 <Teleport>能将其插槽内容渲染到 DOM 中的另一个位置。也就是移动这个dom。 我们可以这么使用它: 将class为boxB的盒子移动到class为boxA的容器中。 <Teleport to".boxA"><div class"boxB"></div> &…...

ruoyi-nbcio-plus后端里mapstruct-plus和lombok的使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…...

企业如何选择一个开源「好」项目?

开源 三句半​​​​​​​ 需求明确是关键 风险考量要周全 开源虽好不白捡 别忘合规&#xff01; 显然&#xff0c;开源已成为一股不可阻挡的洪流&#xff0c;企业拥抱开源&#xff0c;积极参与开源项目不仅是响应技术潮流的必然选择&#xff0c;更是实现自身技术创新、市场拓…...

c++算法学习笔记 (14) 并查集

1.合并集合 一共有 n 个数&#xff0c;编号是 1∼n&#xff0c;最开始每个数各自在一个集合中。 现在要进行 m 个操作&#xff0c;操作共有两种&#xff1a; M a b&#xff0c;将编号为 a 和 b 的两个数所在的集合合并&#xff0c;如果两个数已经在同一个集合中&#xff0c;…...

import * as的使用

import * as 是将一个模块的所有导出内容作为一个命名空间对象导入到当前模块中&#xff0c;其中 * 表示导入该模块中的所有导出内容&#xff0c;而 as 则用于指定导入的命名空间对象的名称。 例如&#xff1a;在 formatter 文件中有两个方法导出 const a () > {console.…...

微服务(基础篇-003-Nacos)

目录 Nacos注册中心&#xff08;1&#xff09; 认识和安装Nacos&#xff08;1.1&#xff09; Nacos快速入门&#xff08;1.2&#xff09; 服务注册到Nacos(1.2.1) Nacos服务分级存储模型&#xff08;1.3&#xff09; 配置集群&#xff08;1.3.1&#xff09; 根据集群修改…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...