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

时间:2011-11-17 22:01:06

标签: ruby string caching integer redis

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

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

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

3 个答案:

答案 0 :(得分:5)

这取决于你是怎么做的。在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已经覆盖了那里。

答案 1 :(得分:2)

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

目前,内存/磁盘空间很便宜,因此如果可以的话,您可以更好地投资可行的未来验证解决方案,而不是担心磁盘空间。

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

答案 2 :(得分:0)

如果将整数和ip存储为整数,则会占用4个字节。作为字符串“abc.def.ghi.jkl”,当存储为以null结尾的ascii字符串时,它将使用16个字节,因此如果存储为unicode字符串,则至少为4或甚至7+。搜索整数也比字符串快得多,因为你的处理器经过优化可以比较整数......