2017-07-16 3 views
0

Je veux rechercher efficacement gamme de sous-réseau IPv6 en utilisant redis.redis store 128 bit nombre

Je pensais stocker les adresses numériques IPv6 dans redis et les rechercher par plage. ce sont 128 bits ints, par exemple:

import ipaddress 
int(ipaddress.ip_address(u'113f:a:2:3:4:1::77')) 

> 22923991422715307029586104612626104439L 

et requête par plage:

ZRANGEBYSCORE numerics <subnet-S-start> <subnet-S-end> 

CEPENDANT, Redis triées-ensembles peuvent contenir score jusqu'à 2^53, donc Tous mes gros morceaux sont coupés et je perds de la précision.

Existe-t-il un moyen d'enregistrer de tels nombres en redis sans perte de précision?

Avez-vous une meilleure suggestion? Merci

+1

Vous souhaiterez peut-être convertir ce nombre en un tableau d'octets et enregistrer qu'à la place – Guilherme

+0

Redis peut ne pas être l'outil approprié pour le travail. Postgres, par exemple, a un support robuste et natif pour les types de données IPv4 et IPv6. – tadman

+0

@tadman redis est idéal pour cela, mais comme d'habitude avec redis, un peu de travail est nécessaire. –

Répondre

3

Vous pouvez utiliser l'API gamme lexicale, elle vous conviendra exactement. Insérez les adresses avec un score de 0, je ne pense même pas que vous avez besoin de les coder en tant que nombres, juste pad les octets individuels, et vous devriez être en mesure d'interroger une plage.

+0

Pour certaines réponses, comme ci-dessus, je veux avoir plus d'un upvote à donner :) –