开源项目miaosha学习(三)

上一章介绍到访问/{path}/confirm也就是秒杀系统的核心位置
其实一开始不太理解生成秒杀地址的意义,后来查了下了解到秒杀地址的意义是为了防止用户获得秒杀的url而越过前端界面直接秒杀,所以就用uuid的md5码来生成,这样连程序设计人员也不知道地址是什么,加上本身对于秒杀的Controller都通过自定义注解配合拦截器来实现限流,所以不会出现刷单的现象
好了,现在进入/{path}/confirm 处理器

秒杀处理器首先会检查上一步生成的秒杀路径是否正确,检查方式也很简单直接查redis就行
在这里插入图片描述
继续下一步,可以看到使用了zookeeper和内存map来判断产品是否售卖完毕
在这里插入图片描述
其中集群中每个主机通过watcher来监听是否有单个产品已经售罄,则可以将所有主机的内存map设置商品售罄标志(具体的第一次启用是在后面的扣减redis库存中出现)
在这里插入图片描述
继续就会设置排队标记,其实这里没太看懂,因为后面有个地方需要用到标记但是key值不太一样,感觉像是bug,目前不太懂这里啥意思,只能理解为当用户点击太多次的时候只有一个请求能进入下一步?
在这里插入图片描述
进行时间校验,其实感觉这里也不太必要,因为用户只有在活动期间内才能点击秒杀按钮,但是有一种情况是用户在活动期间刷新页面使得按钮enable然后在活动结束后才进行点击,事实情况是已经秒杀结束,如果前面的库存还存在的话,这里需要判定秒杀结束

到这里就要判断是否存在订单的问题了,不能让黄牛刷单是吧
在这里插入图片描述
但其实这里的话判断订单其实是一个比较蛋疼的事情,原因是这里对访问数据库了,但是从上面的代码可以看到并没有通过redis减少对数据库访问的地方,所以每有一个用户都能访问实际的数据库,所以这里就需要更改,改成对redis的访问即可,在最后通过MQ实现真正减数据库库存的地方其实可以对redis的增添标记的用户订单完成标记地方
改成redis的话会有一个坏处是在这里
在这里插入图片描述
会有个时间差,可能会放走一部分已经秒杀掉的用户,但是其实并不需要担心,因为在最后减库存的时候他们还是减不掉的
所以改成这样

String redisKey = CommonMethod.getMiaoshaOrderRedisKey(String.valueOf(user.getNickname()), String.valueOf(goodsId));
            if(redisService.exit(redisKey))
            {
                result.withError(REPEATE_MIAOSHA.getCode(), REPEATE_MIAOSHA.getMessage());
                  return result;
            }

后面还有扣减redis库存和发送MQ消息两件事,中间问题比较多下一章再说

开源项目miaosha学习(四)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值