Redis: я должен конвертировать IP в целые числа? - PullRequest
1 голос
/ 18 ноября 2011

Мне нужно хранить IP-адреса в хэше redis.

Будет ли значительная экономия памяти, если IP хранится в виде целого числа вместо строки?

Я бы использовал Ruby's IPAddr для преобразования IP в int.

Ответы [ 3 ]

5 голосов
/ 18 ноября 2011

Зависит от того, как ты это делаешь. В Redis ключи и (листовые) значения являются строками. Если вы преобразуете IP-адрес в int и отправляете его в Redis, как показано в следующем коде, вы не сильно сэкономите:

redis.hset("xyz", "ip", IPAddr.new(ip).to_i)

IP-адрес "255.255.255.255", например, составляет 15 байтов в точечной четырехугольной форме, его целочисленное представление "4294967295" составляет десять байтов при сохранении в виде строки, что и будет делать приведенный выше код.

Чтобы получить до четырех байтов, хранящихся в Redis, вам нужно отправить необработанные байты "\ xFF \ xFF \ xFF \ xFF".

В Ruby вы бы сделали это так:

packed_ip = IPAddr.new(ip).hton
redis.hset("xyz", "ip", packed_ip)

А потом, когда ты читаешь это обратно

packed_ip = redis.hget("xyz", "ip")
ip = IPAddr.ntop(packed_ip)

Что IPAddr.hton и IPAddr.ntop делают так:

packed_ip = ip.split('.').map(&:to_i).pack('C4') # hton
ip = packed_ip.unpack('C4').join('.') # ntop

Тогда есть все, что касается IPv6 и еще много чего, но я думаю, что IPAddr вас там охватил.

2 голосов
/ 18 ноября 2011

Возможно, вы захотите немного пересмотреть свой подход, поскольку появление IPv6 для хранения в виде целого числа было бы очень плохой идеей, если вы когда-нибудь захотите преобразовать свое приложение в использование IPv6 (или даже просто его поддерживать).

В наши дни память / дисковое пространство дешевы, поэтому вам лучше инвестировать в работоспособное решение для будущего, чем беспокоиться о дисковом пространстве, если можете.

В этом случае строка все равно будет лучшим вариантом, поскольку вы можете использовать IPv6 и IPv4 в одном поле.

0 голосов
/ 18 ноября 2011

Если вы храните и ip как целое число, оно будет занимать 4 байта. в качестве строки «abc.def.ghi.jkl» он будет использовать до 16 байт при хранении в виде строки ascii с нулевым символом в конце, поэтому он равен по крайней мере 4 или даже 7+, если хранится как строка в кодировке Юникод. Также поиск целых чисел намного быстрее, чем строк, потому что ваш процессор оптимизирован для сравнения целых чисел ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...