Heim  >  Artikel  >  Datenbank  >  So implementieren Sie mit Redis eine verteilte Strombegrenzungsfunktion

So implementieren Sie mit Redis eine verteilte Strombegrenzungsfunktion

PHPz
PHPzOriginal
2023-11-07 12:26:141278Durchsuche

So implementieren Sie mit Redis eine verteilte Strombegrenzungsfunktion

So verwenden Sie Redis, um die verteilte Strombegrenzungsfunktion zu implementieren

Einführung:
Mit der rasanten Entwicklung des Internets nimmt auch die Anzahl der Besuche von Geschäftssystemen zu. Wenn sich der Datenverkehr auf ein bestimmtes Geschäftssystem konzentriert, stellt dies eine gewisse Bedrohung für die Stabilität und Leistung des Systems dar. Um Unternehmenssysteme zu schützen, ist die Strombegrenzung zu einem unverzichtbaren Mittel geworden. In einem verteilten System kann Redis verwendet werden, um die verteilte Strombegrenzungsfunktion einfach zu implementieren. In diesem Artikel wird erläutert, wie Sie mit Redis eine verteilte Strombegrenzung implementieren, und es werden spezifische Codebeispiele bereitgestellt.

1. Die Grundprinzipien und Datenstruktur von Redis
Redis ist ein speicherbasiertes Hochleistungs-Schlüsselwertspeichersystem. Es unterstützt eine Vielzahl von Datenstrukturen wie Strings, Listen, Hashes usw. Hier konzentrieren wir uns hauptsächlich auf die beiden Datenstrukturen von Zählern und geordneten Mengen in Redis.

  1. Zähler: Der Zähler in Redis verwendet die String-Datenstruktur. Der Zähler kann über den INCR-Befehl erhöht werden und die Ablaufzeit kann eingestellt werden, um die regelmäßige Reinigung zu erleichtern.
  2. Geordneter Satz: Der geordnete Satz in Redis verwendet die ZSet-Datenstruktur (geordneter Satz). Jedes Element kann einer Bewertung zugeordnet und basierend auf der Bewertung sortiert werden. In einer geordneten Menge können Sie den Befehl ZRANGE verwenden, um Mitglieder innerhalb eines bestimmten Bereichs nach Punktzahl zu erhalten.

2. Ideen zur Implementierung der Strombegrenzungsfunktion
Durch Redis-Zähler und geordnete Sammlungen kann die verteilte Strombegrenzungsfunktion einfach implementiert werden. Die konkrete Idee lautet wie folgt:

  1. Stellen Sie einen Zähler ein, um die Anzahl der Verkehrsanfragen aufzuzeichnen.
  2. Legen Sie eine geplante Aufgabe fest, um regelmäßig die Anzahl der abgelaufenen Anfragen im Zähler zu löschen.
  3. Verwenden Sie eine geordnete Sammlung, um den Zeitstempel jeder Anfrage nach Zeit sortiert aufzuzeichnen.
  4. Jedes Mal, wenn eine Anfrage vorliegt, wird der früheste Anfragezeitpunkt innerhalb eines bestimmten Zeitbereichs basierend auf dem Zeitstempel im bestellten Satz ermittelt.
  5. Wenn innerhalb eines bestimmten Zeitraums (z. B. 1 Sekunde) mehr als die maximale Anzahl von Anfragen eingehen, wird dies als Überschreitung des aktuellen Limits gewertet.

3. Codebeispiel

Das Folgende ist ein Codebeispiel für die verteilte Strombegrenzung von Redis, geschrieben in 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();
    }
}

Der obige Code implementiert eine einfache verteilte Strombegrenzungsfunktion. Darunter kapselt die RateLimiter-Klasse die Strombegrenzungslogik und die Main-Klasse wird zum Testen verwendet.

Fazit:
Die Verwendung von Redis zur Implementierung der verteilten Strombegrenzungsfunktion kann die Stabilität und Leistung des Geschäftssystems problemlos schützen. Durch die Zusammenarbeit von Zählern und geordneten Abholungen lässt sich die Anzahl der Anfragen flexibel steuern und durch die Festlegung der Ablaufzeit können abgelaufene Anfragen automatisch bereinigt werden. Das Obige ist ein Beispielcode. Das spezifische Nutzungsszenario muss entsprechend der tatsächlichen Situation angepasst und optimiert werden. Ich hoffe, dieser Artikel hilft Ihnen!

Das obige ist der detaillierte Inhalt vonSo implementieren Sie mit Redis eine verteilte Strombegrenzungsfunktion. 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