//分布式锁
@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.addCoupon(couponId, userId);
//库存减一
redisTemplate.boundZSetOps(coupon).incrementScore(couponId, -1);
} else if (i==0) {
//当redis库存售完时
//修改数据库库存为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();
}
}


