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?
Das hängt davon ab, ob Ihre IP-Bereiche sich überschneiden oder nicht. Wenn nicht, ist die Lösung ziemlich einfach:
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 .
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.
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.
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.
Tags und Links redis