Redisson实现限流

1. 引入Redisson

参考: 这篇文章即可。

2. 使用RedissonClinet实现

代码如下:


import org.redisson.api.RRateLimiter;
import org.redisson.api.RateIntervalUnit;
import org.redisson.api.RateType;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * redis 限流管理器
 * @author xxx
 * @version 1.0
 * @date xxx
 */

@Service
public class RedisLimiterManager {
    @Resource
    private RedissonClient redissonClient;

    /**
     * 限流操作
     *
     * @param key 限流key
     * @param limit 指定时间内允许的请求数
     * @param ttl 指定时间
     * @param ttl message 限流的提示信息
     */
    public void doRateLimit(String key, int limit, int ttl, String message) {
        // 创建限流器
        RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);
        rateLimiter.trySetRate(RateType.OVERALL, limit,
                ttl, RateIntervalUnit.SECONDS);
        // 获取令牌
        boolean result = rateLimiter.tryAcquire(1);
        if (!result){
            throw new RuntimeException(message);
        }
    }
}

3. 使用用限流

如下:

// 限流, 一天只能访问10次, 被限流会抛异常
String limitKey = "prefix:" + loginUser.getId();
int limitTime = 24 * 60 * 60;
redisLimiterManager.doRateLimit(limitKey, 10, limitTime, "今天的请求次数为0");
可以使用Redisson提供的分布式限流工具来实现自定义注解接口限流。具体实现步骤如下: 1. 定义一个注解,例如@RateLimiter,用于标记需要进行限流的接口方法。 2. 在注解中定义相关属性,例如限流的速率、限流的时间单位等。 3. 使用AOP技术,在接口方法执行前判断当前请求是否超过了限流速率,如果超过则拒绝请求。 4. 在AOP切面中使用Redisson提供的分布式锁来实现限流。 下面是一个简单的示例代码: ```java @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface RateLimiter { int rate() default 10; // 速率 TimeUnit timeUnit() default TimeUnit.SECONDS; // 时间单位 } @Aspect @Component public class RateLimiterAspect { private final RedissonClient redissonClient; public RateLimiterAspect(RedissonClient redissonClient) { this.redissonClient = redissonClient; } @Around("@annotation(rateLimiter)") public Object rateLimit(ProceedingJoinPoint joinPoint, RateLimiter rateLimiter) throws Throwable { String key = "rate_limiter:" + joinPoint.getSignature().toLongString(); RRateLimiter limiter = redissonClient.getRateLimiter(key); limiter.trySetRate(RateType.OVERALL, rateLimiter.rate(), rateLimiter.timeUnit()); if (limiter.tryAcquire()) { return joinPoint.proceed(); } else { throw new RuntimeException("接口访问过于频繁,请稍后再试!"); } } } ``` 在上面的代码中,我们定义了一个@RateLimiter注解,并在AOP切面中使用Redisson提供的RRateLimiter来实现限流。在接口方法执行前,我们会先获取到当前接口方法的签名,然后使用签名作为Redisson的key,创建一个RRateLimiter对象,并设置限流速率。最后,我们使用tryAcquire()方法来尝试获取锁,如果获取成功则执行接口方法,否则抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值