美文网首页
【redis】redis分布式限流

【redis】redis分布式限流

作者: 浅浅星空 | 来源:发表于2019-02-27 08:27 被阅读3次
    import java.util.concurrent.TimeUnit;
    import lombok.extern.slf4j.Slf4j;
    import org.redisson.api.RMapCache;
    import org.redisson.api.RedissonClient;
    import org.redisson.client.codec.IntegerCodec;
    import org.springframework.beans.factory.annotation.Autowired;
    
    /**
     * @author ChunLian.Yang
     * @since 2018-02-02
     */
    @Slf4j
    public class TestRedissonRate {
    
      private final RedissonClient redisClient;
      private final String key = "msgRateLimiter:" + "test";
      private final int limiter = 10000;
    
      @Autowired
      public TestRedissonRate(RedissonClient redisClient) {
        this.redisClient = redisClient;
      }
    
      //服务启动的时候,先清一下 redis,防止 count 出错
      public void reload() {
        RMapCache<String, Integer> msgRateLimit =
            redisClient.getMapCache(key, IntegerCodec.INSTANCE);
        if (msgRateLimit.containsKey(key)) {
          msgRateLimit.delete();
        }
      }
    
      //该方法可以配合 mq,结果是 true 的话就 ack,false 的话就 reject
      public boolean handleMessage() {
        //分布式场景下的限流
        //String key = "msgRateLimiter:" + MsgConstants.MsgType.APP_PUSH[0];
        RMapCache<String, Integer> msgRateLimit =
            redisClient.getMapCache(key, IntegerCodec.INSTANCE);
        Integer count;
        try {
          msgRateLimit.putIfAbsent(key, 0, 1L, TimeUnit.SECONDS);
          count = msgRateLimit.addAndGet(key, 1);
          log.info("get redis counter:{}", count);
          if (count < limiter) {
            //此处是你要执行的代码
            return true;
          }
          log.warn("超过限流:{}", count);
        } catch (Exception e) {
          log.error("err", e);
        }
        return false;
      }
    }
    
     <dependency>
          <groupId>org.redisson</groupId>
          <artifactId>redisson</artifactId>
          <version>3.4.1</version>
        </dependency>
    

    引用:https://my.oschina.net/yangchunlian/blog/1617766

    相关文章

      网友评论

          本文标题:【redis】redis分布式限流

          本文链接:https://www.haomeiwen.com/subject/ppezyqtx.html