1. 引入Redisson
2. 使用RedissonClinet实现
代码如下:
java
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. 使用用限流
如下:
java
// 限流, 一天只能访问10次, 被限流会抛异常
String limitKey = "prefix:" + loginUser.getId();
int limitTime = 24 * 60 * 60;
redisLimiterManager.doRateLimit(limitKey, 10, limitTime, "今天的请求次数为0");