mehr-it / lara-token-bucket
使用 Laravel 缓存实现令牌桶算法
1.1.1
2022-02-16 14:31 UTC
Requires
- php: >=7.3.0
- laravel/framework: ^5.8|^6.0|^7.0|^8.0|^9.0
Requires (Dev)
- orchestra/testbench: ^3.8|^4.0|^5.0|^6.0
- phpunit/phpunit: ^7.4|^8.4|^9.5
This package is not auto-updated.
Last update: 2024-09-26 03:22:14 UTC
README
使用 Laravel 的缓存仓库实现“令牌桶”算法。
注意:此实现使用一秒的时钟分辨率。这意味着,新令牌最多每秒添加一次。
安装
composer require mehr-it/lara-token-bucket
此包使用 Laravel 的包自动发现,因此服务提供者将被自动加载。
使用方法
使用 TokenBucket
门面来访问令牌桶
// Create a token bucket with rate of 5 tokens per second // and burst size of 20 tokens. $bucket = \TokenBucket::bucket('myBucket', 5.0, 20); // try to take 2 tokens from the bucket $success = $bucket->tryTake(2);
具有相同名称的所有令牌桶实例使用相同的令牌存储,只要它们使用相同的底层缓存。
估算令牌可用的时间
有时,估计新令牌可用的时间可能很有用。如果提供了第二个参数,则 tryTake()
方法返回估计时间。如果您只想检查估计的可用性而不提取令牌,则 estimateAvailability()
方法是您需要的。
// $secUntilAvailableNext is filled with the duration until // another 2 tokens are available after an eventually // successful taking $bucket->tryTake(2, $secUntilAvailableNext); // returns the duration until 2 tokens are available $secUntilAvailableNext = $bucket->estimateAvailability(3);
归还令牌
有时,您可能已经提取了不需要的令牌。您可以将令牌归还到桶中,而不会影响基于时间填充。
// give back 2 tokens $bucket->putTokens(2);
预定义的桶
如果您想预定义令牌桶并在以后通过解析桶名称使用它们,则需要使用 registerBucket()
方法。
// register \TokenBucket::registerBucket('myBucket', 5.0, 20); // resolve $bucket = \TokenBucket::resolveBucket('myBucket');
边缘情况
默认情况下,当不存在数据时,桶为空。这发生在第一次请求桶或缓存刷新后。
您可以在创建桶实例时定义桶持有的初始令牌数量。
// create a token bucket with initial token number of 3 $bucket = \TokenBucket::bucket('myBucket', 5.0, 20, 3);