mehr-it/lara-token-bucket

使用 Laravel 缓存实现令牌桶算法

1.1.1 2022-02-16 14:31 UTC

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);