Redis做简单限流

限流算法是分布式领域一个经常被提起的话题,当系统的处理能力有限的时候,如何阻止计划外的请求对系统加压,需要考虑

除了控制流量,还有一个应用就是控制用户行为,避免垃圾请求

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));
    }
  }
}

猜你喜欢

转载自blog.csdn.net/weixin_37632716/article/details/121000900
今日推荐