我需要在redis哈希中存储IP地址。
如果IP存储为整数而不是字符串,是否会节省大量内存?
我将使用Ruby的IPAddr
将IP转换为int。
答案 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.hton
和IPAddr.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+。搜索整数也比字符串快得多,因为你的处理器经过优化可以比较整数......