Es hängt davon ab, ob sich Ihre IP-Bereiche überschneiden können oder nicht. Wenn nicht, ist die Lösung ganz einfach:
- Verwenden Sie eine Hash-Sammlung, um Anbieterdaten zu speichern
- verwenden Sie ein Zset, um den Maximalwert Ihrer Bereiche zu indizieren
- den (eindeutigen) Bereich abrufen, dessen Maximalwert größer als eine IP ist
- Überprüfen Sie, ob der Mindestwert dieses Bereichs niedriger als die IP ist
Beispiel:
Hier sind meine Anbieter. Jeder von ihnen wird mit einer ID identifiziert. Bitte beachten Sie, dass ich jedem Anbieter weitere Eigenschaften hinzufügen könnte:
> hmset providers:1 name P1 min 3232235786 max 3232235826
OK
> hmset providers:2 name P3 min 1232235786 max 1232235826
OK
> hmset providers:3 name P3 min 2232235786 max 2232235826
OK
> hmset providers:4 name P4 min 4232235786 max 4232235826
OK
Jedes Mal, wenn ein Anbieter im System hinzugefügt wird, muss ein Index gepflegt werden (manuell:das ist Redis, keine relationale Datenbank). Score ist der Maximalwert, Member ist die ID des Bereichs.
> zadd providers:index 3232235826 1 1232235826 2 2232235826 3 4232235826 4
(integer) 4
> zrange providers:index 0 -1
1) "2"
2) "3"
3) "1"
4) "4"
Um nun den eindeutigen Bereich abzufragen, der einer IP-Adresse entspricht, benötigen Sie zwei Roundtrips:
> zrangebyscore providers:index 3232235787 +inf LIMIT 0 1
1) "1"
> hgetall providers:1
1) "name"
2) "P1"
3) "min"
4) "3232235786"
5) "max"
6) "3232235826"
Dann muss das Client-Programm nur prüfen, ob Ihre IP-Adresse größer oder gleich der Mindestadresse des zurückgegebenen Bereichs ist.
Wenn Sie nun bedenken, dass sich die Bereiche überschneiden können, ist die Lösung viel komplexer und wurde hier bereits erklärt.