我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL数据和Redis缓存一致性方案详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL数据和Redis缓存一致性方案详解

MySQL数据和Redis缓存一致性方案详解 MySQL数据和Redis缓存一致性方案详解 MySQL数据和Redis缓存一致性方案详解

读取缓存步骤一般没有什么问题,但是一旦涉及到数据更新:数据库和缓存更新,就容易出现 缓存(Redis)和数据库(MySQL)间的数据一致性问题。

不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都有可能出现数据不一致的情况。举一个例子:

1.如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。

2.如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。

因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。

如来解决?这里给出两个解决方案,先易后难,结合业务和技术代价选择使用。

缓存和数据库一致性解决方案

第一种方案:采用延时双删策略

在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。

伪代码如下

public void write(String key,Object data){redis.delKey(key);db.updateData(data);Thread.sleep(500);redis.delKey(key);}

2.具体的步骤就是:

1)先删除缓存

2)再写数据库

3)休眠500毫秒

4)再次删除缓存

那么,这个500毫秒怎么确定的,具体该休眠多久呢?

需要评估自己的项目的读数据业务逻辑的耗时。这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。

当然这种策略还要考虑redis和数据库主从同步的耗时。最后的的写数据的休眠时间:则在读数据业务逻辑的耗时基础上,加几百ms即可。比如:休眠1秒。

3.设置缓存过期时间

从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。所有的写操作以数据库为准,只要到达缓存过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。

4.该方案的弊端

结合双删策略+缓存超时设置,这样最差的情况就是在超时时间内数据存在不一致,而且又增加了写请求的耗时。

第二种方案:异步更新缓存(基于订阅binlog的同步机制)

1.技术整体思路:

MySQL binlog增量订阅消费+消息队列+增量数据更新到redis

1)读Redis:热数据基本都在Redis

2)写MySQL:增删改都是操作MySQL

3)更新Redis数据:MySQ的数据操作binlog,来更新到Redis

2.Redis更新

1)数据操作主要分为两大块:

  • 一个是全量(将全部数据一次写入到redis)
  • 一个是增量(实时更新)

    *这里说的是增量,指的是mysql的update、insert、delate变更数据。

2)读取binlog后分析 ,利用消息队列,推送更新各台的redis缓存数据。

这样一旦MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis,Redis再根据binlog中的记录,对Redis进行更新。

其实这种机制,很类似MySQL的主从备份机制,因为MySQL的主备也是通过binlog来实现的数据一致性。

这里可以结合使用canal(阿里的一款开源框架),通过该框架可以对MySQL的binlog进行订阅,而canal正是模仿了mysql的slave数据库的备份请求,使得Redis的数据更新达到了相同的效果。

当然,这里的消息推送工具你也可以采用别的第三方:kafka、rabbitMQ等来实现推送更新R

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL数据和Redis缓存一致性方案详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

redis系列之数据库与缓存数据一致性解决方案

场景一一般来说,只要你用到了缓存,不管是Redis还是memcache,就可能会涉及到数据库缓存与数据的一致性问题,这里我们以Redis为例。我们该如何保证Redis与数据库的一致性呢? So easy:更新的时候,先更新数据库,然后再删除缓存。读的时候,先读
redis系列之数据库与缓存数据一致性解决方案
2020-08-13

Mysql和redis缓存不一致问题的解决方案

目录一.问题描述二.解决方案1.给缓存数据设置过期时间2.缓存延时双删3.删除缓存重试机制4.读取biglog异步删除缓存三.总结一.问题描述Redis、mysql双写缓存不一致:在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓
2022-08-16

MySQL 和 Redis 数据一致性有哪些解决方案

数据库触发器是一种解决MySQL和Redis数据一致性的方案。通过在数据库中设置触发器,可以实现在数据发生变动时自动触发相应的操作,从而保持数据库和缓存之间的数据一致性。

MySQL数据库和Redis缓存一致性的更新策略

目录一、更新策略二、读写缓存1、同步直写策略2、异步缓写策略三、双检加锁策略四、数据库和缓存一致性的更新策略1、先更新数据库,再更新Redis2、先更新缓存,再更新数据库3、先删除缓存,再更新数据库延时双删4、先更新数据库,再删除缓存5、总
2023-04-12

保证缓存和数据库的数据一致性详解

在实际开发过程中,缓存的使用频率是非常高的,只要使用缓存和数据库存储,就难免会出现双写时数据一致性的问题,本文主要介绍了如何保证缓存和数据库的数据一致性,需要的小伙伴可以参考阅读
2023-05-15

redis缓存和数据库不一致解决

解决 redis 缓存和数据库不一致问题需要:使用数据一致性协议(如 redis 事务或分布式锁)防止并发写入导致不一致。采用缓存失效策略(如过期时间或更新触发器)确保缓存及时更新。优化缓存架构(如分区缓存或二级缓存)减少对数据库的直接访问
redis缓存和数据库不一致解决
2024-04-19

Redis缓存和数据库的数据一致性的问题解决

目录前言一、谈谈一致性二、 情景分析2.1 针对读场景2.2 针对写场景三、同步策略3.1 先更新缓存,再更新数据库3.2 先更新数据库,再更新缓存3.3 先删除缓存,后更新数据库3.4 先更新数据库,后删除缓存四、解决办法4.1 双写一致
Redis缓存和数据库的数据一致性的问题解决
2024-09-20

【分布式】数据库和缓存双写一致性方案解析

引言为什么写这篇文章?首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新
2023-06-02

redis缓存和数据库一致性问题如何解决

在使用Redis缓存时,常常会遇到与数据库一致性的问题。当数据发生变更时,需要保证Redis缓存与数据库的数据保持一致。以下是几种常见的解决方案:1. 缓存穿透:在查询缓存时,如果缓存中不存在对应的数据,会直接查询数据库。但是当数据库中也不
2023-08-24

redis如何保证缓存和数据库一致性

redis 通过五种机制维护缓存一致性:1. 写通过缓存,2. 定期同步,3. 事务支持,4. 发布-订阅,5. 校验和修复。选择机制取决于数据变更频率、数据一致性要求、应用性能和维护成本等因素。Redis如何实现缓存一致性Redis作为
redis如何保证缓存和数据库一致性
2024-04-20

如何保障redis缓存和mysql数据相一致

如何保障 redis 缓存与 mysql 数据一致性?异步更新:通过消息队列进行更新,不阻塞应用程序。定期同步:使用定时作业定期同步数据,保持数据一致性。混合方法:结合异步和定期同步,兼顾效率和一致性。缓存失效:更新 mysql 数据时使
如何保障redis缓存和mysql数据相一致
2024-04-19

如何解决 Java @Cacheable 缓存与数据库一致性问题?(Java @Cacheable缓存与数据库一致性解决方案)

在Java开发中,@Cacheable注解常用于缓存数据,以提高系统的性能。然而,当缓存与数据库的数据不一致时,就会出现问题。本文将介绍Java@Cacheable缓存与数据库一致性的解决方案。一、@Cacheable注解的基本原理
如何解决 Java @Cacheable 缓存与数据库一致性问题?(Java @Cacheable缓存与数据库一致性解决方案)
Java2024-12-15

Redis做为缓存,MySQL如何与Redis保持数据一致性?

一般情况下Redis是用来实现应用和数据库之间的一个读操作的缓存层,主要目的是减少数据库的io,还可以提升数据库io性能
Redis数据库2024-11-30

编程热搜

目录