当前位置: 首页 > news >正文

计数器实现限流 - 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 的突发流量。

 

相关文章:

  • 原创 继杨幂之后被网友催着“去死”的女主角,这剧情太带感了!
  • 数据结构与算法系列——从菜鸟到入门
  • Dom 4j 格式化xml补充
  • 广西:启动建筑施工安全生产“打非治违”专项行动!
  • 利用Android游戏引擎Angle开发界面
  • 钉钉用虚拟定位考勤界面正常打卡
  • 数据库相关知识学习——基于mysql
  • 虚拟定位软件与钉钉怎样才能兼容
  • 原创 霍华德助攻詹姆斯!霍华德助攻戴维斯,一个美如画,一个太风骚
  • 32岁被裁,拿N+1,我高兴地失业了
  • TAG Heuer也要出智能手表
  • 妹纸是如何写脚本的? 体会坐上来自己动的愉悦!
  • 肠道调理改善,健康从肠计议,百e健康肠老虎来了
  • 阴阳师年兽lbs虚拟定位
  • HG532e漏洞分析
  • 朋友圈配图 | 你说我傻x?!用这套怼人专用表情包助你回击吧不谢
  • 人社部再取消42项证明材料!涉及一建和一造等!
  • go微服务框架kratos学习笔记一(kratos demo)
  • 证监会:下一步将加强MOM产品监管
  • 装配式建筑星火燎原 建筑行业或将面临洗牌