分布式锁
一: 使用redis:
@PostMapping("/v1/getLock2")
public BaseResponse getLock2(@RequestBody GxyTeacherInfoDto dto) throws Exception{
String key = "product_001";
String lockvalue = UUID.randomUUID().toString();
Boolean bool = stringRedisTemplate.opsForValue().setIfAbsent(key,lockvalue,10,TimeUnit.SECONDS);
if(!bool) {
System.out.println("err");
return BaseResponse.error();
}
try {
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue().set("stock",realStock+"");
System.out.println("售卖成功,剩余" + realStock);
return BaseResponse.ok();
} else {
System.out.println("err2");
return BaseResponse.error();
}
} finally {
if(lockvalue.equals(stringRedisTemplate.opsForValue().get(key))) {
stringRedisTemplate.delete(key);
}
}
}
二: 使用Redisson:
@Bean public Redisson redisson(){ Config config = new Config(); config.useSingleServer().setAddress("redis://IP:port"); return (Redisson)Redisson.create(config); }
@PostMapping("/v1/getLock3")
public BaseResponse getLock3(@RequestBody GxyTeacherInfoDto dto) throws Exception{
String lockKey = "product_001";
RLock redissonLock = redisson.getLock(lockKey);
try {
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
if (stock > 0) {
int realStock = stock - 1;
stringRedisTemplate.opsForValue().set("stock",realStock+"");
System.out.println("售卖成功,剩余" + realStock);
return BaseResponse.ok();
} else {
System.out.println("err2");
return BaseResponse.error();
}
} finally {
redissonLock.unlock();
}
}
浙公网安备 33010602011771号