老师您好,我这边存在以下几个疑问?

来源:7-5 redis预减库存,rabbitmq异步下单

BillyWebber

2020-08-01

  1. 您的秒杀逻辑里面为什么没有对秒杀的商品对象加上分布式锁再将请求压进消息队列来保证库存的有序性,没有分布式锁在并发量大的时候难道不会出现超卖现象吗?
  2. rabbitmq的接收消息逻辑是不是一定要等前一条消息消费完才会消费下一条消息?
    	model.addAttribute("user", user);
    	if(user == null) {
    		return Result.error(CodeMsg.SESSION_ERROR);
    	}
    	//验证path
    	boolean check = miaoshaService.checkPath(user, goodsId, path);
    	if(!check){
    		return Result.error(CodeMsg.REQUEST_ILLEGAL);
    	}
    	//内存标记,减少redis访问
    	boolean over = localOverMap.get(goodsId);
    	if(over) {
    		return Result.error(CodeMsg.MIAO_SHA_OVER);
    	}
    	//预减库存
    	long stock = redisService.decr(GoodsKey.getMiaoshaGoodsStock, ""+goodsId);//10
    	//减少库存后,将减少库存的商品减一后put进一个Map中
		if(stock < 0) {
    		 localOverMap.put(goodsId, true);
    		return Result.error(CodeMsg.MIAO_SHA_OVER);
    	}
    	//判断是否已经秒杀到了
    	MiaoshaOrder order = orderService.getMiaoshaOrderByUserIdGoodsId(user.getId(), goodsId);
    	if(order != null) {
    		return Result.error(CodeMsg.REPEATE_MIAOSHA);
    	}
    	//入队
    	MiaoshaMessage mm = new MiaoshaMessage();
    	mm.setUser(user);
    	mm.setGoodsId(goodsId);
    	sender.sendMiaoshaMessage(mm);
    	return Result.success(0);//排队中
写回答

1回答

若鱼1919

2020-08-01

1.可以看下git上的课程常见问题,看下是如何保证不卖超的
2.多个消费者并发出队 无法保证顺序

0
4
若鱼1919
回复
BillyWebber
能保证不超卖
2020-08-01
共4条回复

Java秒杀系统方案优化 掌握海量访问通用解决方案

各种缓存/JSR303参数检

2695 学习 · 941 问题

查看课程