java限流工具类(代码片段)

datiangou datiangou     2023-02-18     784

关键词:


代码


import com.google.common.util.concurrent.RateLimiter;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 限流工具类
 * @author ZhangShuzheng
 * @date 2018/8/13
 */
public class RateLimiterManager 
 
    private static ConcurrentHashMap<String, RateLimiter> manager = new ConcurrentHashMap<>();
 
    /**
     * 限流
     * @param key 限流key
     * @param qps 频率:每秒返回锁次数
     */
    public static void getLock(String key, int qps) 
        ConcurrentHashMap.KeySetView<String, RateLimiter> keys = manager.keySet();
        if (keys.contains(key)) 
            RateLimiter rateLimiter = manager.get(key);
            rateLimiter.acquire();
         else 
            manager.put(key, RateLimiter.create(qps));
        
    
 


使用示例


public static void main(String[] args) 
    int count = 100;
 
    ThreadFactory namedThreadFactory = new ThreadFactoryBuilder()
            .setNameFormat("demo-pool-%d").build();
 
    ExecutorService threadPoolExecutor = new ThreadPoolExecutor(5, 200,
            0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
 
    threadPoolExecutor.execute(() -> 
        for (int i = 0; i < count; i++) 
            RateLimiterManager.getLock("key1", 10);
            System.out.println("111111111111111111111111");
        
    );
    threadPoolExecutor.execute(() -> 
        for (int i = 0; i < count; i++) 
            RateLimiterManager.getLock("key2", 1);
            System.out.println("222222222222222222222222");
        
    );


输出结果


222222222222222222222222
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
222222222222222222222222
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111
111111111111111111111111

day857.高性能限流器guavaratelimiter-java并发编程实战(代码片段)

高性能限流器GuavaRateLimiterHi,我是阿昌,今天学习记录的是关于高性能限流器GuavaRateLimiter的内容。GuavaRateLimiter是如何解决高并发场景下的限流问题的。Guava是Google开源的Java类库,提供了一个工具类RateLimiter。先来看... 查看详情

tps限流(代码片段)

限流是高可用服务需要具备的能力之一,粗暴简单的就像我们之前做的并发数控制。好一点的有tps限流,可用令牌桶等算法实现。《亿级流量网站架构核心技术》一书P67限流详解也有讲。dubbo提供了此机制,TpsLimitFilter。guava也提... 查看详情

java使用semaphore对单接口进行限流(代码片段)

java使用Semaphore对单接口进行限流目录一、实战说明1.1效果说明1.2核心知识点二、?环境搭建三、限流演示3.1并发请求工具3.2效果示例图一、实战说明1.1效果说明本篇主要讲如何使用Semaphore对单接口进行限流,例如有如下场景a.A系... 查看详情

一种高效的qps统计方法(代码片段)

...实现方法考虑的重点问题。针对这个问题,Netflix的Hystrix限流组件中实现了一个十分高效的可进行QPS统计的工具类HystrixRollingNumber.java,该工具类也是集团限流工具Sentinel的核心。 查看详情

java并发工具类semaphore(代码片段)

...tml阅读目录前言信号量模型如何使用信号量快速实现一个限流器小结 回到目录前言1965年,荷兰计算机科学家Dijkstra提出的信号量机制成为一种高效的进程同步机制。这之后的15年,信号量一直都是并发编程领域的终结者。1980... 查看详情

限流工具ratelimiter(代码片段)

先看下demo//1秒通过0.5个RateLimiterrateLimiter=RateLimiter.create(0.5);for(inti=0;i<10;i++)rateLimiter.acquire();System.out.println(newDate()+""+i);if(!rateLimiter.tryAcqui 查看详情

spring控制并发数的工具类concurrencythrottlesupport和concurrencythrottleinterceptor(代码片段)

...ynchronized和watiandnotify达到控制线程数量的效果,从而实现限流的策略。一、类图二、主要方法先看ConcurrencyThrottleInterceptor.java类的源码:看该拦截器中的invoke()方法中,在执行目标方法的前后分别执行beforeAccess()和afterAccess()方法... 查看详情

java吐司工具类(代码片段)

查看详情

java吐司工具类(代码片段)

查看详情

java吐司工具类(代码片段)

查看详情

java重试工具类(代码片段)

查看详情

java文件操作工具类(代码片段)

查看详情

java时间处理工具类(代码片段)

查看详情

java文件操作工具类(代码片段)

查看详情

java文件操作工具类(代码片段)

查看详情

springboot如何进行限流?老鸟们还可以这样玩!(代码片段)

...在之前一篇文章中我们详细介绍了为什么需要对接口进行限流,也介绍了常见的限流算法,最后还基于Guava工具类实现了接口限流。但是这种方式有个问题,无法实现分布式限流。那今天我们来利用Redis+Lua来实现分... 查看详情

springboot如何进行限流?老鸟们还可以这样玩!(代码片段)

...在之前一篇文章中我们详细介绍了为什么需要对接口进行限流,也介绍了常见的限流算法,最后还基于Guava工具类实现了接口限流。但是这种方式有个问题,无法实现分布式限流。那今天我们来利用Redis+Lua来实现分... 查看详情

java中文转拼音工具类(代码片段)

查看详情