php令牌桶演算法實現介面限流
前端每次請求從令牌桶取走令牌,後端勻速向桶內投遞令牌,如果前端取到令牌,則說明這次請求有效,否則讓前端再次請求或者等待。避免了大量請求下伺服器壓力過大導致的崩潰問題。
令牌桶類:
<?php
class Token
{
private $_max;
private $_queue;
private $_redis;
public function __construct()
{
try {
$this->_redis = new \Redis();
$this->_redis->connect('127.0.0.1', 6379);
$this->_queue = 'token';
$this->_max = 10;
} catch (RedisException $exception) {
throw new Exception($exception->__toString());
return false;
}
}
/**
* 令牌初始化
*/
public function reset()
{
$this->_redis->del($this->_queue);
$this->add($this->_max);
}
/**
* 新增令牌
* @param int $number
*/
public function add($number = 1)
{
$maxNumber = $this->_max;
$currentNumber = $this->_redis->lLen($this->_queue);
$number = $maxNumber >= ($currentNumber + $number) ? $number : ($maxNumber - $currentNumber);
if ($number > 0) {
$tokens = array_fill(0, $number, 1);
foreach ($tokens as $token) {
$this->_redis->lPush($this->_queue, $token);
}
}
}
/**
* 獲取令牌
*/
public function get()
{
return $this->_redis->rPop($this->_queue) ? true : false;
}
}
消費類:模擬使用者請求
<?php
require 'token.php';
$token = new Token();
swoole_timer_tick(500, function () use ($token) {
var_dump($token->get());
});
投遞類:後端向令牌桶投遞
<?php
require 'token.php';
$token = new Token();
//投遞令牌
swoole_timer_tick(800, function () use ($token) {
$token->add(1);
});
相關文章
- 介面限流演算法:漏桶演算法&令牌桶演算法&redis限流演算法Redis
- 介面限流演算法:漏桶演算法&令牌桶演算法演算法
- 漏桶、令牌桶限流的Go語言實現Go
- 基於令牌桶演算法實現一個限流器演算法
- 帶你快速瞭解:限流中的漏桶和令牌桶演算法演算法
- Go 分散式令牌桶限流 + 兜底策略Go分散式
- 高可用之限流-07-token bucket 令牌桶演算法演算法
- 令牌桶演算法原理及實現(圖文詳解)演算法
- [登入那些事] 郵件傳送,限流,漏桶與令牌桶
- 基於多 goroutine 實現令牌桶Go
- 三.Go微服務--令牌桶實現原理Go微服務
- 令牌桶、漏斗、冷啟動限流在sentinel的應用
- go的令牌桶實現庫 go-rateGo
- 流量控制與令牌桶演算法演算法
- SpringBoot中實現API速率限制的令牌桶演算法專案Spring BootAPI演算法
- 二.Go微服務--令牌桶Go微服務
- 介面限流實踐
- redis+lua指令碼實現介面限流Redis指令碼
- Sentinel限流之快速失敗和漏桶演算法演算法
- 15行Python程式碼,幫你理解令牌桶演算法Python演算法
- 談談限流演算法,以及Redisson實現演算法Redis
- 介面限流
- 使用 Redis 實現限流——滑動視窗演算法Redis演算法
- 演算法~利用zset實現滑動視窗限流演算法
- 限流器演算法實現(JUC原子類使用實踐)演算法
- 大型網站限流演算法的實現和改造網站演算法
- 分散式系統限流演算法分析與實現分散式演算法
- php演算法實現(一)PHP演算法
- [分散式限流] 滑動視窗演算法的 Golang 實現分散式演算法Golang
- 高併發系統的限流演算法與實現演算法
- Spring Cloud Alibaba基礎教程:使用Sentinel實現介面限流SpringCloud
- PHP實現漢諾塔演算法PHP演算法
- 專案如何實現限流?
- 如何使用 redis 實現限流Redis
- php實現4種排序演算法PHP排序演算法
- 經典排序演算法PHP實現排序演算法PHP
- 關於限流實現的思考
- 我是如何實現限流的?