深入思考redis面经

1 redission分布式锁

1.1 为了保证数据一致性,引入了redission的锁,你是为了抗住高并发而去为了引入这个锁还是说为了保证数据一致性去引入的

答:主要是为了抗住高并发问题,解决redis的缓存击穿问题,但是也能解决一定的数据一致性问题。

是的,当我们谈到“击穿”问题时,通常指的是缓存击穿,即当某个热点缓存失效时,大量的请求直接涌向底层存储系统(如数据库),可能导致该系统过载。

在这种情况下,引入 Redission 的分布式锁主要是为了抗住这种高并发,即防止大量请求直接涌向底层系统。具体做法是,当缓存失效时,第一个到达的请求获取锁并重新加载数据到缓存,而其他并发请求则需要等待该请求完成数据加载和缓存更新。一旦数据被加载回缓存,那么后续的请求就可以直接从缓存中获取,而不必再次访问底层系统。这样,即使有大量的并发请求,也只有少数请求真正访问底层系统,从而避免了系统过载的问题。

所以,确实,对于缓存击穿问题,引入 Redission 的分布式锁主要是为了应对高并发,保护底层存储系统不被过度访问。

1.2 为了应对缓存击穿,使用redission分布式锁,这里redission有对一致性上起作用吗

为了应对缓存击穿,使用 Redission 分布式锁是为了确保在缓存失效时,只有一个请求去加载数据并更新缓存,防止底层数据库被大量并发请求压垮。但这里的一致性问题也是相关的,尤其是确保正确的数据被加载到缓存中。

在这种场景下,Redission 的作用在一致性上体现在:

  1. 单点加载:分布式锁确保在某一时刻只有一个请求(或一个服务实例)能够去加载数据。这避免了不同的请求可能在微小时间差异内加载到不同版本的数据,并都尝试去更新缓存的情况。例如,考虑一个场景,在某个请求加载数据的过程中,数据在数据库中被修改,紧随其后的另一个请求可能会加载到新版本的数据。如果没有分布式锁,两个请求可能都会尝试更新缓存,导致缓存中的数据在短时间内频繁切换。

  2. 减少竞态条件:没有分布式锁的情况下,多个请求可能会并发地检测到缓存失效,并尝试从数据库加载数据并更新缓存。这可能会导致竞态条件,从而导致不可预测的结果。引入锁后,请求会按照顺序执行,消除了竞态条件,确保数据加载和缓存更新的操作是原子的。

综上所述,Redission 分布式锁在处理缓存击穿的问题时,不仅帮助我们抗住高并发,还确保了数据的一致性。

2 美团二面:Redis与MySQL双写一致性如何保证

美团二面:Redis与MySQL双写一致性如何保证

2.1 你引入缓存后,可以预减库存,那现在引入了一个新的问题,mysql和redis数据的一致性,你是如何保证的

答:库存回退时,就涉及到这个mysql和redis的多级库存回退问题,库存回退涉及到用户取消订单场景,一般是先更新数据库的商品表,然后再删除缓存;另一种策略是先使用redis延时双删的方法。

2.2 有三种经典的缓存模式:Cache-Aside Pattern,Read-Through/Write through,Write behind,这三个经典的缓存模式,能给我讲出几个应用场景吗

