Redis
 sql >> Base de données >  >> NoSQL >> Redis

stocker les plages d'adresses IP dans Redis

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.