PHP를 사용하여 토큰 버킷 알고리즘을 구현하는 방법
php+redis는 토큰 버킷 알고리즘 코드를 구현합니다:
<?phpnamespace Api\Lib;/** * 限流控制 */class RateLimit{ private $minNum = 60; //单个用户每分访问数 private $dayNum = 10000; //单个用户每天总的访问量 public function minLimit($uid) { $minNumKey = $uid . '_minNum'; $dayNumKey = $uid . '_dayNum'; $resMin = $this->getRedis($minNumKey, $this->minNum, 60); $resDay = $this->getRedis($minNumKey, $this->minNum, 86400); if (!$resMin['status'] || !$resDay['status']) { exit($resMin['msg'] . $resDay['msg']); } } public function getRedis($key, $initNum, $expire) { $nowtime = time(); $result = ['status' => true, 'msg' => '']; $redisObj = $this->di->get('redis'); $redis->watch($key); $limitVal = $redis->get($key); if ($limitVal) { $limitVal = json_decode($limitVal, true); $newNum = min($initNum, ($limitVal['num'] - 1) + (($initNum / $expire) * ($nowtime - $limitVal['time']))); if ($newNum > 0) { $redisVal = json_encode(['num' => $newNum, 'time' => time()]); } else { return ['status' => false, 'msg' => '当前时刻令牌消耗完!']; } } else { $redisVal = json_encode(['num' => $initNum, 'time' => time()]); } $redis->multi(); $redis->set($key, $redisVal); $rob_result = $redis->exec(); if (!$rob_result) { $result = ['status' => false, 'msg' => '访问频次过多!']; } return $result; }}
코드 포인트:
1 먼저 규칙을 정의합니다.
단일 사용자의 분당 방문 횟수($minNum), 총 방문 횟수 단일 사용자의 일일($dayNum ), 인터페이스에 대한 총 액세스 횟수 및 기타 다른 규칙입니다.
2. 계산 비율
이 코드 예제에서는 최소 시간 단위로 초를 사용합니다. 비율 = 방문 횟수/시간($initNum / $expire)
3. 각 방문 후 추가된 토큰 수 계산 방법
마지막 방문 시간, 즉 토큰이 마지막으로 저장된 시간을 구합니다. 현재 시간과 마지막 방문 사이의 시간 차이를 계산하고 여기에 비율을 곱하여 이번에 보충해야 하는 토큰 수를 구합니다. . 토큰 보충 후 총 토큰 수에 주의하세요. 초기화된 토큰 수보다 클 수 없으며, 보충 수와 초기화 수의 최소값이 적용됩니다.
4. 프로그램 흐름
첫 번째 방문 시 토큰 수($minNum)를 초기화하고 이를 Redis에 저장한 후 현재 타임스탬프를 저장하여 다음에 보충해야 하는 토큰 수를 계산합니다.
두 번째 방문에서 남은 토큰 수를 가져오고 이번에 보충해야 할 토큰 수를 추가합니다. 보충 후 토큰 수가 > 0이면 현재 방문이 유효하고 액세스 가능합니다. 토큰이 모두 사용되었습니다. 토큰을 먼저 보충한 후 토큰이 >0인지 판단하는 이유는 비율의 개념도 있기 때문입니다. 즉, 지난번에 남은 토큰이 0이었지만 이번에 보충해야 할 토큰이 >1인 경우입니다. , 이번에는 여전히 액세스할 수 있습니다.
5. 동시 처리를 위해
Redis의 낙관적 잠금 메커니즘을 사용하세요.
더 많은 관련 지식은 PHP 중국어 홈페이지를 주목해주세요! !
위 내용은 PHP를 사용하여 토큰 버킷 알고리즘을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











이번 장에서는 CakePHP의 환경 변수, 일반 구성, 데이터베이스 구성, 이메일 구성에 대해 알아봅니다.

PHP 8.4는 상당한 양의 기능 중단 및 제거를 통해 몇 가지 새로운 기능, 보안 개선 및 성능 개선을 제공합니다. 이 가이드에서는 Ubuntu, Debian 또는 해당 파생 제품에서 PHP 8.4를 설치하거나 PHP 8.4로 업그레이드하는 방법을 설명합니다.

CakePHP는 PHP용 오픈 소스 프레임워크입니다. 이는 애플리케이션을 훨씬 쉽게 개발, 배포 및 유지 관리할 수 있도록 하기 위한 것입니다. CakePHP는 강력하고 이해하기 쉬운 MVC와 유사한 아키텍처를 기반으로 합니다. 모델, 뷰 및 컨트롤러 gu

VS Code라고도 알려진 Visual Studio Code는 모든 주요 운영 체제에서 사용할 수 있는 무료 소스 코드 편집기 또는 통합 개발 환경(IDE)입니다. 다양한 프로그래밍 언어에 대한 대규모 확장 모음을 통해 VS Code는
