令牌桶算法和漏桶算法python_如何实现漏桶算法与令牌桶算法

本文介绍了Java中限流的两种常见算法:漏桶算法和令牌桶算法。通过Guava库的RateLimiter实现,展示了如何在多线程环境下限制操作速率。同时,给出了漏桶算法和令牌桶算法的测试示例,帮助理解其工作原理和应用场景。
摘要由CSDN通过智能技术生成

作者:大数据孟小鹏(Java架构沉思录做了部分修改) 原文:https://blog.csdn.net/mengxpFighting/article/details/79117934

Java中对于生产者消费者模型,或者小米手机营销(1分钟卖多少台手机)等都存在限流的思想在里面。

关于限流目前存在两大类:从线程并发数角度(jdk1.5 Semaphore)限流和从速率限流(guava)。

Semaphore:从线程并发数限流。

RateLimiter:从速率限流。目前常见的算法是漏桶算法和令牌算法。

令牌桶算法。相比漏桶算法而言区别在于,令牌桶是会去匀速的生成令牌,拿到令牌才能够进行处理,类似于匀速往桶里放令牌。

漏桶算法是:生产者消费者模型,生产者往木桶里生产数据,消费者按照预先定义的速度去消费数据。

应用场景:

漏桶算法:必须读写分离的情况下,限制读取的速度。

令牌桶算法:必须读写分离的情况下,限制写的速率。

实现的方法都是一样的,通过RateLimiter来实现。

对于多线程场景下,很多时候使用的类都是原子性的,但是由于代码逻辑的原因,也可能发生线程安全问题。

1. 关于RateLimter和Semphore简单用法

packageconcurrent;importcom.google.common.util.concurrent.RateLimiter;import java.util.concurrent.*;importjava.util.stream.IntStream;import staticjava.lang.Thread.currentThread;/*** ${DESCRIPTION}

* 关于限流 目前存在两大类,从线程个数(jdk1.5 Semaphore)和RateLimiter速率(guava)

* Semaphore:从线程个数限流

* RateLimiter:从速率限流 目前常见的算法是漏桶算法和令牌算法,下面会具体介绍

*

*@authormengxp

*@version1.0

* @create 2018-01-15 22:44

**/

public classRateLimiterExample {//Guava 0.5的意思是 1秒中0.5次的操作,2秒1次的操作 从速度来限流,从每秒中能够执行的次数来

private final static RateLimiter limiter=RateLimiter.create(0.5d);//同时只能有三个线程工作 Java1.5 从同时处理的线程个数来限流

private final static Semaphore sem=new Semaphore(3);private static voidtestSemaphore(){try{

sem.acquire();

System.out.println(currentThread().getName()' is doing work...');

TimeUnit.MILLISECONDS.sleep(ThreadLocalRandom.current().nextInt(10));

}catch(InterruptedException e) {

e.printStackTrace();

}finally{

sem.release();

System.out.pr

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值