实战Redisson实现优惠券微服务领劵接口的分布式锁

DBC 1.6K 0
给你一个小例子
    @Override
    public JsonData  addCoupon(long couponId, CouponCategoryEnum category) {

        LoginUser loginUser = LoginInterceptor.threadLocal.get();

        String lockKey = "lock:coupon:"+couponId;
        RLock rLock = redissonClient.getLock(lockKey);

        //多个线程进入,会阻塞等待释放锁
        rLock.lock();
        log.info("领劵接口加锁成功:{}",Thread.currentThread().getId());
        try{

            CouponDO couponDO = couponMapper.selectOne(new QueryWrapper<CouponDO>()
                    .eq("id", couponId)
                    .eq("category", category.name()));

            //优惠券是否可以领取
            this.checkCoupon(couponDO, loginUser.getId());

            //构建领劵记录
            CouponRecordDO couponRecordDO = new CouponRecordDO();
            BeanUtils.copyProperties(couponDO, couponRecordDO);
            couponRecordDO.setCreateTime(new Date());
            couponRecordDO.setUseState(CouponStateEnum.NEW.name());
            couponRecordDO.setUserId(loginUser.getId());
            couponRecordDO.setUserName(loginUser.getName());
            couponRecordDO.setCouponId(couponId);
            couponRecordDO.setId(null);

            //扣减库存
            int rows = couponMapper.reduceStock(couponId);

            if (rows == 1) {
                //库存扣减成功才保存记录
                couponRecordMapper.insert(couponRecordDO);

            } else {
                log.warn("发放优惠券失败:{},用户:{}", couponDO, loginUser);

                throw new BizException(BizCodeEnum.COUPON_NO_STOCK);
            }

        } finally {
            rLock.unlock();
            log.info("解锁成功");
        }

        return JsonData.buildSuccess();

    }
温馨提示

关键的位置 如图

实战Redisson实现优惠券微服务领劵接口的分布式锁插图

简洁得离谱!

发表评论 取消回复
表情 图片 链接 代码

分享