日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

redis实现令牌桶算法思路

發布時間:2024/9/30 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现令牌桶算法思路的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。