Speicher-IP-Bereiche in Redis

8

Ich habe viele IP-Bereiche von verschiedenen Anbietern. Zum Beispiel

%Vor%

Ich konvertiere diese IP in int32:

%Vor%

Meine Aufgabe: , um den Anbieternamen nach Benutzer-IP-Adresse zu suchen (z. B. 192.168.2.20 (3232236052))

In MySQL ist es einfach:

%Vor%

Wie geht das Gleiche mit Redis?

    
trong 03.04.2012, 07:37
quelle

4 Antworten

14

Das hängt davon ab, ob Ihre IP-Bereiche sich überschneiden oder nicht. Wenn nicht, ist die Lösung ziemlich einfach:

  • Verwenden Sie eine Hash-Sammlung, um die Daten des Providers zu speichern
  • Verwenden Sie ein Zset, um den maximalen Wert Ihrer Bereiche zu indizieren
  • ruft den (eindeutigen) Bereich ab, dessen Maximalwert größer ist als eine IP
  • Überprüfen Sie, ob der Mindestwert dieses Bereichs niedriger ist als die IP

Beispiel:

Hier sind meine Provider. Jeder von ihnen wird mit einer ID identifiziert. Bitte beachten Sie, dass ich jedem Anbieter weitere Eigenschaften hinzufügen könnte:

%Vor%

Jedes Mal, wenn ein Provider im System hinzugefügt wird, muss ein Index gepflegt werden (manuell: das ist Redis, keine relationale Datenbank). Score ist der maximale Wert, member ist die ID des Bereichs.

%Vor%

Um nun den eindeutigen Bereich einer IP-Adresse abzufragen, benötigen Sie 2 Roundtrips:

%Vor%

Dann muss das Client-Programm nur überprüfen, ob Ihre IP-Adresse größer oder gleich der Mindestadresse des zurückgegebenen Bereichs ist.

Wenn Sie jetzt davon ausgehen, dass sich die Bereiche überschneiden können, ist die Lösung viel komplexer und wurde bereits erläutert. hier .

    
Didier Spezia 03.04.2012, 10:19
quelle
9

Meiner Meinung nach wäre die beste Lösung sortiert .

Um den Bereich einzufügen, verwenden Sie ZADD .
To member range range_name zuweisen.
Zu score den höchsten Wert im Bereich zuweisen.

%Vor%

Um den Bereich zu finden, verwenden Sie ZRANGBYSCORE mit user_ip als min_value und limit = 1.

%Vor%

Es wird ein Bereich mit der kleinsten IP am Endpunkt gefunden, der größer oder gleich user_ip ist.

    
Jarosław Gomułka 03.04.2012 07:55
quelle
0

Wenn Sie diese Daten für einen Lieferanten wie MaxMind erhalten, sind möglicherweise bereits Bibliotheken verfügbar, um dies schnell und effizient durchzuführen. Ich denke nicht, dass Sie in diesem Fall viel Leistung mit Redis erzielen werden.

    
Joshua Martell 03.04.2012 13:30
quelle
0

Dies ist ähnlich dem, was Didier Spezia vorgeschlagen hat, aber wir verwenden Anfangsbereich und Endbereich in sortierter Menge, da es "Lücken" geben kann.

Ссылка

    
Nick 24.03.2013 20:05
quelle

Tags und Links