redis实现令牌桶算法思路
生活随笔
收集整理的這篇文章主要介紹了
redis实现令牌桶算法思路
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.常用的限流思路令牌桶算法和漏桶算法
直接令牌桶算法代碼
<?phpclass TokenBucket{private $_config; //redis設定private $_redis; //redis對象private $_queue; //令牌桶private $_max; //最大令牌數/*** 創建redis連接* @return Redis*/private function connect(){$redis = new Redis();$redis->connect('127.0.0.1',6379);$redis->select($this->_config['index']);//用于切換到指定的數據庫,數據庫索引號 index 用數字值指定,以 0 作為起始索引值。return $redis;}public function __construct($config ,$queue,$max){$this->_config = $config;$this->_queue = $queue;$this->_max = $max;$this->_redis = $this->connect();}/***獲取令牌*/public function get(){return $this->_redis->rPop($this->_queue)?true:false;}/*** 添加令牌* @param int $num* @return int*/public function add($num =0){$currNum = $this->_redis->lSize($this->_queue);$maxNum = $this->_max;$num = $maxNum >$currNum+$num?$num:$maxNum-$currNum;if ($num >0){$token = array_fill(0,$num,1);$this->_redis->lPush($this->_queue,...$token);return $num;}return 0;}/*** 重新設置了令牌桶,填滿令牌*/public function reset(){$this->_redis->delete($this->_queue);$this->add($this->_max);} }// redis連接設定 $config = array('host' => 'localhost','port' => 6379,'index' => 0,'auth' => '','timeout' => 1,'reserved' => NULL,'retry_interval' => 100, );$queue = "mycontainer";$max = 5;$tokenBucket = new TokenBucket($config,$queue,$max); $tokenBucket->reset();// 循環獲取令牌,令牌桶內只有5個令牌,因此最后3次獲取失敗 for($i=0; $i<8; $i++){var_dump($tokenBucket->get()); }// 加入10個令牌,最大令牌為5,因此只能加入5個 $add_num = $tokenBucket->add(10);var_dump($add_num);// 循環獲取令牌,令牌桶內只有5個令牌,因此最后1次獲取失敗 for($i=0; $i<6; $i++){var_dump($tokenBucket->get()); }總結
以上是生活随笔為你收集整理的redis实现令牌桶算法思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows中wnmp设置nginx启
- 下一篇: 2021-01-14