需求:限制奖品每日发放次数,并且可以修改这个次数。 单纯使用incr或decr都不能解决可以修改次数的问题,例如,使用incr,初始次数1,调用2次后,redis的值为2,这时修改限制次数为2,再次调用,则incr后的值为3,而按需求来说,这次调用应该是成功的,所以,怎么办呢?你可以将这个过程想象成往试管里滴水,当试管满了后,新滴进来的水自然会流掉,永远保持满的状态,对应incr,当超过限制的值后,保持最大值就好了,就是将新增的值扣减1。 jedisTemplate.decr(RedisConstants.MG_CHECK_PRIZE_INFO_KEY + getPrizeName(prizeInfo)); if(jedisTemplate.setnxex(RedisConstants.MG_PRIZE_RECEIVE_LOCK_KEY + prizeInfo.getId(), "lock", 1)){ String redisKey = RedisConstants.MG_CHECK_PRIZE_INFO_KEY + getPrizeName(prizeInfo); int totalUsed = jedisTemplate.incr(redisKey).intValue(); if( totalUsed > prizeInfo.getDayLimits()) { jedisTemplate.decr(RedisConstants.MG_CHECK_PRIZE_INFO_KEY + getPrizeName(prizeInfo)); LOG.info("[CheckConditionService.checkPrizeInfo] 奖品发放数量达到每日限制,prizeInfo:{},memberId:{},totalUsed:{}",JsonUtil.toString(prizeInfo),memberId,totalUsed); return CheckPrizeInfoVo.creatFailVo(BizzExEnum.PRIZE_OVER_DAY_LIMIT_ERROR); } }else { LOG.info("[CheckConditionService.checkPrizeInfo] 获取锁失败,memberId:{},prizeInfo:{}",memberId, JsonUtil.toString(prizeInfo)); return CheckPrizeInfoVo.creatFailVo(BizzExEnum.REQUEST_REPEAT); }
使用incr控制库存的问题
最新推荐文章于 2023-03-22 16:39:10 发布