Java项目《谷粒商城》架构师级Java项目实战,对标阿里P6-P7,全网最强
总时长 104:45:00 共408P
此文章包含第315p-第p318的内容
秒杀上架
定时上架功能
@EnableAsync 异步
@EnableScheduling 定时调度
@Configuration 配置类

创建上架定时任务类和方法


在秒杀配置类里添加@EnableFeignClients 来开启Feign 使其具备Feign远程调用功能
然后创建一个调用优惠商品系统服务的Feign

计算3天的信息 使用LocalDate和LocalDateTime




格式化日期

@RableField(exist=false)这个注解代表这个字段不在数据库中存在 ,这个字段只是用来做临时封装


设置redis秒杀活动的前缀

由于我们调用的redisTemplate是String类型的 所以不能用List<Long>格式
stringredistemplate是用json序列化机制 而redistemplate是用jdk的序列化机制 所以存进redis会发生乱码

缓存活动信息
把List<Long>格式改成List<String>格式


记得设置redis过期时间
设置秒杀前缀

将sku信息存到redis里

添加远程Feign接口



这里的方法名可以修改 因为上面已经有路径了 所以改名也没事,也可以调到远程的那个方法


添加商品随机秒杀码

随机码是为了在秒杀开始的时候才会暴露,否则知道了action地址 会有脚本攻击

设置分布式信号量
如果100万的请求过来 只有100个库存,我们在这个信号量设置为100,有通过的请求减一 然后再放行查数据库等操作,如果压根就没减掉,则不需要后续操作,直接打回

引入redis

redis配置类

设置商品信号量的前缀


测试上架

改bug
改成String类型

改成skuid

也改成skuid

查看redis信息




幂等性处理
这里每次调用都会添加,需要发现如果存在就不添加


加分布式锁逻辑

添加锁名称

不管成功与否都要解锁 所以使用try-finally
建议(这锁粒度有点大 应该配合ID加锁)

代码判断
这里前面加锁了,所以已经是原子性的了

判断是否存在信号量

判断这个sku是否存在



这里不用判断第三个库存,他俩是一体的

如果多场次的数据都有同一个商品 这里会找不到 所以我们要给这三个都加上场次
建议(秒杀场次key其实直接用ID也可以,不用时间也行)


