首页 > 数据库 >金三银四面试题(二):数据库缓存的数据一致性

金三银四面试题(二):数据库缓存的数据一致性

时间:2024-03-24 11:58:41浏览次数:27  
标签:缓存 试题 删除 Redis 更新 MySQL 金三银 数据

这也是一道非常经典的面试题。可以查到它在很多面经中都出现过。还有一个比较的具体问法其实是:如何保证MySQL和Redis的数据一致性?

什么是数据一致性

例如将Redis用作MySQL数据的缓存时,由于数据在MySQL中的变更,导致Redis中的缓存数据与实际数据不一致的情况。这种不一致可能会导致应用程序读取到过期、错误或者不完整的数据,从而影响系统的正确性和可靠性。

解决方案

方案0:同步更新(删除)

在介绍解决方案之前,我们想一想正常的业务流程如何做的,无非是先更新A再更新B(这里的AB无所谓,可能先更新缓存,也可以先更新数据库),但是这个方案有问题。

想想一下的情形:两个请求分别对同一数据进行更改。请求 A、B 都是先写 MySQL,然后再写 Redis,由于某些原因,如果请求 A 在写MySQL之后写 Redis 之前间隔了一段时间,在此期间请求 B 已经依次完成对MySQL和Redis的更新,就会造成下面的问题。

同样先删除Redis,再写MySQL,再写Redis也是同样的道理。因为我们无法保证上述操作的原子性。

方案1:延迟双删

  • 1.先删除缓存数据
  • 2.更新数据库数据
  • 3.等待一小段时间
  • 4.再次删除缓存数据

但是这种方法仍然有问题,因为我们无法保证更新请求的第二次删除一定发生在读请求的回写缓存之后。如同下图所示,这样缓存中就存在脏数据

方案2:异步监听binlog+删除重试机制

  • 1.更新数据库
  • 2.监听binlog删除缓存
  • 3.缓存删除失败则通过MQ不断重试,直至成功

唯一的问题就在于异步删除的脏数据时间窗口较大,而且要求查询的请求不会回写Redis。

总结

在满足实时性的条件下,不存在两者完全保存一致的方案,只有最终一致性方案:先写 MySQL,通过 Binlog,异步更新 Redis,可以通过 Binlog,结合消息队列异步更新 Redis。

标签:缓存,试题,删除,Redis,更新,MySQL,金三银,数据
From: https://blog.csdn.net/weixin_45700531/article/details/136985028

相关文章

  • 【CSP试题回顾】202303-2-垦田计划(优化)
    CSP-202303-2-垦田计划关键点:二分查找在这个问题中,有一系列的田地需要在特定的时间tit_iti......
  • 清除VS2022设计器缓存,解决C盘空间不足的问题
    笔者开发使用的一台老旧笔记本C盘只有100G,C盘剩余空间经常不足1G。通过使用磁盘空间扫描工具WizTree发现C盘下面VS2022设计器缓存目录占用了2.2G空间,具体位置在C:\Users\admin\AppData\Local\Microsoft\VisualStudio\17.0_e87c7827\Designer\Cache其中admin是我当前用户名,17.......
  • Java面试题:用Java并发工具类,实现一个线程安全的单例模式;使用Java并发工具包和并发框架
    面试题一:设计一个Java并发工具类,实现一个线程安全的单例模式,并说明其工作原理。题目描述:请设计一个Java并发工具类,实现一个线程安全的单例模式。要求使用Java内存模型、原子操作、以及Java并发工具包中的相关工具。考察重点:对Java内存模型的理解。对Java并发工具包的了......
  • 使用两级缓存框架 J2Cache
    J2Cache是OSChina目前正在使用的两级缓存框架(要求至少Java8)。第一级缓存使用内存,同时支持Ehcache2.x、Ehcache3.x和Caffeine(推荐)。第二级缓存使用Redis(推荐)/Memcached。由于大量的缓存读取会导致L2的网络成为整个系统的瓶颈,因此L1的目标是降低对L2的读取次数......
  • 2024年C语言最新经典面试题汇总(1-10)
    C语言文章更新目录C语言学习资源汇总,史上最全面总结,没有之一C/C++学习资源(百度云盘链接)计算机二级资料(过级专用)C语言学习路线(从入门到实战)编写C语言程序的7个步骤和编程机制C语言基础-第一个C程序C语言基础-简单程序分析VS2019编写简单的C程序示例简单示例,VS2019调......
  • 缓存命中
    记录我了解的一点点关于缓存命中的知识。链接:参考文章链接,大佬的文章,偏底层,我是小白读不懂链接:我的博客内存分布和多级缓存我们了解最清楚的计算机的储存设备就是硬盘了,那么硬盘和平时所说的CPU之间有什么关系呢?如下图所示,计算机拥有层次分明的储存和运算结构。在......
  • Java面向对象编程面试题
    序号问题详细答案1什么是类与对象?类和对象实例之间的关系?   类具有继承、数据隐藏和多态三种主要特性。类是同一类对象实例的共性的抽象,对象是类的实例化;类是静态的,对象是动态的,对象可以看作是运行中的类。类负责产生对象,可以将类当成生产对象的工厂2构造函数的特点有哪些(1......
  • Redis缓存方案设计思路
    Redis缓存方案是一个用于提高系统性能和响应速度的策略,主要通过将数据存储在快速访问的内存数据库中来实现。下面是一个基础的Redis缓存方案的实现步骤和注意事项:一、确定缓存目标1、分析数据:确定哪些数据适合放入缓存,通常是那些读取频繁、更新不频繁的数据。2、热点数据......
  • java基础50道面试题
    java基础50道面试题一、java基础1.equals与==区别在Java中,"=="是一个比较操作符,用于比较两个变量的值是否相等。而"equals()"是Object类中定义的方法,用于比较两个对象是否相等。具体区别如下:1."=="用于比较基本数据类型和引用类型变量的地址值是否相等。对于基本数据类型,比......
  • 后端缓存的使用-问题-方案
    后端缓存的使用-问题-方案更新策略更DB,删Cache问题:中间过程中,可能会有其他进行获取Cache,导致出现不一致删缓存,更DB问题:中间过程中,可能会有其他进行获取Cache,因为不存在缓存,主动拉取,导致DB与Cache出现不一致延迟双删删缓存,更DB,再删缓存.引入了一个......