Cela dépend si vous considérez que vos plages d'adresses IP peuvent se chevaucher ou non. Si ce n'est pas le cas, la solution est assez simple :
- utiliser une collection de hachage pour stocker les données des fournisseurs
- utilisez un zset pour indexer la valeur maximale de vos plages
- récupérer la plage (unique) dont la valeur maximale est supérieure à une adresse IP
- vérifier que la valeur minimale de cette plage est inférieure à l'IP
Exemple :
Voici mes fournisseurs. Chacun d'eux est identifié par un identifiant. Veuillez noter que je pourrais ajouter plus de propriétés attachées à chaque fournisseur :
> 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
Chaque fois qu'un fournisseur est ajouté dans le système, un index doit être maintenu (manuellement :il s'agit de Redis, pas d'une base de données relationnelle). Le score est la valeur maximale, le membre est l'identifiant de la plage.
> 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"
Maintenant, pour interroger la plage unique correspondant à une adresse IP, il vous faut 2 allers-retours :
> 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"
Ensuite, le programme client n'a plus qu'à vérifier que votre adresse IP est supérieure ou égale à l'adresse minimale de la plage renvoyée.
Maintenant, si vous considérez que les plages peuvent se chevaucher, la solution est beaucoup plus complexe, et elle a déjà été expliquée ici.