MST

星途 面试题库

面试题:高并发下缓存设计的数据一致性保障

假设在一个高并发的电商系统中,商品库存同时存在于数据库和缓存中。用户频繁进行商品购买操作,这会涉及到库存的扣减。请设计一套缓存更新机制,确保在高并发情况下,缓存和数据库的数据一致性,同时尽量减少缓存穿透和缓存雪崩的风险。
38.5万 热度难度
后端开发缓存设计

知识考点

AI 面试

面试题答案

一键面试
  1. 扣减库存操作流程
    • 第一步:缓存预检查
      • 首先尝试从缓存中获取商品库存。如果缓存中库存数量小于等于0,直接返回商品已售罄信息给用户,避免不必要的数据库查询,减少缓存穿透风险。
    • 第二步:分布式锁
      • 由于是高并发场景,为防止多个请求同时操作库存导致数据不一致,使用分布式锁(如Redis的SETNX命令实现的锁)。只有获取到锁的请求才能继续进行库存扣减操作。
    • 第三步:缓存与数据库操作
      • 获取锁成功后,再次从缓存中获取库存数量。这一步是为了防止在获取锁的过程中,其他请求已经更新了缓存。
      • 检查库存数量是否足够,如果足够则扣减缓存中的库存数量。
      • 紧接着更新数据库中的库存数量。这里采用事务操作,确保数据库操作的原子性。如果数据库更新失败,需要将缓存中的库存数量恢复到原来的值。
    • 第四步:释放锁
      • 无论库存扣减操作是否成功,都要释放分布式锁,让其他请求有机会进行操作。
  2. 缓存更新策略
    • 主动更新:在库存扣减成功后,主动更新缓存,确保缓存中的库存数据与数据库保持一致。可以使用消息队列(如Kafka),将库存更新消息发送到队列中,由专门的消费者来更新缓存,这样可以异步处理,减少对业务主线程的影响。
    • 过期策略:设置缓存的过期时间,一般设置为一个较短的合理时间(如几分钟)。过期后,下一次请求会重新从数据库加载数据到缓存,从而保证数据的一致性。同时为避免缓存雪崩,对不同商品的缓存过期时间设置一定的随机偏移量,让缓存过期时间分散开来。
  3. 缓存穿透预防
    • 布隆过滤器:在系统启动时,将数据库中所有商品的主键(如商品ID)构建成一个布隆过滤器。当有购买请求时,先通过布隆过滤器判断该商品ID是否存在。如果不存在,直接返回商品不存在信息,避免查询数据库,从而防止缓存穿透。
    • 空值缓存:当查询数据库发现商品不存在时,将该商品ID对应的空值结果也缓存起来,并设置较短的过期时间,这样后续相同的请求直接从缓存获取空值,不再查询数据库。
  4. 缓存雪崩预防
    • 多级缓存:采用多级缓存架构,如一级缓存使用本地缓存(如Guava Cache),二级缓存使用分布式缓存(如Redis)。当分布式缓存出现故障时,本地缓存可以继续提供服务,减少对业务的影响。
    • 服务降级:当检测到缓存大面积失效,系统负载过高时,启动服务降级策略。例如,暂时关闭一些非核心业务,优先保证商品库存查询和扣减等核心业务的正常运行,避免系统崩溃。