Det afhænger af, om du mener, at dine IP-områder kan overlappe eller ej. Hvis ikke, er løsningen ret enkel:
- brug en samling hash til at gemme udbyderes data
- brug et zset til at indeksere maks. værdien af dine intervaller
- hent det (unikke) område, hvis maks. værdi er større end en IP
- kontroller, at min. værdi for dette område er lavere end IP'en
Eksempel:
Her er mine udbydere. Hver af dem er identificeret med et id. Bemærk venligst, at jeg kunne tilføje flere egenskaber knyttet til hver udbyder:
> 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
Hver gang en udbyder tilføjes i systemet, skal der vedligeholdes et indeks (manuelt:dette er Redis, ikke en relationel database). Score er den maksimale værdi, medlem er id'et for området.
> 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"
For nu at forespørge på det unikke område, der svarer til en IP-adresse, skal du bruge 2 rundrejser:
> 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"
Så skal klientprogrammet bare tjekke, at din IP er større eller lig med minimumsadressen for det returnerede område.
Hvis du nu tænker på, at intervallerne kan overlappe, er løsningen meget mere kompleks, og den er allerede blevet forklaret her.