MST

星途 面试题库

面试题:Redis缓存与MySQL数据一致性监控的常见方案有哪些

请阐述在Redis缓存与MySQL数据一致性监控方面,常见的实现方案,并说明每种方案的优缺点。
45.0万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

1. 双写模式

  • 实现方案:在更新 MySQL 数据时,同时更新 Redis 缓存数据。
  • 优点:实现简单,业务逻辑直观,在大多数情况下能保证数据一致性。
  • 缺点:在高并发场景下,可能出现更新 MySQL 成功但更新 Redis 失败,或者更新 Redis 成功但更新 MySQL 失败的情况,导致数据不一致。而且双写操作会增加系统复杂度和性能开销。

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

  • 实现方案:业务操作先更新 MySQL 数据库,然后删除对应的 Redis 缓存数据。当下次请求读取数据时,发现缓存中没有数据,再从数据库读取并重新写入缓存。
  • 优点:相比双写模式,减少了写操作的复杂度,降低了缓存与数据库数据不一致的概率。因为只要删除缓存操作成功,下次请求就能获取到最新数据。
  • 缺点:在高并发场景下可能出现缓存击穿问题。比如在删除缓存和再次读取并写入缓存之间的短暂时间内,大量请求同时进来,这些请求都去查询数据库,可能对数据库造成较大压力。另外,如果删除缓存操作失败,也会导致数据不一致。

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

  • 实现方案:业务操作先删除 Redis 缓存数据,然后更新 MySQL 数据库。
  • 优点:可以避免先更新数据库再删除缓存时可能出现的缓存击穿问题,因为先删除缓存后,后续请求就不会从旧的缓存中读取数据。
  • 缺点:在高并发场景下,如果删除缓存后,更新数据库操作还未完成,另一个请求进来读取数据,会从数据库读到旧数据并写入缓存,导致数据不一致。此外,如果删除缓存成功但更新数据库失败,也会出现数据不一致情况。

4. 基于订阅 - 发布模式

  • 实现方案:利用消息队列(如 Kafka、RabbitMQ 等),在数据库数据发生变化时,数据库的 binlog 日志会被捕获并发送到消息队列,订阅该消息的服务接收到消息后,对 Redis 缓存进行相应的更新或删除操作。
  • 优点:解耦了数据库和缓存的更新操作,降低了业务系统的耦合度。通过消息队列的异步处理,可以提高系统的整体性能和吞吐量,并且能较好地应对高并发场景,减少数据不一致的概率。
  • 缺点:引入消息队列增加了系统架构的复杂性,需要处理消息的可靠性投递、重复消费、消息积压等问题。同时,消息处理存在一定的延迟,可能导致短时间内数据不一致。

5. 缓存一致性框架(如 Canal + Redis)

  • 实现方案:Canal 模拟 MySQL 从库,监听 MySQL 的 binlog 日志,解析 binlog 中的数据变更事件,然后根据配置将这些变更同步到 Redis 缓存中。
  • 优点:基于数据库 binlog 同步,能保证数据的准确性和一致性,对业务侵入性小,不需要在业务代码中大量编写缓存更新逻辑。适用于大规模数据一致性同步场景。
  • 缺点:同样增加了系统的复杂性,需要部署和维护 Canal 服务。对 binlog 的依赖可能存在兼容性问题,不同数据库版本的 binlog 格式可能有所差异,配置和维护成本较高。