当然可以。这三种经典的缓存模式都有其独特的应用场景,下面我将为您概述这些模式并给出各自的应用场景:

  1. Cache-Aside Pattern (旁路缓存模式)

    • 描述:应用程序代码负责维护缓存。当读取数据时,首先查询缓存。如果缓存中不存在所需数据,则从数据存储中加载数据,然后将数据添加到缓存中。当数据被修改时,首先在数据存储中更新数据,然后使缓存中的数据失效或删除。
    • 应用场景
      • 当缓存填充成本很高时(例如,数据需要从多个源进行聚合或进行复杂的计算),这样只有真正需要的数据才被加载到缓存。
      • 当系统可以容忍短暂的数据不一致性时,例如社交媒体帖子或评论的显示。
  2. Read-Through/Write-Through (读穿/写穿模式)

    • 描述:这是自动化的缓存模式。当应用请求某个数据项时,如果数据不在缓存中,则缓存组件会自动从数据存储中加载该数据,然后将其放入缓存。对于写操作,应用程序将数据写入缓存,缓存组件负责将数据同步写入数据存储。
    • 应用场景
      • 当需要确保缓存和数据存储之间始终保持一致性时,例如,关键业务系统或金融系统。
      • 当你希望为应用开发者提供透明的缓存管理,使他们无需关心缓存维护的细节。
  3. Write-Behind (写后模式)

    • 描述:当应用程序写入数据到缓存时,数据首先写入缓存,并且返回成功,后续由缓存组件异步地将修改的数据同步到数据存储。这可以将多个写操作合并为一个,优化数据存储的写入。
    • 应用场景
      • 日志记录系统,当你希望快速响应写入请求,而真正的持久化操作可以稍后进行。
      • 当对数据存储的实时性要求不高,但要求提供快速的写入响应。
      • 在批处理操作中,例如,统计或分析系统中的数据聚合。

这三种模式都有其适用的场景,选择哪种模式取决于应用的需求和特点。一些现代的缓存解决方案(如 Redis、Memcached、Hazelcast 等)支持这些模式,可以根据需求进行配置使用。

2.3 那这里的读写穿透模式,为什么能保证缓存和数据库之间始终保持一致呢?

读穿/写穿模式能够保持缓存和数据库之间的一致性主要是因为它的工作方式:

  1. Read-Through(读穿)

    • 当应用程序请求一个数据项,并且该数据项不在缓存中时,缓存系统会自动从底层的数据存储(如数据库)加载数据。
    • 加载后,该数据项被存储在缓存中,并返回给应用程序。
    • 这确保了每当数据项不在缓存中时,都会从持久化的数据源中加载最新的数据。
  2. Write-Through(写穿)

    • 当应用程序更新一个数据项时,这个更新不仅仅应用于缓存,而且立即同步到底层的数据存储。
    • 由于写操作同时影响缓存和数据存储,因此保证了两者之间的数据一致性。

这种方式的核心在于,所有的读写操作都通过缓存进行,并且缓存负责与底层数据存储的所有交互,这就确保了两者之间的数据一致性。

需要注意的是,这种一致性是在单个操作级别上的。也就是说,每一个单独的读或写操作都确保数据在缓存和数据存储之间保持一致。然而,在高并发的环境下或在分布式系统中,仍然可能会遇到其他类型的一致性挑战,例如:网络分区、数据库的事务冲突等。这就需要其他的解决方案,如分布式锁、事务控制等来进一步保证一致性。

2.4 读穿和写穿都是一个同步阻塞的过程,所以能够保证一致性是吗

是的,读穿和写穿都是同步阻塞的过程。这意味着当你执行一个操作时,它会等待直到操作完成,才返回结果。因为它是同步的,所以在单次操作中,缓存和数据库之间可以保持数据一致性。

2.5 写穿场景下,是先更新缓存再更新数据库吗还是相反

在写穿模式下,当应用程序更新数据时,通常的流程是先更新数据库,然后更新缓存。这样做的原因是:数据库是数据的持久存储,首先确保数据被成功保存在数据库中是很重要的。一旦数据成功写入数据库,缓存才会被更新。这种策略可以确保如果在更新过程中发生任何错误(例如,由于网络问题),数据至少已经被保存在数据库中,而缓存可能仍然保持旧值。如果缓存首先被更新,然后在尝试更新数据库时出现错误,你会面临缓存和数据库之间的不一致性问题。

2.6 因为写穿是通过一个抽象层来完成的,所以对于“先更新数据库后更新缓存”导致的数据不一致问题,这个抽象层是如何解决的

