Maison >base de données >Redis >Comment utiliser Redis pour implémenter la fonction de limitation de courant distribué

Comment utiliser Redis pour implémenter la fonction de limitation de courant distribué

PHPz
PHPzoriginal
2023-11-07 12:26:141363parcourir

Comment utiliser Redis pour implémenter la fonction de limitation de courant distribué

Comment utiliser Redis pour implémenter une fonction de limitation de courant distribuée

Introduction :
Avec le développement rapide d'Internet, le nombre de visites aux systèmes d'entreprise augmente également. Lorsque le trafic est concentré dans un certain système commercial, cela constitue certaines menaces pour la stabilité et les performances du système. Afin de protéger les systèmes des entreprises, la limitation de courant est devenue un moyen indispensable. Dans un système distribué, Redis peut être utilisé pour implémenter facilement la fonction de limitation de courant distribuée. Cet article explique comment utiliser Redis pour implémenter une limitation de courant distribuée et fournit des exemples de code spécifiques.

1. Les principes de base et la structure des données de Redis
Redis est un système de stockage clé-valeur hautes performances basé sur la mémoire. Il prend en charge une variété de structures de données telles que des chaînes, des listes, des hachages, etc. Ici, nous nous concentrons principalement sur les deux structures de données des compteurs et des ensembles ordonnés dans Redis.

  1. Compteur : Le compteur dans Redis utilise la structure de données String. Le compteur peut être incrémenté via la commande INCR et le délai d'expiration peut être réglé pour faciliter un nettoyage régulier.
  2. Ensemble ordonné : l'ensemble ordonné dans Redis utilise la structure de données ZSet (ensemble ordonné). Chaque élément peut être associé à une partition et trié en fonction de la partition. Dans un ensemble ordonné, vous pouvez utiliser la commande ZRANGE pour obtenir des membres dans une certaine plage par score.

2. Idées pour implémenter la fonction de limitation de courant
Grâce aux compteurs Redis et aux collections ordonnées, la fonction de limitation de courant distribuée peut être facilement implémentée. L'idée spécifique est la suivante :

  1. Définissez un compteur pour enregistrer le nombre de demandes de trafic.
  2. Définissez une tâche planifiée pour effacer régulièrement le nombre de demandes expirées dans le compteur.
  3. Utilisez une collection ordonnée pour enregistrer l'horodatage de chaque demande, classé par heure.
  4. Chaque fois qu'il y a une demande, l'heure de demande la plus précoce dans une certaine plage horaire est obtenue en fonction de l'horodatage de l'ensemble commandé.
  5. S'il y a plus que le nombre maximum de demandes dans une certaine plage de temps (par exemple 1 seconde), cela sera considéré comme dépassant la limite actuelle.

3. Exemple de code

Ce qui suit est un exemple de code de limitation de courant distribué Redis écrit en Java :

import redis.clients.jedis.Jedis;

public class RateLimiter {
    private Jedis jedis;
    private String key; // Redis中的键
    private int maxRequests; // 最大请求数
    private int timeWindow; // 时间窗口,单位为秒

    public RateLimiter(Jedis jedis, String key, int maxRequests, int timeWindow) {
        this.jedis = jedis;
        this.key = key;
        this.maxRequests = maxRequests;
        this.timeWindow = timeWindow;
    }

    public boolean allowRequest() {
        long now = System.currentTimeMillis() / 1000; // 当前时间戳,单位为秒
        long earliest = now - timeWindow; // 最早的请求时间

        jedis.zremrangeByScore(key, 0, earliest); // 清理过期的请求时间

        long count = jedis.zcount(key, earliest, now); // 统计指定时间范围内的请求数

        if (count < maxRequests) {
            jedis.zadd(key, now, String.valueOf(now)); // 添加当前请求的时间
            return true;
        } else {
            return false;
        }
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost", 6379);
        RateLimiter rateLimiter = new RateLimiter(jedis, "requestCounter", 10, 1); // 最大请求数为10,时间窗口为1秒

        for (int i = 0; i < 20; i++) {
            System.out.println("第" + (i + 1) + "次请求:" + rateLimiter.allowRequest());
        }
        
        jedis.close();
    }
}

Le code ci-dessus implémente une simple fonction de limitation de courant distribuée. Parmi elles, la classe RateLimiter encapsule la logique de limitation actuelle et la classe Main est utilisée pour les tests.

Conclusion : 
L'utilisation de Redis pour implémenter une fonction de limitation de courant distribuée peut facilement protéger la stabilité et les performances du système d'entreprise. Grâce à la coopération des compteurs et des collectes ordonnées, le nombre de demandes peut être contrôlé de manière flexible et, en définissant le délai d'expiration, les demandes expirées peuvent être automatiquement nettoyées. Ce qui précède est un exemple de code. Le scénario d'utilisation spécifique doit être ajusté et optimisé en fonction de la situation réelle. J'espère que cet article vous aidera !

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