使用incr控制库存的问题

需求:限制奖品每日发放次数,并且可以修改这个次数。
单纯使用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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值