//分布式锁 @Component public class CurrentLock { @Autowired private RedisTemplate redisTemplate; //加锁方法 redis set默认情况下覆盖值, SETNX 没有我要set的key 就直接创建 并且把value放入 //如果有这个key就什么都不做返回false public boolean lock(String key,String value){ //如果返回true 说明redis中没有这个key 我是第一个到达的线程 if (redisTemplate.boundValueOps(key).setIfAbsent(value)){ //返true说明 return true; }; return false; } //释放锁 public boolean UnLock(String key,String value){ redisTemplate.delete(key); return true; } }
使用分布式锁抢购优惠券
@RestController public class RobCoupons { @Autowired private RedisTemplate redisTemplate; //yaml文件配置了常量 @Value("${com.rcm.coupon}") private String coupon; @Autowired private TabCouponTypeController tabCouponTypeController; @Autowired private TabCouponTypeUserController tabCouponTypeUserController; @Autowired private CurrentLock currentLock; private Object object; //抢购优惠券 @PostMapping("/RobCouponss") public Result RobCouponss(@RequestParam("userId") Integer userId, @RequestParam("couponId") Integer couponId) { String key = "redis_key"; //获取系统当前时间戳 当value String value = String.valueOf(System.currentTimeMillis() + 3000); //加锁 boolean lock = currentLock.lock(key, value); //用户如果拿到锁 if (lock) { //获取库存数量 Result result = tabCouponTypeController.queryRedisScore(couponId); //转类型 int i=new Double((Double) result.getData()).intValue(); //判断库存数量是否大于0 if (i> 0) { /*TabCouponTypeUserController tabCouponTypeUserController=new TabCouponTypeUserController();*/ //增加用户优惠券表绑定用户 tabCouponTypeUserController.addCoupon(couponId, userId); //库存减一 redisTemplate.boundZSetOps(coupon).incrementScore(couponId, -1); } else if (i==0) { //当redis库存售完时 /*if (i==0){*/ //修改数据库库存为0 Result result1 = tabCouponTypeController.ModifyInventory(couponId); /* }*/ return Result.Inventory_no(); }else { //抢购失败 return Result.Rob_coupons_false(); } boolean b = currentLock.UnLock(key, value); } return Result.RobCouponsTrue(); } }