import com.sun.xml.internal.ws.api.ha.StickyFeature;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
public class test{
@PostMapping
public String deductStock(){
String lockKey = "product_101";
// stringRedisTemplate.opsForValue().setIfAbsent(lockKey,"zhuge");
// stringRedisTemplate.expire(lockKey, TimeUnit.SECONDS);
// String clientId = UUID.randomUUID().toString();
// Boolean result = StringRedisTemplate.opsForValue().setIfAbsent(lockKey,clientId,30,TimeUnit.SECONDS);
// if (!result){
// return "error_code";
// }
RLock redissonLock = redisson.getLock(lockKey);
try{
//加锁
redissonLock.lock();
int stock = Integer.parseInt(stringRedisTemplate.opsForValue().get("stock"));
if (stock>0){
int realStock = stock - 1;
stringRedisTemplate.opsForValue().set("stock",realStock + "");
System.out.println("扣减成功,剩余库存:" + realStock);
}else {
System.out.println("扣减成功,库存不足");
}
}finally {
redissonLock.unlock();
// if (clientId.equals(stringRedisTemplate.opsForValue().get(lockKey))){
// stringRedisTemplate.delete(lockKey);
// }
}
return "end";
}
}
具体原理就是redis的setnx,如果该键存在,证明有人在使用该锁,如果不存在该键,则占用锁成功,继续进行下一步操作
https://gitee.com/gitee_aosiding/notes