Maison >développement back-end >tutoriel php >Utiliser Redis pour implémenter la stratégie de limitation actuelle en PHP

Utiliser Redis pour implémenter la stratégie de limitation actuelle en PHP

WBOY
WBOYoriginal
2023-05-16 08:01:501551parcourir

Avec le développement d'Internet, le nombre de requêtes pour de nombreux sites Web ou applications augmente de jour en jour, ce qui pose de grands défis à la gestion des ressources côté serveur. Dans ce cas, la stratégie de limitation actuelle devient une solution importante. Cet article explique comment utiliser Redis pour implémenter les stratégies de limitation actuelles dans les applications PHP.

1. Introduction à Redis

Redis est une base de données open source moderne qui utilise la mémoire pour stocker les données, ce qui rend la lecture et l'écriture très rapides. Redis prend en charge plusieurs types de données, notamment les chaînes, les hachages, les listes, les ensembles et les ensembles ordonnés. De plus, Redis propose également des fonctions avancées telles que la publication et l'abonnement, les transactions, etc.

2. Introduction à la stratégie de limitation actuelle

La stratégie de limitation actuelle fait référence à la limitation de la fréquence des requêtes d'une application ou d'un site Web pour protéger les ressources côté serveur et éviter une utilisation excessive. Par exemple, pour certains services API qui nécessitent un paiement, les administrateurs de sites Web et d'applications peuvent limiter les demandes des utilisateurs non rémunérés afin d'éviter toute utilisation abusive des ressources et toute baisse des revenus. Pour un autre exemple, pour certaines opérations nécessitant une vérification de connexion, l'administrateur peut restreindre les demandes illégales pour empêcher les attaques par force brute.

3. Comment utiliser Redis pour implémenter la stratégie de limitation actuelle

Redis fournit un algorithme appelé « Token Bucket » pour implémenter la stratégie de limitation actuelle. Dans cet algorithme, les requêtes sont traitées comme des jetons et le serveur stocke ces jetons dans un compartiment (appelé structure de données Redis ZSET). Chaque jeton porte un horodatage indiquant quand le jeton a été généré. Lorsqu'une requête arrive, elle tente d'obtenir un jeton, et si l'acquisition réussit, l'exécution peut continuer vers le bas. Si l’acquisition échoue, la demande est considérée comme une limitation.

Voici comment implémenter l'algorithme de bucket de jetons à l'aide de Redis dans une application PHP :

1 Créez un objet client Redis :

// Créez un client Redis
$redis = new Redis();
$redis -. >connect('127.0.0.1', 6379);

2.Définissez la capacité maximale du bucket :

//Définissez la capacité maximale du bucket de jetons
$bucket_capacity = 1000;

3.Définissez la génération de jetons Taux :

// Définir le taux de génération de jetons
$token_rate = 100,0 ;

4. Ajouter un jeton :

// Ajouter un jeton
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. Check token :

// Check token
function 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;

}

IV Conclusion

Grâce à l'introduction de cet article, nous pouvons découvrir les commandes fournies par Redis The. L'algorithme du compartiment de cartes peut facilement mettre en œuvre la stratégie de limitation actuelle. Il empêche les attaques par force brute et l'abus des ressources et est important pour protéger la sécurité et la stabilité des sites Web et des applications. En général, nous pouvons utiliser les méthodes ci-dessus pour implémenter les stratégies de limitation actuelles dans les applications PHP, maintenant ainsi efficacement la gestion des ressources côté serveur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn