面试笔记——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技术:

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

RDB(Redis DataBase)是Redis提供的一种持久化方式,其优缺点如下:

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

优点:

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

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

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

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

缺点:

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

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

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

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

综上所述,RDB持久化方式具有备份恢复效率高、适用于大规模数据、易于理解和操作等优点,但也存在可能造成数据丢失、IO开销较大、不适合频繁写入场景和不够实时等缺点。因此,在选择持久化方式时,需要根据具体的应用场景和需求来进行权衡和选择。

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.mzph.cn/news/756854.shtml

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

相关文章

基于单片机的农业智能节水灌溉系统设计

摘要:农业的发展状况一直以来都是我国重点关注的对象之一。在灌溉农作物的过程中人们大多会根据自己多年来的灌溉经验进行灌溉,这样的方式会花费大量的人力物力,还浪费大量的水资源。基于此,笔者基于单片机的智能节水灌溉系统的方法展开研究,设计了一款农业智能节水灌溉系…

Vue 计算属性和监视属性

Vue 计算属性和监视属性 computed computed 计算属性 规则: 用已有的属性计算不存在的属性默认调用一次get()只有值不发生改变的时候才可以使用简写(函数);值发生改变 使用对象式写法,才可以配置set()方法底层原理使…

[项目设计]基于websocket实现网络对战五子棋

项目介绍 该项目旨在实现一个网页端的在线五子棋,将实现登陆、好友、房间、对战、观战、聊天等功能 完成该项目需要了解C、数据库MySQL、基础前端HTML/CSS/JS/Ajax、网络协议WebSocket 项目源码:azhe1/online_gobang - 码云 - 开源中国 (gitee.com) …

GPT系列模型的特点

GPT系列模型(包括GPT-1、GPT-2和GPT-3)都基于自回归Transformer架构。在设计上,这些模型的核心思想是利用自回归机制来捕捉整个序列的上下文信息。GPT系列模型通过其独特的自回归架构逐步地整合整个序列的完整语义。 自回归机制:…

静态页面负载均衡

