场景:车库停车。
@Autowired private RedissonClient redissonClient; /** * 尝试获取车位 [信号量] * 信号量:也可以用作限流 * 先在redis中设置一下,有几个车位。 设置park键值 */ @ResponseBody @GetMapping("/index/park") public String park() { RSemaphore park = redissonClient.getSemaphore("park"); boolean acquire = park.tryAcquire(); //占车位 return "获取车位 =>" + acquire; } /** * 尝试释放车位 */ @ResponseBody @GetMapping("/index/go/park") public String goPark() { RSemaphore park = redissonClient.getSemaphore("park"); park.release();//释放一个车位 return "ok => 车位+1"; }
==================================
也可以做分布式限流。
做限流 可以使用 tryAcquire方法。 分布式限流,如果要访问这个服务,获取信号量,做完就+1这样子。
acquire 是阻塞式的,如果没有车位,就等着
tryAcquire的话,就不会,他返回一个bool,如果没车位就算了,不会阻塞着。
如果很多流量过来,就可以tryAcquire,没获取到,正好,可以指定一下没获取到的逻辑,返回错误页面什么的。或者说,服务器繁忙什么的。