在写穿模式中,确实有一个抽象层(通常是缓存中间件或框架)来协助处理缓存与数据存储之间的交互。这个抽象层的设计是为了最大程度地确保数据一致性。

以下是如何处理“先更新数据库后更新缓存”中可能出现的数据不一致性问题:

  1. 原子性:这个抽象层会尝试将更新数据库和更新缓存的操作视为一个原子操作。也就是说,两个操作要么都成功,要么都失败。如果更新数据库成功,但更新缓存失败,通常会有重试机制来确保缓存最终得到更新。

  2. 错误处理:如果在更新数据库后、更新缓存之前发生错误(例如由于网络问题),抽象层会有错误处理机制。这可能包括重试、回滚数据库操作、记录错误以供后续处理等。

  3. 失效策略:在某些情况下,如果缓存更新失败,抽象层可能选择简单地使该缓存条目失效。这样,下次当应用程序请求这个数据时,因为它不在缓存中,系统会采用读穿策略,从数据库中加载最新的数据并更新缓存。

  4. 延迟写入:在某些实现中,可能会有一种延迟写入策略,允许先更新缓存,然后异步地更新数据库。但这种方法不是严格的写穿策略,它更接近写后模式,并带有其自身的一致性挑战。

  5. 日志和监控:这个抽象层通常会有详细的日志和监控功能,以便于跟踪所有操作,包括成功和失败的操作。这对于后续的问题诊断和数据修复都很有帮助。

尽管有上述策略,但没有一个系统可以保证100%的数据一致性,特别是在分布式环境中。因此,设计时应考虑到这些挑战,并尽量确保系统的韧性和恢复能力。

2.7 针对下面这个“先更新数据库后更新缓存导致不一致”例子,抽象层是如何解决的

此外,你这个还存在一个问题是脏数据问题:
线程A先发起一个写操作,第一步先更新数据库
线程B再发起一个写操作,第二步更新了数据库
由于网络等原因,线程B先更新了缓存
线程A更新缓存。
这时候,缓存保存的是A的数据(老数据),数据库保存的是B的数据(新数据),数据不一致了,脏数据出现啦。如果是删除缓存取代更新缓存则不会出现这个脏数据问题。

您描述的确实是一个经典的脏数据问题。为了解决这类问题,通常需要采取以下策略或结合使用这些策略:

  1. 分布式锁:通过使用分布式锁,可以确保在任何时候都只有一个线程能够执行写操作。在上述情境中,如果线程A获取了锁并开始执行写操作,那么线程B会等待,直到线程A完成所有的操作(包括更新数据库和缓存)并释放锁。

  2. 版本号或时间戳:为数据添加版本号或时间戳可以帮助确定写操作的顺序。例如,当线程A和线程B都试图更新缓存时,它们会检查自己手头上的数据版本号或时间戳与缓存中的数据进行比较。只有具有最新版本号或时间戳的线程才能更新缓存。

  3. 先失效缓存:如您所述,另一种策略是不直接更新缓存,而是简单地使其失效。这样,下一次读取该数据时,会导致缓存未命中,然后系统会从数据库加载最新数据。这种方法减少了脏数据问题,但可能会增加读取的延迟,因为需要频繁地从数据库加载数据。

  4. 队列或事件日志:可以使用队列或事件日志来确保按正确的顺序处理写操作。写操作首先被放入队列或日志,并且按照它们到达的顺序被处理。这可以确保即使线程B的写操作在线程A之后到达,它也不会在线程A之前被处理。

  5. 重试和回滚策略:在某些情况下,如果发现脏数据或不一致的数据,系统可能会采取重试或回滚策略。例如,如果线程A在试图更新缓存时发现数据已经被线程B更改,它可能会选择回滚自己在数据库中的更改。

  6. 监听数据变更:某些系统会使用监听器或订阅者模式来监视数据变更,当数据在数据库中发生变更时,监听器会自动更新或失效缓存。

