面试题答案
一键面试整体架构
- 数据库层:存储商品的真实数据,包括价格等信息。当商品信息更新时,数据库记录会被修改。
- 缓存层:使用分布式缓存,如 Redis 存储商品信息,为高并发请求提供快速响应。
- 消息队列层:如 Kafka、RabbitMQ 等。当数据库商品信息更新时,发送一条消息到消息队列。
- 缓存刷新服务:监听消息队列,接收到商品更新消息后,负责刷新相应商品的缓存数据。
关键技术点
- 分布式缓存:Redis 的高可用集群部署,如 Redis Cluster,保证缓存服务的可靠性和扩展性。使用缓存分片,避免单个节点压力过大。
- 消息队列:确保消息的可靠传递,使用持久化机制。设置合理的消息队列容量,避免消息堆积。
- 缓存更新策略:采用“写后失效”策略,即数据库更新后,通过消息队列通知缓存更新。但在高并发场景下,为防止缓存击穿,对于热点数据可以使用“写时更新”结合“写后失效”策略。
实现思路
- 数据库更新:在商品价格等信息更新的数据库事务中,添加逻辑向消息队列发送商品更新消息,消息内容包含商品 ID 等关键信息。
- 消息队列接收与处理:缓存刷新服务监听消息队列,一旦接收到商品更新消息,从消息中解析出商品 ID。
- 缓存刷新:缓存刷新服务使用商品 ID,在 Redis 中定位对应的商品缓存数据并删除或更新。对于可能出现缓存击穿的热点数据,在更新数据库时,同时直接更新缓存中的数据,并设置较短的过期时间,之后再通过消息队列进行常规的缓存失效操作。
- 缓存击穿预防:对于热点数据,除了上述写时更新策略,还可以使用互斥锁(如 Redis 的 SETNX 命令)。在缓存失效时,只有一个请求能获取锁并去数据库加载数据更新缓存,其他请求等待,避免大量请求同时穿透到数据库。
- 缓存雪崩预防:设置缓存的过期时间时,使用随机时间,避免大量缓存同时过期。同时结合缓存预热,在系统启动时,预先加载部分热点数据到缓存。