sql >> Base de Datos >  >> NoSQL >> Redis

almacenar rangos de IP en Redis

Depende de si consideras que tus rangos de IP pueden superponerse o no. Si no, la solución es bastante sencilla:

  • usar una colección de hash para almacenar datos de proveedores
  • use un zset para indexar el valor máximo de sus rangos
  • recuperar el rango (único) cuyo valor máximo es mayor que una IP
  • verifique que el valor mínimo de este rango sea menor que la IP

Ejemplo:

Aquí están mis proveedores. Cada uno de ellos está identificado con un id. Tenga en cuenta que podría agregar más propiedades adjuntas a cada proveedor:

> 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

Cada vez que se agrega un proveedor en el sistema, se debe mantener un índice (manualmente:esto es Redis, no una base de datos relacional). La puntuación es el valor máximo, el miembro es la identificación del rango.

> 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"

Ahora, para consultar el rango único correspondiente a una dirección IP, necesita 2 viajes de ida y vuelta:

> 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"

Luego, el programa cliente solo tiene que verificar que su IP sea mayor o igual que la dirección mínima del rango devuelto.

Ahora, si considera que los rangos pueden superponerse, la solución es mucho más compleja y ya se ha explicado aquí.