secKill项目 --- Redis预减库存的存在的问题 及 库存补偿

秒杀项目中,Redis预减库存可能导致负数库存,需要补偿以确保最终一致性。文章讨论了为何需要补充库存,包括订单重复、消费失效等情况,并提出先判断Redis库存再减一的优化方案。同时,分析了库存补充的其他场景,如生产者和消费者的处理,以及避免不必要的库存检查。通过库存补偿,实现了Redis和数据库库存的一致性。
摘要由CSDN通过智能技术生成

本文建立在已完成可靠性传输的基础上,建议先阅读另一篇博文,不然可能难以理解。secKill项目 — 可靠性传输的实现 及 易错点总结


先看看秒杀接口的源代码:

	@RequestMapping(value="/{path}/do_miaosha",method=RequestMethod.POST)
	@ResponseBody
	public Result<Integer> doMiaosha(Model model,MiaoshaUser user,
			@RequestParam(value="goodsId",defaultValue="0") long goodsId,
			@PathVariable("path")String path) {
   
		model.addAttribute("user", user);
        
		//0.判断用户是否非空、秒杀路径是否正确
        
        // 1. 查看内存标记,看是否已结束
        boolean over = localOverMap.get(goodsId);
        if (over) {
   
            return Result.error(CodeMsg.MIAO_SHA_OVER);
        }
        
		//2.预减少redis的库存
		long stock=redisService.decr(GoodsKey.getMiaoshaGoodsStock,""+goodsId);
		//3.判断减少数量1之后的stock,减少到0一下,则代表之后的请求都失败,直接返回
		if(stock<0) {
   
             //进行内存标记
             localOverMap.put
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值