本文已参与「新人创作礼」活动,一起开启掘金创作之路。
redisson信号量的解决方案:
有一个车库3个车位, 场景描述:停车场有3个车位 存在redis的park key为3 调用park方法一次 redis的park -1 当park变成0时,park()方法就无法占用成功 调用 go方法一次 redis的park就 +1
@GetMapping("/park")
@ResponseBody
public String park() throws InterruptedException {
RSemaphore park = redisson.getSemaphore("park");
park.acquire(); //阻塞方法 获取一个信号量 直到获取成功 占一个车位 没有车位等go()释放
boolean b = park.tryAcquire();//阻塞方法 尝试去获取车位 有车位就停车 没车位就不等了
if(b){
return "ok 执行业务";
}else{
return "流量过大,提示页面";
}
}
@GetMapping("/go")
@ResponseBody
public String go() throws InterruptedException {
RSemaphore park = redisson.getSemaphore("park");
park.acquire(); //释放一个信号 空出一个车位
return "ok";
}
区别使用:
park.acquire() 阻塞方法 获取一个信号量 直到获取成功 占一个车位 没有车位等go()释放
boolean b = park.tryAcquire(); 来这里瞄一眼,尝试去获取车位 有车位就停车 没车位就不等 所以: if(b){ return "ok 执行业务"; }else{ return "流量过大,提示页面"; }