开发者社区> 问答> 正文

高并发秒杀系统redis缓存的问题 : 配置报错 

高并发秒杀系统,假设一秒内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个请求都处理不好么??? 这点很是奇怪,希望可以有大佬解答一下

展开
收起
kun坤 2020-06-04 13:13:23 927 0
1 条回答
写回答
取消 提交回答
  • 异步队列我知道有什么用,减缓压力。 但是上述代码的秒杀系统适用么?######队列和适用性,还是看场景需求 。但是这个代码就让我蛋疼了,返回一个空字符串,是为证明啥?######这里之所以进MQ,是为了保证后续对任务的处理是一定能成功的。如果不进MQ,而直接做业务操作,万一业务 操作那一层崩了呢?这个被扣减掉的商品要怎么办?######回复 @奔跑吧蛋蛋 : 用mq可以快速给前端反馈,不必让用户等待太长时间,但然需要看具体情况,得看秒杀到后倒地有多少个动作需要被触发######应该是处理并发问题吧######回复 @奔跑吧蛋蛋 : 你的else一般是要带有大量的业务处理逻辑的吧。也就是说,整个事务时间有可能会比较长。而且,在你的事务提交之前,也就是数据库那一边也许还没有到执行的时候。大量的线程在操作,Tomcat或者是其他的容器要尽快的回收线程,以接受后续的处理。也许还没到DB那一层,web 容器那一层的资源就有可能先行消耗过多了。######这段代码就是为了解释整个流程,没有具体的作用。在else那里 可以选择入队 或者不选择入队。但你说业务层崩了,这个我就不是很能理解了。100个请求也蹦,那mysql到底有多差劲啊。。。。

    2020-06-05 13:16:25
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
基于英特尔 SSD 的虚拟机缓存解决SSD 立即下载
用户态高速块缓存方案 立即下载
高性能Web架构之缓存体系 立即下载