彻底搞懂Redis和Mysql如何保证数据一致性

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: 彻底搞懂Redis和Mysql如何保证数据一致性

Redis的作用


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



整体架构


image.png

  1. 命中缓存从缓存加载数据,直接返回


  1. 没有命中缓存,从数据库加载加载数据


  1. 加载到的数据写入缓存



原理


一份数据同时保存在数据库和Redis里面,当数据发生变化的时候,需要同时更新Redis和Mysql,由于更新操作是有先后顺序的,并且它并不像Mysql中的多表事务操作可以满足ACID的特性,所以就会出现数据一致性的问题,



如何保证数据一致性


  1. 先更新数据库,再更新缓存


  1. 先删除缓存,再更新数据库


第一种情况的缺点


image.png

如果先更新数据库,再更新缓存,如果缓存更新失败,就会导致数据库和Redis的数据是不一致的,



第二种情况的缺点


image.png

如果先删除缓存,再更新数据库,理想情况下,是应用下次访问Redis的时候,发现Redis的数据是空的那么就会从数据库加载保存到Redis里面理论上数据是一致的,但是在极端情况下,由于删除Redis和更新数据库这两个操作并不是原子操作,如果出现其它线程来访问,还是会存在数据不一致的问题



如何保证数据一致性


如果需要在极端情况下仍然去保证Redis和Mysql的数据一致性就只能采用最终一致性的一个方案


image.png



基于RocketMq的可靠性通信


  1. 更新数据库的数据


  1. 更新redis的数据


  1. 失败的请求写入mq事务消息


  1. 异步重试,确保成功



基于canal组件


  1. 更新数据库的数据


  1. 更新redis的数据


  1. 从binlog加载数据


  1. 同步到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
相关文章
|
1月前
|
缓存 NoSQL 关系型数据库
13- Redis和Mysql如何保证数据⼀致?
该内容讨论了保证Redis和MySQL数据一致性的几种策略。首先提到的两种方法存在不一致风险:先更新MySQL再更新Redis,或先删Redis再更新MySQL。第三种方案是通过MQ异步同步以达到最终一致性,适用于一致性要求较高的场景。项目中根据不同业务需求选择不同方案,如对一致性要求不高的情况不做处理,时效性数据设置过期时间,高一致性需求则使用MQ确保同步,最严格的情况可能涉及分布式事务(如Seata的TCC模式)。
51 6
|
1月前
|
监控 NoSQL Redis
如何保证Redis的高可用性?
【4月更文挑战第2天】Redis高可用性涉及数据持久化(RDB&AOF)、主从复制与Sentinel故障转移、Redis Cluster分布式部署、身份认证、多线程、数据压缩及监控报警等策略,确保服务连续性、数据安全及性能优化。
24 0
|
1月前
|
缓存 NoSQL 算法
17- 数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ?
保证Redis中的20w数据为热点数据,可以通过设置Redis的LFU(Least Frequently Used)淘汰策略。这样,当数据库有1000万数据而Redis仅能缓存20w时,LFU会自动移除使用频率最低的项,确保缓存中的数据是最常使用的。
63 8
|
5天前
|
存储 监控 NoSQL
Redis是如何保证高可用的?
通过这些机制,Redis可以在主节点故障或其他异常情况下保持高可用性,确保数据的可靠性和可用性。不过,为了实现高可用性,需要仔细规划和配置Redis集群,并确保监控和故障恢复机制的可靠性。
19 6
|
2月前
|
NoSQL 关系型数据库 MySQL
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
安装Docker&镜像容器操作&使用Docker安装部署MySQL,Redis,RabbitMQ,Nacos,Seata,Minio
457 1
|
2月前
|
存储 缓存 关系型数据库
MySQL事务的四大特性是如何保证的
在MySQL数据库中还有一种二进制日志,其用来基于时间点的还原及主从复制。从表面上来看其和重做日志非常相似,都是记录了对于数据库操作的日志。但是,从本质上来看有着非常大的不同。
14 1
|
2月前
|
NoSQL 关系型数据库 MySQL
一个小小的签到功能,到底用MySQL还是Redis
一个小小的签到功能,到底用MySQL还是Redis
9 0
|
2月前
|
NoSQL 关系型数据库 MySQL
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
Docker安装详细步骤及相关环境安装配置(mysql、jdk、redis、自己的私有仓库Gitlab 、C和C++环境以及Nginx服务代理)
251 0
|
1月前
|
存储 NoSQL 算法
09- Redis分片集群中数据是怎么存储和读取的 ?
Redis分片集群使用哈希槽分区算法,包含16384个槽(0-16383)。数据存储时,通过CRC16算法对key计算并模16383,确定槽位,进而分配至对应节点。读取时,根据槽位找到相应节点直接操作。
66 12
|
1天前
|
存储 监控 NoSQL
Redis哨兵&分片集群
Redis哨兵&分片集群
6 0