限流算法是分布式领域一个经常被提起的话题,当系统的处理能力有限的时候,如何阻止计划外的请求对系统加压,需要考虑
除了控制流量,还有一个应用就是控制用户行为,避免垃圾请求
Redis简单限流
规定某个请求在规定的时间里,只允许发生N次,可以考虑使用zset的score值,圈出一个时间窗口,保留窗口内的数据,其他的去掉,其value值只需要保证唯一即可,
public class SimpleRateLimiter{
private Jedis jedis;
public SimpleRateLimiter(Jedis jedis){
this.jedis = jedis;
}
public boolean isActionAllowed(String userId,String actionKey,int period,int maxCount){
String key = String.format("hist:%S%S",userId,a ctionKey);
long nowTs = System.currentTimeMillis();
Pipeline.pipe = jedis.pipelined();
pipe.multi();
pipe.zadd(key,notTs,""+nowTs);
pipe.zremrangeByScore(key,0,nowTs-period*1000);
Response<Long> count = pipe.zcard(key);
pipe.expire(key,period+1);
pipe.exec();
pipe.close();
return count.get() <= maxCount;
}
public static void main(String args[]){
Jedis jedis = new Jedis();
SimpleRateLimiter limiter = new SimpleRateLimiter(jedis);
for(int i = 0;i<20;i++){
System.out.println(limiter.isActionAllowed("key","reply",60,5));
}
}
}