面试题答案
一键面试设计思路
- 读写分离:
- 读操作:首先尝试从缓存读取数据。如果缓存命中,直接返回数据,以快速响应读请求。这能充分利用缓存的高速特性,减轻数据库压力。
- 写操作:写操作直接更新数据库,并在更新成功后,同步更新缓存。这样确保数据库作为数据的最终存储,保证数据一致性。同时在更新缓存时,使用一些优化策略,如批量更新缓存,减少缓存更新的频率。
- 缓存失效策略优化:
- 合理设置缓存过期时间:对于库存数据,根据业务特点设置较短的过期时间,确保数据不会长时间不一致。例如,可以根据商品的销售频率动态调整过期时间,销售频繁的商品过期时间短一些。
- 主动失效:在库存发生变化时,不仅更新缓存,还可以设置一个标记,表示库存数据已更新,当其他读请求到达时,若发现标记,强制重新加载缓存数据,而不是等待过期时间。
- 使用分布式缓存:
- 集群部署:采用分布式缓存集群,如 Redis Cluster,通过多节点部署提高缓存的读写性能和可用性。不同节点可以分担不同的读写请求,提高整体吞吐量。
- 数据分片:将商品库存数据按照一定规则(如商品 ID 的哈希值)分片存储在不同的缓存节点上,使得读写操作能够并行进行,避免单个节点的性能瓶颈。
技术手段
- 使用事务:
- 在数据库层面,对于涉及库存更新的操作,使用事务确保数据的一致性。例如,在扣减库存时,将库存更新操作和相关订单记录等操作放在一个事务中,保证要么全部成功,要么全部失败。
- 可以利用数据库提供的锁机制(如行锁、表锁),在事务执行期间锁定相关数据,防止并发更新导致数据不一致。但要注意锁的粒度和持有时间,避免影响系统性能。
- 消息队列:
- 在库存更新操作后,发送消息到消息队列。消息队列起到异步解耦的作用,将缓存更新操作从主业务流程中分离出来。
- 由专门的消费者从消息队列中获取消息并更新缓存,这样可以避免在高并发场景下,因缓存更新的耗时操作影响主业务流程的性能。同时,可以对消息进行批量处理,提高缓存更新效率。
- 缓存预加载:
- 在系统启动或者业务低峰期,预先加载热门商品的库存数据到缓存中。这样在高并发场景下,读请求能直接从缓存获取数据,减少数据库的查询压力,提高系统响应速度。
- 可以通过定时任务或者事件驱动的方式,定期更新预加载的缓存数据,保证数据的一致性。