面试知识库

秒杀系统 → 限流 → 库存扣减 → 分布式锁 追问链#

追问路径#

涉及知识点#

核心串联逻辑#

  1. 流量漏斗:前端拦截90%(按钮/验证码) → 网关限流(令牌桶) → 应用层限流(Sentinel) → Redis预扣库存 → MQ异步下单
  2. 库存方案选型:万级QPS用Redis预扣(单key 10万+ QPS);超高竞争用分段库存(N段×10万=N*10万)
  3. 异步下单:Redis预扣成功后发MQ,消费者创建订单+扣DB库存(乐观锁),失败重试+DLQ
  4. 超时取消:RocketMQ延迟消息最简单(18个延迟级别),30分钟未支付自动取消+回补Redis库存
  5. 热点防护:秒杀商品是典型热key,用本地缓存(Caffeine 1s TTL) + Redis从库读取分摊压力
  6. 代码示例
    -- Redis Lua原子扣减库存
    local stock = tonumber(redis.call('get', KEYS[1]))
    if stock > 0 then
        redis.call('decr', KEYS[1])
        return 1  -- 扣减成功
    end
    return 0  -- 库存不足
    lua

面试回答串联#

30秒速答#

“秒杀系统前端限流+后端削峰+异步下单。防超卖用Redis Lua原子预扣库存,成功后MQ异步落库。高竞争用分段库存分散压力。限流网关层令牌桶+应用层Sentinel,热点数据用本地缓存Caffeine。“

2分钟展开答#

“秒杀系统的核心是瞬时高并发下防超卖。架构上做流量漏斗:前端按钮置灰+验证码拦截90%请求,网关层令牌桶限流,应用层Sentinel做兜底。库存扣减用Redis Lua脚本原子执行decr+判断≥0,单key可以达到10万+ QPS。如果更高并发可以用分段库存——把1000库存拆成10段每段100,请求随机路由到不同段分散竞争。Redis预扣成功后发MQ异步创建订单,消费者用乐观锁(version字段)扣减DB库存防万一超卖。消费失败重试+死信队列兜底。订单30分钟未支付用RocketMQ延迟消息自动取消并回补Redis库存。热点商品是典型热key问题,用Caffeine本地缓存设1s短TTL,加上Redis从库读取分摊压力。前端做页面静态化+CDN加速+动静分离,减少后端请求量。“

相关追问链#