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也可以,不用时间也行)