面试官,如何保证缓存与数据库的数据一致性

简介: 面试官,如何保证缓存与数据库的数据一致性

0. 缓存更新策略


内存淘汰 超时剔除 主动更新
说明 利用redis的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存 给缓存数据添加过期时间,到期后删除缓存,下次查询再更新缓存 编写业务逻辑,自己控制在修改数据库时更新缓存
一致性 一般
维护成本


0.1 缓存主动更新策略


  • 方案一:由缓存的调用者在更新数据库的时候同时更新缓存
  • 方案二:将缓存和数据库整合为一个服务,由该服务来维护一致性。对外提供接口,调用者调用该服务提供的接口,无需关心缓存一致性问题
  • 方案三:调用者只操作缓存,由其他线程异步将缓存数据持久化到数据库,保证最终一致性。


1. 数据同步策略


1.1 设置有效期


  • 给缓存设置有效期
  • 优点:简单方便
  • 缺点:时效性差,缓存过期之前可能数据不一致
  • 场景:适合更新频率低,时效性要求低的业务


1.2 同步双写


  • 在修改数据库的同时,直接修改缓存
  • 优点:时效性强,缓存与数据库强一致
  • 缺点:有代码侵入,耦合度高
  • 场景:对一致性、时效性要求较高的缓存数据


1.3 异步通知


  • 修改数据库时发送事件通知,相关服务监听到通知后再修改缓存数据
  • 优点:低耦合,可以同时通知多个缓存服务
  • 缺点:时效性一般,可能存在中间不一致状态
  • 场景:时效性要求一般,有多个服务需要同步


2. 保证缓存与数据库一致性的四个方案


  • 先更新数据库,再更新缓存(有bug)
  • 并发更新数据库场景下,会将脏数据刷新到缓存,不推荐
  • 先更新缓存,再更新数据库(有bug)
  • 缓存更新成功后,数据库更新失败,则会造成数据不一致性,而且也有并发问题,不推荐
  • 先删除缓存,在更新数据库(有bug)

* 改进方法:先删缓存,再更新数据库,再删缓存

  • 先更新数据库,再删除缓存(有bug)

* 更新数据库成功,但是删除缓存失败。

* 推荐这种,更新完数据库后删除缓存的速度是非常快的,所以在这个间隔内插入其他事务概率会比较低。


3. 先删除缓存,后更新数据库


3.1 可能出现的问题


  1. 请求A进行写操作,删除缓存
  2. 请求B查询发现缓存不存在
  3. 请求B去数据库查询得到旧值
  4. 请求B将旧值写入缓存
  5. 请求A将新值写入数据库


如果没有给缓存设置过期时间,则缓存数据永远都是脏数据


3.1 解决方式:延时双删


  • 先淘汰缓存
  • 再写数据库
  • 休眠一秒后再次淘汰缓存


对于读写分离的数据库,主从同步之间也会有时间差,若此时来了两个请求,请求A(更新操作)和请求B(查询操作),也会出现一些问题


  1. 请求A更新操作,删除缓存
  2. 请求A再主库进行更新操作,主库与从库进行数据同步操作
  3. 请求B查询操作,发现redis中没有数据
  4. 请求B去从库获取旧值数据
  5. 请求B更新缓存
  6. 主从同步完成


50df51aec22c426a5d58d808ecfde60b_format,png.png

解决方法:如果对redis进行填充的查询数据库操作,那么强制将其指向主库进行查询

d294efc41e46ea61ec930b578183261e_format,png.png


4. 先更新数据库,后删除缓存(推荐)


4.1可能出现的问题


  • 更新数据库成功了,但是在删除缓存的阶段没有成功,则之后读取的缓存都是错误的


4.2解决方式一:异步实现之利用消息队列


  1. 请求A向服务端发送修改商品请求
  2. 相应的模块根据请求会对数据库对应内容进行更新,更新成功后会向MQ发送消息

1. 该消息通知缓存处理模块删除对应的缓存

  1. 缓存模块监听到有新的消息,会执行缓存删除逻辑

1. 利用消息队列的 手动提交机制 可以保证删除逻辑顺利完成




4.3 解决方式二:基于Canal的通知


  • 商品服务完成数据库修改操作后,业务直接结束。没有任何代码侵入
  • Canal监听mysql变化,当发现变化后,立即通知缓存服务
  • 缓存服务接收到canal通知,删除缓存。




相关文章
|
3月前
|
存储 缓存 数据库
解决缓存与数据库的数据一致性问题的终极指南
解决缓存与数据库的数据一致性问题的终极指南
217 63
|
14天前
|
存储 Java easyexcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
2月前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
2月前
|
架构师 数据库
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
数据库乐观锁是必知必会的技术栈,也是大厂面试高频,十分重要,本文解析数据库乐观锁。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试高频:数据库乐观锁的实现原理、以及应用场景
|
2月前
|
SQL 缓存 监控
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
本文详细解析了数据库、缓存、异步处理和Web性能优化四大策略,系统性能优化必知必备,大厂面试高频。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:4 大性能优化策略(数据库、SQL、JVM等)
|
1月前
|
缓存 物联网 数据库
InfluxDB vs TDengine :2025 年了,谁家用的数据库还不能高效读缓存?
在工业互联网和物联网的大数据应用场景中,实时数据的写入和查询性能至关重要。如何快速获取最新设备状态并实时处理数据,直接影响到业务的高效运转。本文将深入分析 TDengine 和 InfluxDB 在缓存机制上的差异,帮助读者更好地理解这两款主流时序数据库在性能优化方面的优劣。
92 1
|
18天前
|
存储 消息中间件 设计模式
缓存数据一致性策略如何分类?
数据库与缓存数据一致性问题的解决方案主要分为强一致性和最终一致性。强一致性通过分布式锁或分布式事务确保每次写入后数据立即一致,适合高要求场景,但性能开销大。最终一致性允许短暂延迟,常用方案包括Cache-Aside(先更新DB再删缓存)、Read/Write-Through(读写穿透)和Write-Behind(异步写入)。延时双删策略通过两次删除缓存确保数据最终一致,适用于复杂业务场景。选择方案需根据系统复杂度和一致性要求权衡。
43 0
|
2月前
|
SQL 缓存 关系型数据库
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴因未能系统梳理MySQL缓存机制而在美团面试中失利。为此,尼恩对MySQL的缓存机制进行了系统化梳理,包括一级缓存(InnoDB缓存)和二级缓存(查询缓存)。同时,他还将这些知识点整理进《尼恩Java面试宝典PDF》V175版本,帮助大家提升技术水平,顺利通过面试。更多技术资料请关注公号【技术自由圈】。
美团面试:Mysql 有几级缓存? 每一级缓存,具体是什么?
|
2月前
|
缓存 NoSQL 数据库
运用云数据库 Tair 构建缓存为应用提速,完成任务得苹果音响、充电套装等好礼!
本活动将带大家了解云数据库 Tair(兼容 Redis),通过体验构建缓存以提速应用,完成任务,即可领取罗马仕安卓充电套装,限量1000个,先到先得。邀请好友共同参与活动,还可赢取苹果 HomePod mini、小米蓝牙耳机等精美好礼!
|
3月前
|
缓存 监控 算法
小米面试题:多级缓存一致性问题怎么解决
【10月更文挑战第23天】在现代分布式系统中,多级缓存架构因其能够显著提高系统性能和响应速度而被广泛应用。
98 3