分布式限流-redisson的信号量应用

358 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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 "流量过大,提示页面"; }