Heim  >  Artikel  >  Datenbank  >  Das Prinzip und die Implementierungsmethode von Redis zur Implementierung einer verteilten Strombegrenzung

Das Prinzip und die Implementierungsmethode von Redis zur Implementierung einer verteilten Strombegrenzung

WBOY
WBOYOriginal
2023-05-11 16:40:591861Durchsuche

Mit der Entwicklung des Internets müssen viele Anwendungen den Fluss verschiedener Anfragen begrenzen. Dies liegt daran, dass die Anwendung bei hoher Parallelität einer großen Anzahl von Anforderungen ausgesetzt ist, was dazu führt, dass der Dienst abstürzt oder langsam reagiert. Um dieses Problem zu lösen, verwenden Entwickler normalerweise verteilte Strombegrenzungstechnologien, um den Anforderungsfluss zu steuern und die hohe Verfügbarkeit und Stabilität des Dienstes sicherzustellen. Als leistungsstarkes Speicherdatenspeichersystem ist Redis eine der am häufigsten verwendeten Lösungen zur verteilten Strombegrenzung. In diesem Artikel werden das Prinzip und die Implementierungsmethode der verteilten Strombegrenzung in Redis vorgestellt.

1. Was ist verteilte Strombegrenzung?

Unter verteilter Strombegrenzung versteht man den Prozess der Steuerung des Anforderungsverkehrs durch Zusammenarbeit zwischen mehreren Servern. Ein Ratenbegrenzer zählt die Anzahl der Anfragen, vergleicht die Rate der eingehenden Anfragen mit der zulässigen Rate und akzeptiert oder lehnt Anfragen basierend auf dem Verhältnis ab. Bei der verteilten Drosselung teilt jeder Knoten die Anforderungsrate und den Anforderungszähler, wodurch sichergestellt wird, dass die Rate für alle Knoten gleich ist und eine Überlastung eines Knotens vermieden wird.

2. Das Prinzip der Implementierung einer verteilten Strombegrenzung durch Redis

Redis verwendet seine integrierte Datenstruktur, insbesondere zset (sortierter Satz), um eine verteilte Strombegrenzung zu implementieren. Ein Zset ist eine sortierte Menge, bei der jedes Element eindeutig ist und eine Punktzahl hat. Die Punktzahl wird zum Sortieren von Elementen verwendet, normalerweise Zahlen oder Zeiten. Bei der verteilten Strombegrenzung können wir für jeden Benutzer (oder jede IP-Adresse) einen Zset festlegen und diesen Zset dann zum Speichern des Anforderungszählers des Benutzers verwenden. Wenn jede Anfrage eintrifft, speichern wir sie in einem Zset und erhöhen den Zähler mit dem INCRBY-Befehl von Redis. Anschließend übergeben wir die Anforderungsbewertung und den aktuellen Zeitstempel zusammen als Parameter an den Befehl zrangebyscore, um die Anforderungsrate innerhalb eines bestimmten Zeitbereichs zu berechnen. Wenn der Preis unseren zulässigen Preis überschreitet, wird die Anfrage abgelehnt.

3. Wie Redis die verteilte Strombegrenzung implementiert

Die spezifische Implementierung der verteilten Strombegrenzung durch Redis ist wie folgt:

  1. Erstellen Sie ein globales Zset zum Speichern des Strombegrenzers (ein Strombegrenzer stellt einen Benutzer oder eine IP-Adresse dar) und eine Anfrage Zähler pro Ratenbegrenzer.
  2. Immer wenn eine Anfrage eintrifft, speichern wir sie im Zset dieses Ratenbegrenzers und erhöhen den Zähler mit dem INCRBY-Befehl. Standardmäßig erhöht dieser Befehl den Zähler jedes Mal um 1, Sie können die Erhöhung jedoch erhöhen, indem Sie die Argumente des Befehls auf einen höheren Wert festlegen.
  3. Verwenden Sie den Befehl zrangebyscore, um alle Anfragen mit einem Anfragezähler innerhalb eines bestimmten Zeitraums zu finden und die Anfragerate zu berechnen.
  4. Wenn die Anforderungsrate die zulässige Rate überschreitet, wird die Anforderung abgelehnt und eine Fehlermeldung zurückgegeben.
  5. Wenn die Anforderungsrate die zulässige Rate nicht überschreitet, akzeptieren Sie die Anforderung und aktualisieren Sie den Anforderungszähler in zset.

Das Folgende ist ein Beispielcode, der zeigt, wie Redis verwendet wird, um eine verteilte Strombegrenzung zu implementieren. Unter anderem haben wir ein globales Zset verwendet, um den Anforderungszähler für jede IP-Adresse zu speichern, und den Befehl zrangebyscore verwendet, um die Anforderungsrate pro Sekunde zu berechnen.

import redis
import time

class RateLimiter(object):
    def __init__(self, redis_client, rate, key_prefix='limiter'):
        self.redis = redis_client
        self.rate = rate
        self.key_prefix = key_prefix

    def allow_request(self, ip):
        key = '%s:%s' % (self.key_prefix, ip)
        now = time.time()
        count = self.redis.zcount(key, now - 1, now)
        if count < self.rate:
            self.redis.zadd(key, now, now)
            return True
        return False

if __name__ == '__main__':
    redis_client = redis.Redis()
    limiter = RateLimiter(redis_client, 5)
    for i in range(10):
        print(limiter.allow_request('192.168.1.1'))
        time.sleep(1)

Im obigen Code erstellen wir zunächst eine Klasse namens RateLimiter, die Redis als Backend-Speicher verwendet. Der Konstruktor akzeptiert zwei Parameter: Redis-Client-Instanz und Ratenlimit. Wann immer wir die Methode „allow_request“ aufrufen, akzeptiert sie einen Parameter, der eine IP-Adresse darstellt, und prüft dann, ob die Anzahl der Anfragen für diese IP-Adresse das Ratenlimit überschreitet. Wenn der Wert nicht überschritten wird, wird die Anforderung erfasst und „True“ zurückgegeben. Andernfalls wird die Anforderung abgelehnt und „False“ zurückgegeben.

In der Hauptfunktion haben wir eine Instanz namens limiter erstellt, das Ratenlimit auf 5 gesetzt (d. h. bis zu 5 Anfragen pro Sekunde akzeptieren) und dann 10 aufeinanderfolgende Anfragen simuliert, mit einem Intervall von 1 Sekunde zwischen jeder Anfrage. Zu Beginn der 6. Anfrage werden alle Anfragen abgelehnt und „False“ zurückgegeben, da das Ratenlimit erreicht ist.

4. Zusammenfassung

Redis ist ein leistungsstarkes Speicherdatenspeichersystem, das eine Vielzahl von Datenstrukturen bereitstellt, insbesondere Zset (Sorted Set), das eine ideale Wahl für die Implementierung einer verteilten Strombegrenzung ist. Durch die Verwendung von Funktionen wie den Befehlen zset, INCRBY und zrangebyscore von Redis können wir problemlos eine verteilte Strombegrenzung implementieren, um den Anforderungsfluss zu steuern und die hohe Verfügbarkeit und Stabilität des Dienstes sicherzustellen.

Das obige ist der detaillierte Inhalt vonDas Prinzip und die Implementierungsmethode von Redis zur Implementierung einer verteilten Strombegrenzung. 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