数据库与缓存一致性方案分享

简介: 数据库与缓存一致性方案分享

前言


做C端相关业务,目前主流的关系型数据库在高并发的查询请求场景下,很难做到低延迟的高并发,甚至有可能被打挂。因此引入缓存中间件是一个常见的解决方案,但如何保证缓存与数据库的一致性,便成为了一个棘手的问题,这次我们拿常见的Mysql和Redis举例。


正文


保持缓存和数据库的一致性,最简单的做法就是直接在业务中去双写或删除保持一致性;如果要跟业务解耦,就要采用订阅binlog或者定时刷新的方式完成。


业务耦合的一致性方案


业务中耦合更新缓存


       其中一种常见的方案是更新缓存,当数据变更时更新对应缓存数据到缓存中,该行为可以在同一个业务中也可用消息中间件解耦。当查询请求来时,就直接查询缓存返回数据,如下图:

00000.png

弊端:

当出现并发数据变更时,如A、B对同一行数据进行变更,A先变更完成,接着B变更完成,B更新缓存,A更新缓存。数据库中的数据是B的数据,但是缓存中却是A的数据。

与业务耦合不可取,增加业务复杂性以及依赖的中间件。


业务中耦合删除缓存


       其实无论是前置更新还是后置更新缓存,在一些并发的极端场景都会出现缓存不一致的问题(思考一下前置更新),所以一个可以走的路子是删除缓存。当数据变更后,删除对应key的缓存,缓存的更新由C端业务来保证,如下图:

0000.png

       使用删除缓存的方式,不管数据变更这里的修改并发有多高,都能保证最终C端查询处放入的缓存是正确的,跟数据库保持一致的。

弊端:

  1. 对于删除缓存来说,一个明显的弊端在于当第二步删除缓存时,如果数据查询这里保持较高的流量,那么就会有一大批的请求透过缓存打到db中,还是有极大的风险;
  2. 依旧是未与业务解耦。


业务解耦的一致性方案


       对于Mysql来说,如果要做到与业务解耦,首先想到的肯定是binlog,因为binlog毕竟记录了全量真实落库的数据,将自己伪装成一个从节点,订阅binlog就能完成业务上的解耦,如下图:

000.png


       如上图说示,此时的缓存被视为db中的一份完整的镜像数据,但是仍旧无法避免并发场景下多线程消费binlog导致的缓存不一致问题。


引入定时任务与数据校验机制的binlog缓存更新机制


       那如何能解决binlog监听时的数据乱序问题,并且有一定的容错机制保证缓存的最终一致性?

       如下图所示,我们基于之前的binlog监听方案新增了两处改动。

  1. 通过监听消费binlog时记录binlog产生时间,并且每次对比binlog时间解决多线程消费的情况下,缓存和db数据最终不一致的问题;
  2. 由于每次update都会产生binlog,那么对于配置表的全表update(非业务字段,如set update_time=now())即可完成数据全量更新同步至缓存,通过定时任务定时触发,这样就能给业务带来更高的容错性。

000.png


结语


       没有完美的方案,只有最适合自己业务的方案,如果当前基建较弱并且工期较短,那么跟业务耦合的缓存删除方案就基本满足大多数场景;如果工期满足,则可以探索一些更好的一致性方案,甚至引入分布式事务来保证缓存数据的更新,也未尝不可。


       最近的一些业务需求,与缓存打交道较多,后续会持续更新热点key、大key的一些方案分享。

相关文章
|
2月前
|
存储 缓存 数据库
解决缓存与数据库的数据一致性问题的终极指南
解决缓存与数据库的数据一致性问题的终极指南
164 63
|
25天前
|
缓存 关系型数据库 MySQL
高并发架构系列:数据库主从同步的 3 种方案
本文详解高并发场景下数据库主从同步的三种解决方案:数据主从同步、数据库半同步复制、数据库中间件同步和缓存记录写key同步,旨在帮助解决数据一致性问题。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
高并发架构系列:数据库主从同步的 3 种方案
|
20天前
|
缓存 NoSQL 数据库
运用云数据库 Tair 构建缓存为应用提速,完成任务得苹果音响、充电套装等好礼!
本活动将带大家了解云数据库 Tair(兼容 Redis),通过体验构建缓存以提速应用,完成任务,即可领取罗马仕安卓充电套装,限量1000个,先到先得。邀请好友共同参与活动,还可赢取苹果 HomePod mini、小米蓝牙耳机等精美好礼!
|
26天前
|
缓存 NoSQL 关系型数据库
mysql和缓存一致性问题
本文介绍了五种常见的MySQL与Redis数据同步方法:1. 双写一致性,2. 延迟双删策略,3. 订阅发布模式(使用消息队列),4. 基于事件的缓存更新,5. 缓存预热。每种方法的实现步骤、优缺点均有详细说明。
|
2月前
|
缓存 监控 算法
小米面试题:多级缓存一致性问题怎么解决
【10月更文挑战第23天】在现代分布式系统中,多级缓存架构因其能够显著提高系统性能和响应速度而被广泛应用。
43 3
|
2月前
|
缓存 弹性计算 NoSQL
新一期陪跑班开课啦!阿里云专家手把手带你体验高并发下利用云数据库缓存实现极速响应
新一期陪跑班开课啦!阿里云专家手把手带你体验高并发下利用云数据库缓存实现极速响应
|
2月前
|
消息中间件 缓存 中间件
缓存一致性问题,这么回答肯定没毛病!
缓存一致性问题,这么回答肯定没毛病!
|
2月前
|
存储 缓存 API
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
LangChain-18 Caching 将回答内容进行缓存 可在内存中或数据库中持久化缓存
42 6
|
2月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
78 6
|
17天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题