MST

星途 面试题库

面试题:Redis在MySQL读写分离架构中的缓存作用

在MySQL读写分离架构中,Redis常被用作缓存。请阐述Redis作为缓存,如何减轻MySQL读压力,以及在数据更新时,如何保证Redis与MySQL数据一致性的常见策略。
37.1万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试

Redis减轻MySQL读压力的方式

  1. 数据缓存
    • Redis是基于内存的高性能缓存,读写速度极快。应用程序读取数据时,首先查询Redis缓存。若缓存中有需要的数据(缓存命中),直接从Redis获取并返回给应用,无需访问MySQL,大大减少了对MySQL的读请求。例如,对于一些频繁查询但不经常变化的数据,如网站配置信息、商品基本介绍等,将其缓存在Redis中,每次读取这些数据都能快速从Redis获取,而不必查询MySQL。
  2. 热点数据处理
    • 可以通过分析应用的访问模式,确定热点数据(即被频繁访问的数据),并将这些热点数据存储在Redis中。这样,大量针对热点数据的读请求都由Redis处理,避免大量重复的读请求到达MySQL。例如,热门文章的内容、热门商品的详情等,将它们放入Redis缓存,有效降低MySQL对这些热点数据的读压力。
  3. 分布式缓存
    • 在分布式系统中,Redis可以作为分布式缓存使用。多个应用实例可以共享Redis缓存,每个实例都能从Redis获取缓存数据,减少每个实例对MySQL的独立读请求。同时,Redis的分布式特性可以通过集群等方式扩展缓存容量和性能,更好地应对大规模的读请求。

保证Redis与MySQL数据一致性的常见策略

  1. 先更新MySQL,再删除Redis缓存
    • 操作流程:当数据发生更新时,首先在MySQL中执行更新操作,若更新成功,再删除对应的Redis缓存数据。当下次读取该数据时,由于Redis中已无缓存数据(缓存未命中),会从MySQL读取最新数据并重新缓存到Redis中。
    • 优点:实现相对简单,能保证MySQL数据的一致性,因为MySQL更新成功后才会删除Redis缓存。
    • 缺点:在高并发场景下,可能会出现短暂的数据不一致。例如,在更新MySQL和删除Redis缓存之间的短暂时间内,有读请求到来,此时会读取到旧的Redis缓存数据。
  2. 先删除Redis缓存,再更新MySQL
    • 操作流程:当数据需要更新时,先删除Redis中的缓存数据,然后再更新MySQL数据库。这样,后续的读请求会因为缓存未命中而从MySQL获取最新数据并重新缓存到Redis。
    • 优点:相对先更新MySQL再删除缓存的方式,减少了读取到旧缓存数据的窗口时间。
    • 缺点:在高并发场景下,若在删除Redis缓存后,更新MySQL之前发生读请求,此时会读取到旧的MySQL数据并重新缓存到Redis,导致缓存中数据错误,直到下次数据更新。同时,如果删除缓存成功但更新MySQL失败,也会导致数据不一致。
  3. 双写一致性方案(先更新MySQL,再更新Redis)
    • 操作流程:数据更新时,先更新MySQL,更新成功后再更新Redis缓存。
    • 优点:理论上能保证缓存和数据库的数据一致性,读请求始终能从Redis获取到最新数据。
    • 缺点:实现复杂,因为要同时保证MySQL和Redis更新的原子性较困难。在高并发场景下,可能会出现更新顺序不一致的问题,例如多个更新操作并发,可能导致Redis中的数据不是最新的。而且如果更新Redis失败,还需要有重试或补偿机制。
  4. 使用队列(如消息队列)
    • 操作流程:数据更新时,先更新MySQL,然后将更新操作发送到消息队列(如Kafka、RabbitMQ等)。由专门的消费者从消息队列中获取更新操作,按照顺序依次处理,先删除Redis缓存(或更新Redis缓存)。
    • 优点:通过消息队列的顺序消费特性,能有效保证数据一致性,减少高并发下数据不一致的问题。同时,解耦了数据更新和缓存处理的过程,提高系统的稳定性和可维护性。
    • 缺点:引入了消息队列,增加了系统的复杂性和维护成本。消息队列可能会出现消息丢失、延迟等问题,需要相应的解决方案来保证消息的可靠传递和处理。