MST

星途 面试题库

面试题:缓存设计之高级难度:缓存自动刷新机制的优化设计

现有一个高并发的电商系统,商品信息缓存用于减轻数据库压力。商品信息偶尔会有价格调整等更新操作。设计一个缓存自动刷新机制,既要保证在商品信息更新时缓存数据能及时刷新,又要尽量减少高并发场景下缓存击穿、缓存雪崩等问题的发生,描述该机制的整体架构、关键技术点及实现思路。
31.7万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试

整体架构

  1. 数据库层:存储商品的真实数据,包括价格等信息。当商品信息更新时,数据库记录会被修改。
  2. 缓存层:使用分布式缓存,如 Redis 存储商品信息,为高并发请求提供快速响应。
  3. 消息队列层:如 Kafka、RabbitMQ 等。当数据库商品信息更新时,发送一条消息到消息队列。
  4. 缓存刷新服务:监听消息队列,接收到商品更新消息后,负责刷新相应商品的缓存数据。

关键技术点

  1. 分布式缓存:Redis 的高可用集群部署,如 Redis Cluster,保证缓存服务的可靠性和扩展性。使用缓存分片,避免单个节点压力过大。
  2. 消息队列:确保消息的可靠传递,使用持久化机制。设置合理的消息队列容量,避免消息堆积。
  3. 缓存更新策略:采用“写后失效”策略,即数据库更新后,通过消息队列通知缓存更新。但在高并发场景下,为防止缓存击穿,对于热点数据可以使用“写时更新”结合“写后失效”策略。

实现思路

  1. 数据库更新:在商品价格等信息更新的数据库事务中,添加逻辑向消息队列发送商品更新消息,消息内容包含商品 ID 等关键信息。
  2. 消息队列接收与处理:缓存刷新服务监听消息队列,一旦接收到商品更新消息,从消息中解析出商品 ID。
  3. 缓存刷新:缓存刷新服务使用商品 ID,在 Redis 中定位对应的商品缓存数据并删除或更新。对于可能出现缓存击穿的热点数据,在更新数据库时,同时直接更新缓存中的数据,并设置较短的过期时间,之后再通过消息队列进行常规的缓存失效操作。
  4. 缓存击穿预防:对于热点数据,除了上述写时更新策略,还可以使用互斥锁(如 Redis 的 SETNX 命令)。在缓存失效时,只有一个请求能获取锁并去数据库加载数据更新缓存,其他请求等待,避免大量请求同时穿透到数据库。
  5. 缓存雪崩预防:设置缓存的过期时间时,使用随机时间,避免大量缓存同时过期。同时结合缓存预热,在系统启动时,预先加载部分热点数据到缓存。