这里简单说一下用Redis实现令牌桶算法的方法。
用户每一次访问请求的时候,从redis中获取一个令牌,如果拿到令牌了,就说明没有超出限制,就通过这个请求,相反如果拿不到令牌就拦截这个请求或者返回错误信息,下面是代码实现部分。
1.定义Redis限流规则类
public final class RRateLimiter {
private String rediskey = "limit";
private Long all_conut = 20L;//令牌的总数量
private Long conut = 10L;//生产的令牌数量
private Long time = 5L;//产生的令牌的时间间隔
private TimeUnit timetype = TimeUnit.SECONDS;
private ListOperations<String,Object> redis;
private void start() {
new Thread(() -> {
try {
while (true) {
timetype.sleep(time);
if(redis.size(rediskey)<all_conut)
LongStream.range(0,conut).forEach(x->redis.rightPush(rediskey,UUID.randomUUID().toString().replace("-","")));
}
} catch(Exception e){}
}).start();
}
public RRateLimiter(ListOperations<String, Object> list, String rediskey, Long conut, Long time,
TimeUnit timetype) {
th