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

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

时间:2024-07-23 17:51:23浏览次数:10  
标签:Canal 面试题 缓存 Kafka MySQL 一致性 数据

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

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、设计模式、消息队列等模块。

标签:Canal,面试题,缓存,Kafka,MySQL,一致性,数据
From: https://www.cnblogs.com/vipstone/p/18319206

相关文章

  • 你离java岗面试成功只差这一份面试题!拿下吧让你少走99%弯路
     马上金九银十很多同学/朋友都在忙着找工作,小五给大家整理了一份非常全面的Java面试题含答案总结!从java面试新手到java面试专家,你只差这一份面试题!还不赶紧来拿下~八股文内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring......
  • nginx如何配置图片缓存时间
    问题解释:Nginx是一个高性能的Web服务器和反向代理服务器,可以用于配置图片缓存时间。这样可以有效地减少服务器的负载,提高用户访问速度。答案:要在Nginx中配置图片缓存时间,需要修改Nginx配置文件(通常为nginx.conf或者在conf.d或sites-available目录下的配置文件)。以......
  • JAVA面试题:HashMap和HashTable的区别
    一、先说结论        HashMap和HashTable都是Map接口的实现类。HashMap采用数组、链表和红黑树的数据结构,非线性安全且无序,查找效率高,初始化默认容量为2^4,每次扩容为原来的2倍;而HashTable采用数组和链表的数据结构,线性安全,键值均不允许为null,默认初始大小......
  • Redis常见面试题汇总
    1.Redis中的底层数据结构String(字符串、整数或浮点数):String是Redis最基本的数据类型,一个key对应一个value,value的最大值为512MString类型是二进制安全的(原理在2),意味着redis可以包含任何数据,如图片、视频(可以转换为二进制编码)和序列化对象List(列表):redis列表是简单的字符......
  • laravel: 指定redis缓存项的前缀
    一,laravel默认会为缓存项添加前缀:config/database.php中:'redis'=>['client'=>env('REDIS_CLIENT','phpredis'),'options'=>['cluster'=>env('REDIS_CLU......
  • Python面试题:使用NumPy进行高效数组运算
    NumPy是Python中进行高效数组运算的基础库。以下是一些示例,展示了如何使用NumPy进行高效的数组运算,包括创建数组、数组操作、数学运算以及一些高级操作。安装NumPy如果你还没有安装NumPy,可以通过以下命令进行安装:pipinstallnumpy示例代码1.创建数组import......
  • Python面试题:使用Matplotlib和Seaborn进行数据可视化
    使用Matplotlib和Seaborn进行数据可视化是数据分析中非常重要的一部分。以下示例展示了如何使用这两个库来创建各种图表,包括基本的线图、柱状图、散点图和高级的分类数据可视化图表。安装Matplotlib和Seaborn如果你还没有安装这两个库,可以使用以下命令进行安装:pipins......
  • 【c++经典面试题】有关string类的深浅拷贝
    题目背景基于自实现string类substr成员函数时遇到的问题。代码展示stringstring::substr(size_tpos,size_tlen)//声明时len的参省值位npos { assert(pos<_size); if(len>_size-pos)//如果len的长度大于有效字符长度,那么重置为有效字符长度 { le......
  • Android 常见面试题(一)
    Android常见面试题(一)1、java中==和equals和hashCode的区别基本数据类型的==比较的值相等.类的==比较的内存的地址,即是否是同一个对象。在不重写equals方法的情况下,equals同比较内存地址,原实现也为==,如String等重写了equals方法,会判断字符串里的值是否相等......
  • django相关面试题
    1.auto_add与auto_add_now作用于时间类型的字段,auto_add_now只在创建数据的时候生效,auto_now在修改数据的时候生效create_time=models.DateTimeField(auto_now_add=True)update_time=models.DateTimeField(auto_now=True)注意这两个属性只有在使用django的orm的create......