基于Redis的Redisson的分布式信号量Semaphore
;Java对象RSemaphore
采用了与 juc 包下 Semaphore
相似的接口和用法。同时还提供了异步(Async)、反射式(Reactive)、RxJava2标准的接口。
模拟车库停车, 3个车位
//停车
@GetMapping("/park")
@ResponseBody
public String park() throws InterruptedException {
// 在redis中存 pack = 3
RSemaphore pack = redisson.getSemaphore("pack");
pack.acquire(); //获取一个信号量,阻塞
return "pack";
}
//离开
@GetMapping("/leave")
@ResponseBody
public String leave(){
RSemaphore pack = redisson.getSemaphore("pack");
pack.release();
return "go";
}
测试:
访问:http://localhost:8080/park 3次,第四次时阻塞
访问:http://localhost:8080/leave ,上面通行
信号量也可以做分布式限流
@GetMapping("/park")
@ResponseBody
public String park() throws InterruptedException {
//在redis中存 pass = 10000,超过10000并发阻塞
RSemaphore pack = redisson.getSemaphore("pass");
boolean flag = pass.tryAcquire();//尝试获取一个信号量,不阻塞
if(flag){
//业务逻辑
}else{
return "error";
}
}