<?php
/**
* 令牌桶
* Class TokenBucket
*/
class TokenBucket
{
// 令牌最大数量
private $token_num;
// redis对象
private $redis;
// 队列名称
private $queue;
public function __construct($redis_host = '127.0.0.1', $redis_password = '', $redis_port = 6379, $queue = 'token_bucket', $token_num = 100)
{
$this->redis = new Redis();
$this->redis->pconnect($redis_host, $redis_port);
if(!empty($redis_password))
{
$this->redis->auth($redis_password);
}
$this->queue = $queue;
$this->token_num = $token_num;
}
/**
* 加入到令牌桶
* @param int $num 加入令牌桶的数量
* @return bool
*/
public function add($num = 0)
{
// 当前令牌桶的数量
$now_num = $this->redis->lSize($this->queue);
// 可加入的令牌数
$num = ($this->token_num - $now_num) >= $num ? $num : $this->token_num - $now_num;
if($num > 0)
{
$this->redis->lPush($this->queue, ...array_fill(0, $num, 1));
return true;
}
return false;
}
/**
* 重置令牌桶
*/
public function reset()
{
$this->redis->delete($this->queue);
$this->add($this->token_num);
}
/**
* 获取令牌
* @return bool
*/
public function get()
{
return $this->redis->rPop($this->queue) ? true : false;
}
}
令牌桶
原文链接:令牌桶,转发请注明来源!
评论已关闭。


