ToB企服应用市场:ToB评测及商务社交产业平台

标题: Springboot实战——黑马点评之互斥锁 [打印本页]

作者: 诗林    时间: 2024-9-2 10:07
标题: Springboot实战——黑马点评之互斥锁
Springboot黑马点评(3)——优惠券秒杀

【还剩Redisson的最后两节没测试 后续补上】
另外,后期单独整理一份关于分布式锁笔记
1 优惠券秒杀实现

1.1 用户-优惠券订单计划

1.1.1 全局ID生成器

使用数据库自增ID作为订单ID存在题目

1.1.2 考虑全局唯一ID生成逻辑



当我们把当地日期时间localDateTime如2019-11-15T13:15:30转换为纪元秒时,那么效果将是1970-01-01T00:00:00Z到2019-11-15T13:15:30的时间差距,单元为秒,这也是我们平时说的时间戳


1.2 简单的秒杀券下单逻辑

数据库表中维护普通优惠券voucher以及秒杀优惠券killVoucher,秒杀优惠券除了具备普通优惠券的一般属性外,还具备库存、秒杀开始时间、秒杀结束时间。

1.2.1 用户下单秒杀券的逻辑:

(秒杀的前提是查验该用户是否登录状态,通用拦截器首先在该接口的最前端取到哀求头的用户信息,添加到该哀求对应的threadlocal中,同一刷新所有哀求登任命户/非登任命户的ttl,再经过前置登录拦截器查验threadlocal中用户是否为空即验证某些必须登录才气访问的接口)
鉴权后,接口首先检查当前时间是否在秒杀时间段内,其次检查该秒杀券的库存是否为0,两层逻辑检查完之后,即可扣减该秒杀券的库存-1
创建用户-秒杀券的订单记录

1.2.2 超卖题目



聚合报告显示并没有让100个线程生成100个订单,即成功率100/200

多线程并发安全题目

1.2.3 超卖题目的解决方案



(还有分段加锁方案)
1.3 一人一单逻辑实现

在创建订单时查询该用户id和该优惠券id的订单是否存在,需要保证类似优惠券 一人只能下一单,如果存在则扣除库存失败且不创建该订单。
但是该逻辑存在线程并发的题目,当同一用户的多线程并发访问时,将同时查询到订单不存在而创建新的订单,还是会存在一人多单。
1.3.1 解决一人多单题目


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4