综上所述,确保缓存和数据库之间的数据一致性是一个复杂的问题,通常需要综合使用多种策略和技术来处理。选择哪种策略取决于系统的需求、预期的工作负载以及可接受的延迟和一致性等级。

2.8 删除redis缓存,造成对业务代码入侵严重怎么办

取biglog异步删除缓存
重试删除缓存机制还可以,就是会造成好多业务代码入侵。其实,还可以通过数据库的binlog来异步淘汰key。
在这里插入图片描述
以mysql为例 可以使用阿里的canal将binlog日志采集发送到MQ队列里面,然后通过ACK机制确认处理这条更新消息,删除缓存,保证数据缓存一致性

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

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

相关文章

Vue系列之入门篇

前言: 目录 一,关于Vue的简介 1.什么是Vue? 2.使用Vue框架的好处? 3. 库和框架的区别: 4. MVVM的介绍 5.Vue的入门案例 二,Vue的生命周期 一,关于Vue的简介 1.什么是Vue? Vu…

YSA Toon (Anime/Toon Shader)

这是一个Toon着色器/Cel阴影着色器,用于Unity URP 此着色器的目的是使角色或物体阴影实时看起来尽可能接近真实的动画或卡通效果 可以用于游戏,渲染,插图等 着色器特性,如:面的法线平滑、轮廓修复、先进的边缘照明、镜面照明、完全平滑控制 这个文档包括所有的功能https:/…

【数据结构前置知识】初识集合框架和时间,空间复杂度

文章目录 1. 什么是集合框架2. 集合框架的重要性 3. 背后所涉及的数据结构以及算法3.1 什么是数据结构3.2 容器背后对应的数据结构3.3 相关java知识3.4 什么是算法 4.时间复杂度1. 如何衡量一个算法的好坏2. 算法效率3. 时间复杂度3.1 时间复杂度的概念3.2 大O的渐进表示法3.3 …

在项目中,关于前端实现数据可视化的技术选择

前言 在项目中,数据可视化以图表、报表类型为主。 需求背景 技术框架是Vue2.x版本,组件库是Ant Design of Vue能够支撑足够多的图表类型开发图表大小/位置能够随意变动图表样式需要支持丰富多样的用户配置强大、开放的图表语法支持复杂的数据可视化场景…

内网IP端口提供外网连接访问?快解析动态域名与内网映射P2P穿透方案

我们在本地搭建服务器及发布互联网时,可以通过动态域名的方式联网。DDNS原理是用固定的域名代替变化IP,实现局域网发布公网,是适合本地动态IP环境的使用。但当本地没有公网IP时,如果解析绑定到内网IP,将内网IP端口提供…

坑爹,线上同步近 3w 个用户导致链路阻塞引入发的线上问题,你经历过吗?

分享一个印象深刻的线上问题,希望能够给 xdm 带来一点思考 一个稀松平常的工作日,正准备下班的时候,不巧,突发线上紧急问题,心中一万个不情愿,可还是要硬着头皮去定位问题 简单的表象为微服务之间 gRPC通…

Linux:Centos9 《下载-安装》

下载 Download (centos.org)https://www.centos.org/download/ 安装 选择第一个安装centos 根据自己需要的语言环境选择即可 这里选择要安装的磁盘,然后点击完成 这里选择第一个就行带有图形化 然后我们去对这两个进行设置就行 这两个地方自己进行设置就行 耐心等…

Firefox火狐浏览器显示你的连接不安全,是什么意思?

