Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

armazenar intervalos de ip no Redis


Depende se você considera que seus intervalos de IP podem se sobrepor ou não. Caso contrário, a solução é bem simples:
  • usar uma coleção de hash para armazenar dados de provedores
  • use um zset para indexar o valor máximo de seus intervalos
  • recupere o intervalo (único) cujo valor máximo é maior que um IP
  • verifique se o valor mínimo deste intervalo é menor que o IP

Exemplo:

Aqui estão meus fornecedores. Cada um deles é identificado com um id. Observe que eu poderia adicionar mais propriedades anexadas a cada provedor:
> 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 um provedor é adicionado ao sistema, um índice deve ser mantido (manualmente:este é o Redis, não um banco de dados relacional). Score é o valor máximo, member é o id do intervalo.
> 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"

Agora, para consultar o intervalo exclusivo correspondente a um endereço IP, você precisa de 2 ida e volta:
> 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"

Então o programa cliente só precisa verificar se o seu IP é maior ou igual ao endereço mínimo do intervalo retornado.

Agora, se você considerar que os intervalos podem se sobrepor, a solução é muito mais complexa e já foi explicada aqui.