Redis 和 MySQL 如何保持数据一致性?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Redis 和 MySQL 如何保持数据一致性?

一、导致数据不一致的原因?

1.在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节。所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库;

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

3.这个业务场景,主要是解决读数据从Redis缓存,一般都是按照下图的流程来进行业务操作。


二、缓存先后删除问题

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

1. 先删除缓存

   1)、如果先删除Redis缓存数据,然而还没有来得及写入MySQL,另一个线程就来读取;


       2)、这个时候发现缓存为空,则去Mysql数据库中读取旧数据写入缓存,此时缓存中为脏数据;


       3)、然后数据库更新后发现Redis和Mysql出现了数据不一致的问题。


2. 后删除缓存

       1)、如果先写了库,然后再删除缓存,不幸的写库的线程挂了,导致了缓存没有删除;

       2)、这个时候就会直接读取旧缓存,最终也导致了数据不一致情况;

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


三、解决方案

1. 延时双删策略

1). 基本思路

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

伪代码如下:

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

2). 具体步骤

  • 先删除缓存;
  • 再写数据库;
  • 休眠500毫秒;
  • 再次删除缓存。

问题:这个500毫秒怎么确定的,具体该休眠多久时间呢?


需要评估自己的项目的读数据业务逻辑的耗时。

这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。

当然这种策略还要考虑redis和数据库主从同步的耗时。

最后的的写数据的休眠时间:则在读数据业务逻辑的耗时基础上,加几百ms即可。

   比如:休眠1秒。


3). 设置缓存过期时间是关键点

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

4). 方案缺点

   结合双删策略+缓存超时设置,这样最差的情况就是:

  • 在缓存过期时间内发生数据存在不一致;
  • 同时又增加了写请求的耗时。


2. 异步更新缓存(基于Mysql binlog的同步机制)

1). 整体思路

       1>、涉及到更新的数据操作,利用Mysql binlog 进行增量订阅消费;


       2>、将消息发送到消息队列;


       3>、通过消息队列消费将增量数据更新到Redis上。

2). 操作情况

  • 读取Redis缓存:热数据都在Redis上;
  • 写Mysql:增删改都是在Mysql进行操作;
  • 更新Redis数据:Mysql的数据操作都记录到binlog,通过消息队列及时更新到Redis上。

3). Redis更新过程

       数据操作主要分为两种:

       1>、一种是全量(将所有数据一次性写入Redis);

       2>、一种是增量(实时更新)。


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


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


       1>、这样一旦MySQL中产生了新的写入、更新、删除等操作,就可以把binlog相关的消息推送至Redis;


       2>、Redis再根据binlog中的记录,对Redis进行更新;


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


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


四、总结

在高并发应用场景下,如果是对数据一致性要求高的情况下,要定位好导致数据和缓存不一致的原因。

解决高并发场景下数据一致性的方案有两种,分别是延时双删策略和异步更新缓存两种方案。

另外,设置缓存的过期时间是保证数据保持一致性的关键操作,需要结合业务进行合理的设置。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
15小时前
|
SQL 监控 关系型数据库
MySQL 如何保证主备的数据一致性的?
MySQL通过使用主从复制(Master-Slave Replication)来实现主备的数据一致性。主从复制是一种常见的数据复制技术,它将一个MySQL数据库服务器(主服务器)的数据复制到一个或多个其他MySQL数据库服务器(从服务器),以实现数据的冗余备份、读写分离等目的。以下是MySQL保证主备数据一致性的一些关键点: 1. **二进制日志(Binary Log)**:主服务器将所有的数据更改操作(如INSERT、UPDATE、DELETE)以二进制日志的形式记录下来,并定期将这些日志发送给从服务器。从服务器收到二进制日志后,按照主服务器的执行顺序逐条应用这些日志,从而保持数据的一致性
|
15小时前
|
缓存 NoSQL 关系型数据库
MySQL与Redis的默契协作:解析数据一致性难题与解决方案
MySQL与Redis的默契协作:解析数据一致性难题与解决方案
26 0
MySQL与Redis的默契协作:解析数据一致性难题与解决方案
|
15小时前
|
缓存 NoSQL 关系型数据库
13- Redis和Mysql如何保证数据⼀致?
该内容讨论了保证Redis和MySQL数据一致性的几种策略。首先提到的两种方法存在不一致风险:先更新MySQL再更新Redis,或先删Redis再更新MySQL。第三种方案是通过MQ异步同步以达到最终一致性,适用于一致性要求较高的场景。项目中根据不同业务需求选择不同方案,如对一致性要求不高的情况不做处理,时效性数据设置过期时间,高一致性需求则使用MQ确保同步,最严格的情况可能涉及分布式事务(如Seata的TCC模式)。
51 6
|
15小时前
|
缓存 NoSQL 关系型数据库
解决MySQL与Redis缓存一致性的问题
选择适合的策略取决于系统的需求和复杂性,通常需要根据业务场景综合考虑,以实现MySQL与Redis缓存的一致性。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
20 0
|
15小时前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
471 1
|
存储 NoSQL 关系型数据库
|
15小时前
|
存储 监控 负载均衡
保证Redis的高可用性是一个涉及多个层面的任务,主要包括数据持久化、复制与故障转移、集群化部署等方面
【5月更文挑战第15天】保证Redis高可用性涉及数据持久化、复制与故障转移、集群化及优化策略。RDB和AOF是数据持久化方法,哨兵模式确保故障自动恢复。Redis Cluster实现分布式部署,提高负载均衡和容错性。其他措施包括身份认证、多线程、数据压缩和监控报警,以增强安全性和稳定性。通过综合配置与监控,可确保Redis服务的高效、可靠运行。
7 2
|
15小时前
|
存储 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(下)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
7 1
|
15小时前
|
监控 NoSQL Redis
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群(上)
Redis源码、面试指南(5)多机数据库、复制、哨兵、集群
15 0
|
15小时前
|
存储 监控 NoSQL
Redis哨兵&分片集群
Redis哨兵&分片集群
8 0

推荐镜像

更多