Redis хранит 128-битное число

Я хочу эффективно искать диапазон подсети IPv6 с помощью Redis.

Я подумал о том, чтобы хранить числовые адреса IPv6 в Redis и искать их по диапазону. это 128-битные целые, например:

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

> 22923991422715307029586104612626104439L

и запрос по диапазону:

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

ОДНАКО, отсортированные наборы redis могут содержать оценку до 2^53, поэтому все мои большие целые числа обрезаются, и я теряю точность.

Есть ли способ сохранить такие большие числа в Redis без потери точности?

У вас есть лучшее предложение? Спасибо


person SagyDrucker    schedule 16.07.2017    source источник
comment
Вы можете преобразовать это число в массив байтов и вместо этого сохранить его.   -  person Guilherme    schedule 17.07.2017
comment
Redis может быть неподходящим инструментом для работы. Postgres, например, имеет надежную встроенную поддержку типов данных IPv4 и IPv6.   -  person tadman    schedule 17.07.2017
comment
@tadman redis идеально подходит для этого, но, как обычно с redis, требуется немного работы.   -  person Not_a_Golfer    schedule 17.07.2017


Ответы (1)


Вы можете использовать API лексического диапазона, он вам точно подойдет. https://redis.io/commands/zrangebylex

Вставьте адреса со счетом 0, я даже не думаю, что вам нужно кодировать их как числа, просто дополните отдельные байты, и вы сможете запросить диапазон.

person Not_a_Golfer    schedule 16.07.2017
comment
Для некоторых ответов, таких как приведенные выше, я хочу получить более одного голоса :) - person Itamar Haber; 17.07.2017
comment
@Not_a_Golfer, не могли бы вы рассказать об этом немного подробнее? Я пытаюсь реализовать что-то подобное, но у меня больше проблем, чем ожидалось. - person Jeremy Barnes; 05.12.2018