Heim  >  Artikel  >  Backend-Entwicklung  >  Verwendung von Redis zur Implementierung der Strombegrenzungsstrategie in PHP

Verwendung von Redis zur Implementierung der Strombegrenzungsstrategie in PHP

WBOY
WBOYOriginal
2023-05-16 08:01:501503Durchsuche

Mit der Entwicklung des Internets steigt die Anzahl der Anfragen für viele Websites oder Anwendungen von Tag zu Tag, was große Herausforderungen an die serverseitige Ressourcenverwaltung mit sich bringt. In diesem Fall wird die aktuelle Begrenzungsstrategie zu einer wichtigen Lösung. In diesem Artikel wird erläutert, wie Sie mit Redis aktuelle Begrenzungsstrategien in PHP-Anwendungen implementieren können.

1. Einführung in Redis

Redis ist eine moderne Open-Source-Datenbank, die Speicher zum Speichern von Daten verwendet und so das Lesen und Schreiben sehr schnell macht. Redis unterstützt eine Vielzahl von Datentypen, darunter Strings, Hashes, Listen, Mengen und geordnete Mengen. Darüber hinaus bietet Redis auch erweiterte Funktionen wie Veröffentlichung und Abonnement, Transaktionen usw.

2. Einführung in die aktuelle Begrenzungsstrategie

Die aktuelle Begrenzungsstrategie bezieht sich auf die Begrenzung der Anforderungshäufigkeit einer Anwendung oder Website, um serverseitige Ressourcen zu schützen und eine Überbeanspruchung zu verhindern. Beispielsweise können Website- und Anwendungsadministratoren bei einigen API-Diensten, die eine Zahlung erfordern, Anfragen von unbezahlten Benutzern einschränken, um Ressourcenmissbrauch und Umsatzrückgänge zu verhindern. Ein weiteres Beispiel: Für einige Vorgänge, die eine Anmeldeüberprüfung erfordern, kann der Administrator illegale Anfragen einschränken, um Brute-Force-Angriffe zu verhindern.

3. So verwenden Sie Redis zur Implementierung der aktuellen Begrenzungsstrategie

Redis bietet einen Algorithmus namens „Token Bucket“ zur Umsetzung der aktuellen Begrenzungsstrategie. Bei diesem Algorithmus werden Anfragen als Token behandelt und der Server speichert diese Token in einem Bucket (als Redis-Datenstruktur ZSET bezeichnet). Jeder Token trägt einen Zeitstempel, der angibt, wann der Token generiert wurde. Wenn eine Anfrage eintrifft, wird versucht, ein Token zu erhalten, und wenn der Erwerb erfolgreich ist, kann die Ausführung nach unten fortgesetzt werden. Wenn die Erfassung fehlschlägt, gilt die Anforderung als Drosselung.

Im Folgenden erfahren Sie, wie Sie den Token-Bucket-Algorithmus mithilfe von Redis in einer PHP-Anwendung implementieren:

1 Erstellen Sie ein Redis-Client-Objekt:

/ /Redis-Client erstellen
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);

2 Bucket festlegen Das Maximum Kapazität:

// Legen Sie die maximale Kapazität des Token-Buckets fest
$bucket_capacity = 1000;

3. Legen Sie die Token-Generierungsrate fest: #🎜🎜 ## 🎜🎜#//Token-Generierungsrate festlegen

$token_rate = 100.0;


4. Token hinzufügen:

// Token hinzufügen#🎜 🎜#function add_token( $redis, $token_rate, $bucket_capacity) {

$current_time = microtime(true);
$tokens = $redis->zrevrangebyscore('tokens', '+inf', $current_time);
$tokens_count = count($tokens);

// 计算当前桶内的令牌数
$current_capacity = $bucket_capacity - $tokens_count;

// 计算新令牌的数量
$new_tokens_count = ($token_rate / $bucket_capacity) * $current_capacity;
$new_tokens_count = min($new_tokens_count, $bucket_capacity - $tokens_count);

// 添加新令牌
if ($new_tokens_count > 0) {
    $multi_exec = $redis->multi();
    for ($i = 0; $i < $new_tokens_count; $i++) {
        $multi_exec->zadd('tokens', $current_time + ($i / $token_rate), $current_time + ($i / $token_rate));
    }
    $multi_exec->exec();
}

}

5. Token prüfen:

// Token prüfen

Funktion check_token($redis, $bucket_capacity) {

$current_time = microtime(true);
$tokens = $redis->zrevrangebyscore('tokens', '+inf', $current_time);
$tokens_count = count($tokens);

// 计算当前桶内的令牌数
$current_capacity = $bucket_capacity - $tokens_count;

// 如果桶是满的,则限流
if ($current_capacity <= 0) {
    return false;
}

// 如果桶是空的,则添加新令牌
if ($tokens_count == 0) {
    add_token($redis, $token_rate, $bucket_capacity);
}

// 获取第一个令牌
$token_time = reset($tokens);

// 如果获取令牌的时间早于当前时间,则限流
if ($token_time < $current_time) {
    return false;
}

// 删除此令牌
$redis->zremrangebyscore('tokens', '-inf', $token_time);

return true;

}

4. Fazit

Durch die Einleitung dieses Artikels können wir feststellen, dass die Die Strombegrenzungsstrategie kann mithilfe des von Redis bereitgestellten Token-Bucket-Algorithmus einfach implementiert werden. Es verhindert Brute-Force-Angriffe und Ressourcenmissbrauch und ist wichtig für den Schutz der Sicherheit und Stabilität von Websites und Anwendungen. Im Allgemeinen können wir die oben genannten Methoden verwenden, um aktuelle Begrenzungsstrategien in PHP-Anwendungen zu implementieren und so die serverseitige Ressourcenverwaltung effektiv aufrechtzuerhalten.

Das obige ist der detaillierte Inhalt vonVerwendung von Redis zur Implementierung der Strombegrenzungsstrategie in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn