令牌桶限流器(go实现)

该博客介绍了使用Go语言实现的令牌桶限流器,提供了初始化、获取令牌等关键功能,并附带了GitHub代码链接供读者参考和贡献。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码链接: https://github.com/fuyao-w/rate_limit限流工具【令牌桶算法】. Contribute to fuyao-w/rate_limit development by creating an account on GitHub.https://github.com/fuyao-w/rate_limit

限流工具【令牌桶实现】

用法:

  • 初始化:
func NewBucket(capacity, quantum int64, fillInterval time.Duration, options ...OptionF) (bucket *Bucket) 

NewBucket 返回一个新的令牌桶,每 fillInterval 个时间间隔,填充 quantum 个令牌的,直到给定的最大容量。桶初始化后就是满的

options 可选 WithClock(mockClock) 可以用其他时钟代替,方便 mock 测试 ,WithProhibitOverflow() 禁止桶溢出,此时退换成漏桶算法

  • 获取一定数量的令牌
func (b *Bucket) Take(count int64) 

Take 获取一定数量的令牌,如果当前桶中令牌数量不够,则阻塞直到获取成功

如果不使用 prohibitOverflow 选项, err 永远返回 nil ,如果使用 prohibitOverflow 选项,则获取超过容量的令牌数则会返回 ErrProhibitOverflow

  • 在规定的等待时间内获取一定数量令牌
func (b *Bucket) TryTake(count int64, maxWait time.Duration) (succ bool)

从桶中获取一定数量的令牌,如果桶中令牌数充足则立即返回 true,或者桶中令牌数不够但是预计等待时间 <= maxWait 则阻塞到实际等待时间后并返回 true ,否则返回 false

如果使用 prohibitOverflow 选项并且count超过了capacity 则永远返回false

  • 尝试获取一定数量的令牌,不阻塞
func (b *Bucket) TakeAvailable(count int64) (realCount int64) 

尝试获取 count 个令牌,如果桶中令牌不够也不会阻塞,返回值告诉调用方实际上获取了多少个令牌

realCount 不会大于容量

  • 当前可用的令牌数量
func (b *Bucket) Available() (available int64)

返回当前可用的令牌数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值