如有两个节点xxx.xx.xxx.123、xxx.xx.xxx.456, 一、tomcat组件负载均衡 部署后端服务,启动tomcat即可启动服务。如123和456的8080端口上均部署了myTest服务,使用upstream直接代理即可。 upstream myTest_upstream {server xxx.xx.xxx.123:8…

配电站房安全AI识别-智能化安全监控的革命---豌豆云

配电站作为现代社会生活和工业活动的能源枢纽,起着至关重要的作用。它们确保电力的稳定供应,支持医疗、交通、通讯等多个关键领域的运作。 然而,随着城市化进程加快和电力需求激增,旧有的监控系统已经难以跟上现代化电网的步伐。…

图论01-DFS和BFS(深搜和广搜邻接矩阵和邻接表/Java)

1.深度优先理论基础(dfs) dfs的两个关键操作 搜索方向,是认准一个方向搜,直到碰壁之后再换方向 换方向是撤销原路径,改为节点链接的下一个路径,回溯的过程。dfs解题模板 void dfs(参数) {if (终止条件) {存放结果;return;}for …

R语言实现多要素偏相关分析

偏相关分析是指当两个变量同时与第三个变量相关时,将第三个变量的影响剔除,只分析另外两个变量之间相关程度的过程,判定指标是相关系数的R值。 在GIS中,偏相关分析也十分常见,我们经常需要分析某一个指数与相关环境参…

网络基础知识-DNS与DHCP+网络规划与设计故障诊断+嵌入式系统设计师备考笔记

0、前言 本专栏为个人备考软考嵌入式系统设计师的复习笔记,未经本人许可,请勿转载,如发现本笔记内容的错误还望各位不吝赐教(笔记内容可能有误怕产生错误引导)。 本章的主要内容见下图: 本章知识和计算机…

MNN createSession 之创建流水线后端(四)

系列文章目录 MNN createFromBuffer(一) MNN createRuntime(二) MNN createSession 之 Schedule(三) MNN createSession 之创建流水线后端(四) MNN Session::resize 之流水线编码&am…

python sqlalchemy操作mysql密码包含@特殊字符报错的解决方案

from sqlalchemy import create_engine userName ‘root’ password ‘xxxx163’ dbHost ‘127.0.0.1’ dbPort 3306 dbName ‘robot’ DB_CONNECT f’mysqlpymysql://{userName}:{password}{dbHost}:{dbPort}/{dbName}?charsetutf8’ engine create_engine( DB_CON…

B站python爬虫课程笔记(Q16-)

下面是学习的网址: ​​​​​​【Python爬虫】 16、捕捉异常try&except语句的一些问题 1)一些常见的异常类型 IndexError索引错误ZeroDivisionError除零错误FileNotFindError找不到文件错误TypeError类型错误KeyError键错误ValueError值错误Ind…

「Linux系列」了解下Linux yum(包管理工具)

文章目录 一、yum简介二、yum语法1. 基本语法2. 常用选项(options) 三、yum常用命令1. 安装软件包2. 更新软件包3. 卸载软件包4. 搜索软件包5. 列出软件包6. 查看软件包信息7. 清理缓存8. 检查可用更新9. 自动应答yes案例代码案例1:安装Apach…

4.netsh wlan 查看无线网卡的属性?如何查看电脑支持WIFI5还是WIFI6?如何查看曾经电脑连过的WIFI密码呢?

目录 (1)netsh命令简介和用途 (2)netsh(针对网络接口)命令 1.netsh wlan set tracing mode=yes(开启无线追踪日志) 2.netsh wlan show drivers 查看电脑无线网卡属性(重点)支持WIFI6还是WIFI5

微信小程序 canvas层级过高覆盖原生组件

一、背景 微信小程序中使用signature第三方插件完成签名效果&#xff0c;但真机调试时发现canvas层级过高遮挡了按钮 二、具体问题 问题原因&#xff1a;签名后点击按钮无法生效 问题代码&#xff1a; <template><view class"sign_page" v-cloak>&l…

创建一个针对单个问题的GPT风格语言模型

标题&#xff1a;为单一问题创建类似GPT的语言模型 正文&#xff1a; 中国的研究人员开发了一种经济高效的方法&#xff0c;用于创建类似GPT-3的自然语言处理系统&#xff0c;同时避免了训练大规模数据集所需的时间和金钱成本——这一趋势日益增长&#xff0c;否则可能会将这…

51单片机学习笔记7 串转并操作方法

51单片机学习笔记7 串转并操作方法 一、串转并操作简介二、74HC595介绍1. **功能**&#xff1a;2. **引脚**&#xff1a;3. **工作原理**&#xff1a;4. 开发板原理图&#xff08;1&#xff09;8*8 LED点阵&#xff1a;&#xff08;2&#xff09;74HC595 串转并&#xff1a; 三…

Android Kotlin版封装EventBus

文章目录 Android Kotlin版封装EventBus代码封装添加依赖库定义消息类定义常量值定义注解定义工具类 使用在Activity中在Fragment中发送事件 源码下载 Android Kotlin版封装EventBus 代码封装 添加依赖库 implementation("org.greenrobot:eventbus:3.3.1")定义消息…

AIGC从入门到精通

目录 1. 概述 2. 一键起飞 2.1 webui 2.2 基础用法​​​ 2.3 必装插件 2.4 Stable Diffusion WebUI Forge 2.5 ComfyUI 2.6 Fooocus 2.7 diffusers 3 LoRA 3.1 原理 3.2 训练流程和准备 3.3 上手训练 4. 深入原理 4.1 使用教程 4.2 原理 4.3 训练阶段 4.4 …

蓝桥杯刷题|03普及-真题

[蓝桥杯 2017 省 B] k 倍区间 题目描述 给定一个长度为 N 的数列&#xff0c;​,,⋯&#xff0c;如果其中一段连续的子序列 ​,,⋯ (i≤j) 之和是 K 的倍数&#xff0c;我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗&#xff1f; 输入格式 …