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

标签 ruby string caching integer redis

我需要将 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”在保存为字符串时是十个字节,这就是上面的代码将要做的。

要在 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 已经涵盖了所有内容。

关于ruby - Redis:我应该将 IP 转换为整数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8174981/

相关文章:

postgresql - 如何使用 MongoDB 作为 Postgresql 的缓存?

caching - 如何处理并发Web用户的重置CS-Script

ruby - Net::Telnet - 以 UTF-8 格式放置或打印字符串

android - 将来自服务器的数据放入字符串数组

php - 我应该为这个 php/mysql xml 生成 api 使用什么缓存策略/技术

linux - Bash 字符串比较语法

java - 如何连接多个不同格式的字符串然后拆分它们

ruby - ActiveRecord::StatementInvalid 在/category/5

ruby-on-rails - 添加图像以设计 Mailer 模板

ruby-on-rails - 此代码能够从文件系统读取 CSV 文件,但是从 URL 读取呢?