令牌桶算法是常见的限流算法,用来控制发送到网络上的数据的数目,并允许突发数据的发送,其原理也很简单:
- 首先设有一个令牌桶,桶内存放令牌,一开始令牌桶内的令牌是满的(桶内令牌的数量可根据服务器情况设定);
- 每次访问从桶内取走一个令牌,当桶内令牌为0,则不允许再访问;
- 每隔一段时间,再放入令牌,最多使桶内令牌满额。(可以根据实际情况,每隔一段时间放入若干个令牌,或直接补满令牌桶);
我们可以使用redis的队列作为令牌桶容器使用,使用lPush(入队),rPop(出队),实现令牌加入与消耗的操作, 代码如下:
TokenBucket.class.php
1 |
|
traffic.limit.php
1 |
|
输出:
1 | gitlib@devops:/www/websites/www/gitlib/practise/php/redis$ php traffic.limit.test.php |
至于定期加入令牌,可以使用crontab实现,定时调用add方法加入若干令牌即可。