控制资源每秒被访问次数的实现

标签: 并发编程
12人阅读 评论(0) 收藏 举报
分类:

在平时做接口开发时,可能遇到需要控制接口访问频率的需求,比如某个接口每秒最多允许被访问100次,我们可以借助并发工具类中的Semaphore实现,以下为示例代码:

public class TPSLimiter {

    private Semaphore semaphore = null;

    public OPSLimiter(int maxOps) {
        if (maxOps < 1) {
            throw new IllegalArgumentException("maxOps must be greater than zero");
        }
        this.semaphore = new Semaphore(maxOps);
        Executors.newScheduledThreadPool(1).scheduleAtFixedRate(() ->
                // 每秒释放给定数目的许可,将其返回到信号量
                semaphore.release(maxOps), 1000, 1000, TimeUnit.MILLISECONDS);
    }

    /**
     * 调用接口之前先调用此方法,当超过最大ops时该方法会阻塞
     */
    public void await() {
        semaphore.acquireUninterruptibly(1);
    }
}

以下为测试代码:

public class TPSLimiterTest {
    static AtomicInteger at = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        TPSLimiter limiter = new TPSLimiter(100);

        new Thread(() -> {
            while (true) {
                // 每秒输出一次AtomicInteger的最新值
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(at.get());
            }
        }).start();

        // 启动100个线程对AtomicInteger进行累加,为了方便就没有使用线程池
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {
                while (true) {
                    // 每次累加操作前先调用await方法,超过设定的ops时会阻塞线程
                    limiter.await();
                    at.incrementAndGet();
                }
            }).start();
        }
    }
}

该博文为本人笔记,仅供大家参考,有不妥之处欢迎大家指正。谢谢!

查看评论

支付宝面试题: 30秒内限制某方法被调用100次 (一个时间段限制方法被调用的次数)

支付宝面试题: 30秒内限制某方法被调用100次
  • wengyupeng
  • wengyupeng
  • 2014-04-04 16:29:03
  • 7477

nginx怎么限制客户端访问频次与访问次数

在nginx中限制客户端访问频次与访问次数,需要用到二个模块NginxHttpLimitConnModule与NginxHttpLimitReqModule。 nginx的两个模块: Ngin...
  • xwq911
  • xwq911
  • 2016-04-29 16:45:13
  • 668

使用lua脚本编写访问次数限制

Redis在2.6推出了脚本功能,允许开发者使用Lua语言编写脚本传到Redis中执行。使用脚本的好处如下:1.减少网络开销:本来5次网络请求的操作,可以用一个请求完成,原先5次请求的逻辑放在redi...
  • JavaMoo
  • JavaMoo
  • 2017-08-22 07:55:09
  • 673

高并发系统设计之开放平台API接口调用频率控制系统

开放平台的API接口调用需要限制其频率,以节约服务器资源和避免恶意的频繁调用。这个东西说大不大,但说小也不小,因为所有对开放API接口的调用都需要先流经这个系统。纯属个人观点,欢迎大家指正。 ...
  • joeyon
  • joeyon
  • 2015-07-27 13:56:21
  • 6799

Servlet实现访问次数的例子!

//ShowTimesServlet.java /*Servlet实现访问次数的例子!*/import java.io.*;import java.util.zip.*;import javax.se...
  • laiahu
  • laiahu
  • 2007-01-23 23:41:00
  • 3271

服务器访问次数限制实现的思路

有个每分钟只能访问10次接口的需求,想到2个实现方法,代码都实现了,分享给大家,希望可以一起进步,一开始的思路是记录下用户访问的时间和次数,然后在写一些方法实现。最先想到是记录在数据库里,刚好数据库有...
  • a032011025hf
  • a032011025hf
  • 2017-08-09 14:22:18
  • 723

Servlet实现网页访问次数

Count类    package mypack; public class Counter { private int count; public Counter(){} publ...
  • u014558484
  • u014558484
  • 2016-12-05 16:02:02
  • 1056

servlet实现统计网站被访问次数功能

public class Test1 extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServl...
  • qq_33723924
  • qq_33723924
  • 2018-03-04 20:02:37
  • 80

统计Apache访问次数前3名的IP

##统计Apache访问量前3名的IP,并打印出来 ##日期:2016-10-12 ##作者:Jack Big #!/bin/bash logfile='/var/log/apache2/acce...
  • Liu_Jack
  • Liu_Jack
  • 2016-10-12 15:35:07
  • 882

单服务器如何应付每秒75万次查询

from:http://blog.csdn.net/jiedushi/article/details/5976153 大多数大规模Web应用程序都使用MySQL+Memcached架构,其中...
  • JK0803_wantao
  • JK0803_wantao
  • 2013-12-30 14:55:07
  • 1393
    个人资料
    持之以恒
    等级:
    访问量: 6598
    积分: 234
    排名: 29万+