高并发秒杀系统,假设一秒内10w请求进来。 这件商品的库存为100件,我全部放进redis缓存里面。redis是单线程,并且decr减少操作是原子操作,那样qps达到上万没问题吧。 然后我执行下面的操作
long num = redis.opsForValue().increment(key, -1); if (num <= 0) { return "秒杀失败"; } else { //入队 或者 不入队 mq.send(new HappyLock(key, Integer.parseInt(num + ""))); } return "";
这个if,else可以将9.9k的无效请求全部直接返回 库存不足,秒杀失败。 那么只有100个请求还需要放进队列异步处理么? 难道mysql连100个请求都处理不好么??? 这点很是奇怪,希望可以有大佬解答一下
异步队列我知道有什么用,减缓压力。 但是上述代码的秒杀系统适用么?######队列和适用性,还是看场景需求 。但是这个代码就让我蛋疼了,返回一个空字符串,是为证明啥?######这里之所以进MQ,是为了保证后续对任务的处理是一定能成功的。如果不进MQ,而直接做业务操作,万一业务 操作那一层崩了呢?这个被扣减掉的商品要怎么办?######回复 @奔跑吧蛋蛋 : 用mq可以快速给前端反馈,不必让用户等待太长时间,但然需要看具体情况,得看秒杀到后倒地有多少个动作需要被触发######应该是处理并发问题吧######回复 @奔跑吧蛋蛋 : 你的else一般是要带有大量的业务处理逻辑的吧。也就是说,整个事务时间有可能会比较长。而且,在你的事务提交之前,也就是数据库那一边也许还没有到执行的时候。大量的线程在操作,Tomcat或者是其他的容器要尽快的回收线程,以接受后续的处理。也许还没到DB那一层,web 容器那一层的资源就有可能先行消耗过多了。######这段代码就是为了解释整个流程,没有具体的作用。在else那里 可以选择入队 或者不选择入队。但你说业务层崩了,这个我就不是很能理解了。100个请求也蹦,那mysql到底有多差劲啊。。。。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。