繁体   English   中英

Redis:我应该将IP转换为整数吗?

[英]Redis: should I convert IPs into integers?

我需要将IP地址存储在Redis哈希中。

如果IP以整数而不是字符串存储,会节省大量内存吗?

我将使用Ruby的IPAddr将IP转换为int。

这取决于您的操作方式。 在Redis中,键和(叶)值是字符串。 如果将IP地址转换为int并将其发送给Redis,如以下代码所示,将不会节省很多:

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

例如,IP“ 255.255.255.255”为点分四边形形式的15个字节,当保存为字符串时,其整数表示“ 4294967295”为10个字节,这就是上面的代码所要做的。

要减少到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.htonIPAddr.ntop作用是这样的:

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

然后是有关IPv6的全部内容,但我想IPAddr已经为您介绍了。

您可能还希望重新考虑一下您的方法,如果您希望将应用程序转换为使用IPv6(甚至只是支持它),那么将IPv6存储为整数将是一个非常糟糕的主意。

如今,内存/磁盘空间很便宜,因此,如果可以的话,与担心磁盘空间相比,最好投资于可行的面向未来的解决方案。

在这种情况下,字符串仍然是最佳选择,因为您可以在同一字段中使用IPv6和IPv4。

如果您将ip存储为一个整数,它将占用4个字节。 作为字符串“ abc.def.ghi.jkl”存储为空终止的ascii字符串时,它将用完16个字节,因此,如果存储为unicode字符串,则至少是4甚至7+的因数。 而且搜索整数要比字符串搜索快得多,因为您的处理器已经过优化以比较整数...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM