【java常见的面试题】Redis和Mysql如何保证数据⼀致?

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: Java基础的面试题【Redis篇】
  1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致

  2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中

    这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,
    ⽐如线程1删除了 Redis缓存数据,正在更新Mysql,
    此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中

  3. 使用MQ异步同步, 保证数据的最终一致性

我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 :

  1. 对于一些一致性要求不高的场景 , 不做处理

    例如 : 用户行为数据 , 我们没有做一致性保证 , 因为就算不一致产生的影响也很小

  2. 对于时效性数据 , 设置过期时间

    例如 : 接口缓存数据 , 我们会设置缓存的过期时间为 60S , 那么可能会出现60S之内的数据不一致, 60S后缓存过期, 重新从数据库加载就一致了

  3. 对于一致性要求比较高但是时效性要求不那么高的场景 , 使用MQ不断发送消息完成数据同步直到成功为止

    例如 : 首页广告数据 , 首页推荐数据

    数据库数据发生修改----> 发送消息到MQ -----> 接收消息更新缓存

    消息不丢失/重复消费 : 消息状态表/消息消费表

  4. 对于一致性和时效性要求都比较高的场景 , 使用分布式事务 , Seata的TCC模式

    很少用

相关实践学习
基于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天前
|
存储 Java
面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?
面试官:素有Java锁王称号的‘StampedLock’你知道吗?我:这什么鬼?
43 23
|
16小时前
|
Java 关系型数据库 MySQL
MySql数据库级别MD5加密java MD5加密解密工具包
MySql数据库级别MD5加密java MD5加密解密工具包
|
1天前
|
前端开发 关系型数据库 MySQL
SpringBoot-----从前端更新数据到MySql数据库
SpringBoot-----从前端更新数据到MySql数据库
8 1
|
1天前
|
easyexcel Java 关系型数据库
厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中
厉害了!12秒将百万数据通过EasyExcel导入MySQL数据库中
8 1
|
1天前
|
前端开发 easyexcel 关系型数据库
EasyExcel处理Mysql百万数据的导入导出案例,秒级效率,拿来即用!
EasyExcel处理Mysql百万数据的导入导出案例,秒级效率,拿来即用!
12 1
|
1天前
|
关系型数据库 MySQL 分布式数据库
如何将数据从MySQL迁移到PolarDB?
【5月更文挑战第13天】如何将数据从MySQL迁移到PolarDB?
17 0
|
1天前
|
消息中间件 安全 前端开发
字节面试:说说Java中的锁机制?
Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 1. **互斥访问**:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 2. **内存可见性**:通过锁的获取和释放,可以确保在锁保护的代码块中对共享变量的修改对其他线程可见。这是因为 Java 内存模型(JMM)规定,对锁的释放会把修改过的共享变量从线程的工作内存刷新到主内存中,而获取锁时会从主内存中读取最新的共享变量值。 3. **保证原子性**:锁
16 1
|
1天前
|
Java 数据挖掘 BI
Java医院绩效考核系统源码B/S+avue+MySQL助力医院实现精细化管理
医院绩效考核系统目标是实现对科室、病区财务指标、客户指标、流程指标、成长指标的全面考核、分析,并与奖金分配、学科建设水平评价挂钩。
30 0
|
1天前
|
NoSQL Java Redis
在Java中操作Redis
在Java中操作Redis
9 0
|
1天前
|
Java 关系型数据库 MySQL
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常