学习-秒杀系统设计
1.缓存结构设计
在商家创建优惠券模版时,会将其预热到缓存中,并向发送一个定时消息来修改优惠券为已到期状态,同时将优惠券模版Id加入到布隆过滤器中,具体缓存结构如下:
采用哈希结构,key:前缀+优惠券模版Id,value:优惠券模版元数据信息
Key: merchant:admin:coupon:template:12345
Hash:
{
"id": "12345",
"name": "用户下单满10减3特大优惠",
"source": "0",
"target": "1",
"goods": "G123456",
"type": "0",
"validStartTime": "2024-07-08 12:00:00",
"validEndTime": "2025-07-08 12:00:00",
"stock": "200",
"receiveRule": "{\"limitPerPerson\":1,\"usageInstructions\":\"3\"}",
"consumeRule": "{\"termsOfUse\":10,\"maximumDiscountAmount\":3,\"explanationOfUnmetConditions\":\"3\",\"validityPeriod\":\"48\"}"
}
2.秒杀流程梳理
秒杀流程主要包括以下步骤:
- 验证缓存是否存在(缓存预热 + 布隆过滤器+双重校验锁+缓存空对象);
- 校验优惠券活动时间有效性;
- 执行 Lua 脚本进行库存扣减和领取次数记录;
- 如果库存扣减成功,发送消息队列,将数据持久化到数据库中。
3.实现细节
3.1.验证缓存是否存在
利用 Redis 预热优惠券数据,并通过布隆过滤器+双重校验锁+缓存空对象避免缓存穿透和缓存击穿问题。当缓存不存在时,从数据库加载数据并更新缓存
具体实现可以看看我的另一篇文章https://blog.youkuaiyun.com/sjsjsbbsbsn/article/details/145239260?spm=1001.2014.3001.5501
3.2. Lua 脚本实现库存扣减和用户领取次数记录
通过 Lua 脚本实现原子性操作,包括以下功能:
- 验证库存是否足够;
- 检查用户领取次数是否达到上限;
- 更新库存和用户领取记录。
3.5消息队列操作入库,添加用户领取优惠券模板缓存记录
当缓存库存扣减成功时,生产者将消息发送的消息队列
具体消费者需要做以下事:
-
添加 Redis 用户领取的优惠券记录列表;
-
添加用户领取优惠券模板缓存记录;