场景:一秒内用户最多访问n次某个功能
导入redission的pom依赖
创建一个RedisLimit的类
里面创建一个限流doRateLimit方法,注入RedissonClient 类
@Service
public class RedisLimitManager {
@Resource
private RedissonClient redissonClient;
public void doRateLimit(String key){
}
}
方法很简单
首先用redissonClient创建一个限流器,并设置几秒几次
//创建一个限流器
RRateLimiter limiter = redissonClient.getRateLimiter(key);
//设置1秒2次
limiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS);
用户的操作来后,请求一个令牌,并判断是否获得,没获得就是请求太频繁了
boolean canOp = limiter.tryAcquire(1);
if (!canOp){
throw new BusinessException(ErrorCode.TO_MANY_REQUEST);
}
完成
@Service
public class RedisLimitManager {
@Resource
private RedissonClient redissonClient;
public void doRateLimit(String key){
//创建一个限流器
RRateLimiter limiter = redissonClient.getRateLimiter(key);
//设置1秒2次
limiter.trySetRate(RateType.OVERALL,2,1, RateIntervalUnit.SECONDS);
boolean canOp = limiter.tryAcquire(1);
if (!canOp){
throw new BusinessException(ErrorCode.TO_MANY_REQUEST);
}
}
}
按CTRL+shift+T创建RedisLimitManager 的测试类测试一下
@SpringBootTest
class RedisLimitManagerTest {
@Resource
private RedisLimitManager redisLimitManager;
@Test
void doRateLimit(){
String userId = "1";
for (int i = 0; i < 5; i++) {
redisLimitManager.doRateLimit(userId);
System.out.println("成功");
}
}
}
如下
好了,用在实际类似与用户下单这类调用方法中,一行代码就行
User loginUser = 获得当前登录的用户
redisLimitManager.doRateLimit("xxx_"+loginUser.getId());