面试题答案
一键面试实现思路
- 写请求处理:
- 先更新数据库,确保数据库数据的准确性。这是因为数据库是数据的持久化存储,是数据的最终可靠来源。
- 数据库更新成功后,立即删除缓存中的对应商品库存数据。这样做是为了避免下次读请求从缓存中读取到旧数据,因为缓存数据一旦过期或被删除,读请求就会从数据库重新加载最新数据。
- 读请求处理:
- 首先尝试从分布式缓存中读取商品库存数据。因为缓存读取速度快,能快速响应大量读请求,提升系统性能。
- 如果在缓存中未命中(缓存过期或被删除),则从数据库中读取商品库存数据,并将读取到的数据重新写入缓存,同时设置合适的缓存过期时间,以便下次读请求能直接从缓存获取数据。
可能涉及的技术手段
- 数据库事务:在更新数据库库存数据时,使用数据库事务来保证数据更新的原子性,防止部分更新成功部分失败的情况,确保数据一致性。例如在关系型数据库(如MySQL)中,可以使用
BEGIN
、COMMIT
和ROLLBACK
语句来管理事务。 - 缓存一致性协议:对于分布式缓存(如Redis),可以利用其发布 - 订阅机制。当库存数据更新后,在删除本地缓存的同时,通过发布 - 订阅向其他节点广播缓存失效消息,让其他节点也及时删除对应的缓存数据,保证整个分布式缓存环境的数据一致性。
- 重试机制:由于网络等原因,可能出现缓存删除失败的情况。此时可以引入重试机制,比如在写请求更新数据库成功但缓存删除失败时,通过一定的重试策略(如指数退避算法)多次尝试删除缓存,直到缓存删除成功或者达到最大重试次数。若达到最大重试次数仍失败,可以记录日志并进行人工干预。
- 异步处理:为了不影响写请求的响应速度,可以将缓存删除操作异步化。例如使用消息队列(如Kafka、RabbitMQ等),在数据库更新成功后,将缓存删除任务发送到消息队列中,由专门的消费者异步处理缓存删除操作。这样可以将写请求的处理时间主要花费在数据库更新上,提高系统的并发处理能力。同时,消息队列也可以保证缓存删除任务的可靠性,若处理失败可以进行重试。