面试题答案
一键面试1. 读写操作原则
- 读操作:优先从缓存读取数据。如果缓存命中,直接返回数据;若缓存未命中,再从数据库读取,然后将数据写入缓存并返回。
- 写操作:主要更新数据库,成功后再更新缓存。
2. 具体方案
-
双写模式:
- 操作步骤:当库存发生变化时,先更新数据库,数据库更新成功后立即更新缓存。例如在订单扣减库存场景,订单生成后,首先在数据库执行库存扣减操作,若成功则同步更新缓存中的库存数据。
- 优点:逻辑相对简单,在并发量不是极高的情况下能较好保证一致性。
- 缺点:在高并发场景下,可能出现数据库更新成功但缓存更新失败的情况,或者先更新缓存后更新数据库导致短时间内数据不一致。
-
失效模式:
- 操作步骤:当库存变化时,先更新数据库,数据库更新成功后删除缓存。下次读取时,缓存未命中,会从数据库读取最新数据并写入缓存。比如商品库存调整,修改数据库库存后,删除对应的缓存记录。
- 优点:相比双写模式,减少了缓存和数据库不一致的窗口时间,一定程度上降低了并发更新导致的不一致风险。
- 缺点:删除缓存后,后续的读请求会造成缓存穿透(大量请求同时未命中缓存,都去查询数据库),可以通过布隆过滤器等手段来减轻缓存穿透问题。
-
读写锁模式:
- 操作步骤:在对库存数据进行读写操作前,获取对应的读写锁。读操作获取读锁,可以并发读取;写操作获取写锁,此时不允许其他读写操作。例如在库存更新时,先获取写锁,成功获取后更新数据库和缓存,完成后释放锁;读库存时获取读锁,读取完成后释放锁。
- 优点:能有效保证数据一致性,在高并发场景下可以控制读写操作顺序。
- 缺点:引入锁机制会增加系统复杂度和性能开销,可能导致线程阻塞,影响系统并发处理能力。
3. 辅助措施
- 重试机制:对于缓存更新失败的情况,采用重试机制。例如设置重试次数和重试间隔,多次尝试更新缓存,确保缓存数据最终一致性。
- 异步更新:可以将缓存更新操作异步化,通过消息队列(如 Kafka 等)将库存变化消息发送到队列,消费者从队列中获取消息进行缓存更新,减少主业务流程的阻塞时间,提高系统并发性能。