美文网首页
【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