面试题:如何解决缓存和数据库的一致性问题?

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 面试题:如何解决缓存和数据库的一致性问题?

所谓的一致性问题是指,在同时使用缓存和数据库的情况下,要确保数据在缓存与数据库中的更新操作保持同步。也就是当对数据进行修改时,无论是先修改缓存还是先修改数据库,最终都要保证两者的数据是一样的,不会出现数据不一样的问题。

1.一致性问题解决方案

缓存和数据库一致性的经典解决方案有以下两个:

  1. 使用延迟双删 + MQ 保证数据的一致性。
  2. 通过 Canal 监听 MySQL 的 Binlog 写入日志,之后将写入操作(增加、删除和修改)的信息发送至 Kafka,程序监听到 Kafka 的消息后更新 Redis,从而保证数据的最终一致性。

    需要注意的是,无论使用的是延迟双删还是 Canal,都会出现短暂数据不一致性的问题,但可以保证最终的数据一致性。

然而,如果使用的是延迟双删 + MQ 的这种方式的时候,有一个棘手的问题很难处理,那就是如何设置延迟时间?

如果延迟时间设置的比较短,那么在并发场景下会出现数据不一致的问题;如果延迟时间设置的比较长,那么在比较长的这段时间内还会有数据不一致的问题。这个问题归根到底的原因是,并发线程的调度时间不能人为的控制(由操作系统统一调度)。

所以基于以上原因,使用 Canal 来保证数据一致性问题变成了一个比较不错的解决 Redis 和 MySQL 数据一致性的有效手段。

2.Canal执行流程

通过 Canal 保证数据一致性的实现流程如下图所示:
image.png

3.Canal操作流程

使用 Canal 读取 MySQL 的 Binlog 配置步骤如下:

  1. 开启并配置 MySQL 的 Binlog 设置。
  2. 重启 MySQL 服务。
  3. 给 MySQL 配置 canal/canal 用户用于后续 Canal 同步数据(此步骤非必须)。
  4. 安装并解压 Canal。
  5. 修改 canal.properties 配置文件,让其将数据同步到 Kafka,并配置 Kafka 服务器信息。
  6. 修改 example/instance.properties 配置文件,指定同步数据到 Kafka 某个主题。
  7. 拷贝 plugin 中的 jar 包到 lib 目录,让 Canal 支持将数据同步到 MQ。
  8. 启动 Canal 服务。
  9. 在代码中监听 Kafka 主题,并判断并更新 Redis 缓存。

Kafka 中存储的数据格式如下:
image.png

4.最后

理论如同明灯照亮前行的道路,实践则是我们坚实的脚步。唯有将两者紧密结合,不断地练习和实践,我们才能在求知的旅程中稳步前行,收获真正的成长与进步。所以,一起行动起来,光看不练都是假把式。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

相关文章
WordPress数据库查询缓存插件
这款插件通过将MySQL查询结果缓存至文件、Redis或Memcached,加速页面加载。它专为未登录用户优化,支持跨页面缓存,不影响其他功能,且可与其他缓存插件兼容。相比传统页面缓存,它仅缓存数据库查询结果,保留动态功能如阅读量更新。提供三种缓存方式选择,有效提升网站性能。
96 1
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
缓存与数据库的一致性方案,Redis与Mysql一致性方案,大厂P8的终极方案(图解+秒懂+史上最全)
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
云端问道21期方案教学-应对高并发,利用云数据库 Tair(兼容 Redis®*)缓存实现极速响应
193 1
云端问道21期实操教学-应对高并发,利用云数据库 Tair(兼容 Redis®)缓存实现极速响应
本文介绍了如何通过云端问道21期实操教学,利用云数据库 Tair(兼容 Redis®)缓存实现高并发场景下的极速响应。主要内容分为四部分:方案概览、部署准备、一键部署和完成及清理。方案概览中,展示了如何使用 Redis 提升业务性能,降低响应时间;部署准备介绍了账号注册与充值步骤;一键部署详细讲解了创建 ECS、RDS 和 Redis 实例的过程;最后,通过对比测试验证了 Redis 缓存的有效性,并指导用户清理资源以避免额外费用。
138 1
云数据库Tair:从稳定低延时缓存到 Serverless KV
本次分享聚焦云数据库Tair的使用,涵盖三部分内容:1) Tair概览,介绍其作为稳定低延时缓存及KV数据库服务的特点和优势;2) 稳定低延迟缓存技术,探讨如何通过多线程处理、优化内核等手段提升性能与稳定性;3) 从缓存到Serverless KV的演进,特别是在AI大模型时代,Tair如何助力在线服务和推理缓存加速。Tair在兼容性、性能优化、扩缩容及AI推理加速方面表现出色,满足不同场景需求。
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
227 4
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问