切换语言为:繁体

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

  • 爱糖宝
  • 2024-07-23
  • 2064
  • 0
  • 0

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

1.一致性问题解决方案

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

  1. 使用延迟双删 + MQ 保证数据的一致性。

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

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

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

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

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

2.Canal执行流程

通过 Canal 保证数据一致性的实现流程如下图所示:面试题:如何解决缓存和数据库的一致性问题?

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 中存储的数据格式如下:面试题:如何解决缓存和数据库的一致性问题?

4.最后

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

0条评论

您的电子邮件等信息不会被公开,以下所有项均必填

OK! You can skip this field.