学习-秒杀系统设计

学习-秒杀系统设计

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.秒杀流程梳理

秒杀流程主要包括以下步骤:

  1. 验证缓存是否存在(缓存预热 + 布隆过滤器+双重校验锁+缓存空对象);
  2. 校验优惠券活动时间有效性;
  3. 执行 Lua 脚本进行库存扣减和领取次数记录;
  4. 如果库存扣减成功,发送消息队列,将数据持久化到数据库中。

3.实现细节

3.1.验证缓存是否存在

利用 Redis 预热优惠券数据,并通过布隆过滤器+双重校验锁+缓存空对象避免缓存穿透和缓存击穿问题。当缓存不存在时,从数据库加载数据并更新缓存

具体实现可以看看我的另一篇文章https://blog.youkuaiyun.com/sjsjsbbsbsn/article/details/145239260?spm=1001.2014.3001.5501

3.2. Lua 脚本实现库存扣减和用户领取次数记录

通过 Lua 脚本实现原子性操作,包括以下功能:

  • 验证库存是否足够;
  • 检查用户领取次数是否达到上限;
  • 更新库存和用户领取记录。

3.5消息队列操作入库,添加用户领取优惠券模板缓存记录

当缓存库存扣减成功时,生产者将消息发送的消息队列
具体消费者需要做以下事:

  • 添加 Redis 用户领取的优惠券记录列表;

  • 添加用户领取优惠券模板缓存记录;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值