此文章是vip文章,如何查看?  

1,点击链接获取密钥 http://nicethemes.cn/product/view29882.html

2,在下方输入文章查看密钥即可立即查看当前vip文章


计数器实现限流 - Java实现

  • 时间:
  • 浏览:
  • 来源:互联网

实现时需要注意,用于计数的变量,自增操作应该为原子操作。

import java.util.concurrent.atomic.AtomicLong;

public class RateLimiter {

    private final static AtomicLong ZERO = new AtomicLong(0);
    private AtomicLong counter = ZERO;
    private static long timestamp = System.currentTimeMillis();
    private long permitsPerSecond;

    public RateLimiter(long permitsPerSecond) {
        this.permitsPerSecond = permitsPerSecond;
    }

    public boolean tryAcquire() {
        long now = System.currentTimeMillis();
        if (now - timestamp < 1000) {
            if (counter.get() < permitsPerSecond) {
                counter.incrementAndGet();
                return true;
            } else {
                return false;
            }
        } else {
            counter = ZERO;
            timestamp = now;
            return false;
        }
    }

}

用计数器来做限流,实现简单,并且很容易的扩展到分布式场景中,用redis保存计数值,并设置自动过期时间。缺点就是,在计数器置0前后的极短时间里,可能会有 2*permitsPerSecond 的突发流量。

 

本文链接http://element-ui.cn/news/show-576821.aspx