当 Firefox 连接到一个安全的网站时(网址最开始为“https://”),它必须确认该网站出具的证书有效且使用足够高的加密强度,以充分保护您的隐私。如果证书无法通过验证,或加密强度过低,Firefox 会中止连接到这…

Android 系统中适配OAID获取

一、OAID概念 OAID(Open Anonymous Identification)是一种匿名身份识别标识符, 用于在移动设备上进行广告追踪和个性化广告投放。它是由中国移动通信集 团、中国电信集团和中国联通集团共同推出的一项行业标准 OAID值为一个64位的数字 二、…

认识数据分析

文章目录 1. 认识数据分析1.1 数据自身的三大属性1.2 建数仓 数据分析的工程技术1.3 数据分析解决问题的原理1.4 数据分析的具体流程1.5 数据的中心化和智能化1.6 数据分析的四种类型和六个方向 1. 认识数据分析 1.1 数据自身的三大属性 客观:用数字衡量和表现一件…

C语言 —— 初步入门知识(选择与循环语句、函数、数组、操作符、关键字和#define)

本篇文章将接着上篇继续介绍C语言的基础知识,使读者对C语言能够有一个大概的认识. 不会细写每一个知识点, 但是能够入门C语言, 进行初步的C语言代码阅读. 1. 选择语句 假设你要决定是否出门玩耍,如果天气晴朗,你就出门;如果天气不…

如何实现不同MongoDB实例间的数据复制?

作为一种Schema Free文档数据库,MongoDB因其灵活的数据模型,支撑业务快速迭代研发,广受开发者欢迎并被广泛使用。在企业使用MongoDB承载应用的过程中,会因为业务上云/跨云/下云/跨机房迁移/跨地域迁移、或数据库版本升级、数据库整…

详解混合类型文件(Polyglot文件)的应用生成与检测

1. 引入 混合类型文件(Polyglot文件),是指一个文件,既可以是合法的A类型,也可以是合法的B类型。 比如参考3中的文件,是一个html文件,可以用浏览器正常打开;它也是一个一个.jar文件&…

vue项目打包时如何将静态文件打包到一个单独的文件夹

在Vue项目中,你可以使用Webpack的配置来实现将静态文件打包到一个单独的文件夹。下面是一种常见的方法: 在Vue项目的根目录下,创建一个名为static的文件夹(如果还没有)。这个文件夹将用于存放静态文件。在vue.config.j…

【C++技能树】手撕AVL树 --插入与旋转详解

Halo,这里是Ppeua。平时主要更新C,数据结构算法,Linux与ROS…感兴趣就关注我bua! 文章目录 0.平衡搜索二叉树概念0.1 平衡因子 1.插入1.1 普通插入操作1.2更新平衡因子 2.旋转2.1 左单旋2.2 右单旋2.3 右左双旋2.4 左右双旋 3. 旋…

openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据

文章目录 openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据 openGauss学习笔记-71 openGauss 数据库管理-创建和管理普通表-删除表中数据 在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。 SQL不…

Nodejs 第十六章(ffmpeg)

FFmpeg 是一个开源的跨平台多媒体处理工具,可以用于处理音频、视频和多媒体流。它提供了一组强大的命令行工具和库,可以进行视频转码、视频剪辑、音频提取、音视频合并、流媒体传输等操作。 FFmpeg 的主要功能和特性: 格式转换:…

还没用熟 TypeScript 社区已经开始抛弃了

根据 rich-harris-talks-sveltekit-and-whats-next-for-svelte 这篇文章的报道, Svelte 计划要把代码从 TS 换到 JS 了。 The team is switching the underlying code from TypeScript to JavaScript. That and the update will then allow the team to incorporate…

边缘计算AI智能安防监控视频平台车辆违停算法详解与应用

随着城市车辆保有量呈现高速增长趋势,交通拥堵、违章行为也日益泛滥。因为车辆未停放在指定区域导致的车位浪费、占用/堵塞交通要道、车辆剐蹭等问题层出不穷。通过人工进行违法停车的监控,不仅让监控人员工作负荷越来越大,而且存在发现不及时…

第18章_瑞萨MCU零基础入门系列教程之GPT

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写,需要的同学可以在这里获取: https://item.taobao.com/item.htm?id728461040949 配套资料获取:https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总: ht…