以下java代码在redis中插入了一百万个整数对。
public class JedisInsertion {
public static byte[] fromInt(int v) {
return ByteBuffer.allocate(4).putInt(v).array();
}
public static void main(String args[]) {
Jedis j = new Jedis("localhost");
for (int i = 0;i<1000*1000;i++){
j.set(fromInt(i),fromInt(i));
}
}
}
这是redis信息输出
...
used_memory:89319664
arch_bits:64
...
89319664意味着每个键值对约89个字节。
我期待大约8 MB的东西(4个字节用于密钥+ 4个字节的值)。
我还在32位模式下编译redis(仍在64位运行测试 位机)。
32位版本的redis的结果:
used_memory:68831664 =&gt;每个键值对68个字节。
这两项结果都比我预期的要好几倍。
当我使用CLI查看redis时,我看到一个典型的键看起来像这样:“\ x00 \ x00 \ xc2 \ xff”
感谢您的反馈
PS - 我在64位计算机上使用Redis 2.2.14和Jedis 2.0
PSS - 我也尝试将其中一个值存储在一个哈希值中,这里是代码:
for (int i = 0;i<1000*1000;i++){
j.hset("my-hash".getBytes(),fromInt(i),fromInt(i));
}
以下是结果:
used_memory_rss:84676608 (for 32bit build)
used_memory:105319712 (for 64bit build)
当我使用单个哈希时,结果会更糟。
答案 0 :(得分:1)
每个键/值类型68个字节是正确的。 Redis不会在内部将事物存储为纯文本文件,否则它将无法以快速方式查找它,拥有不同类型的对象,等等。有相关的开销。 Redis.io的文档中有更多相关信息。
答案 1 :(得分:0)
您的密钥是不可读的二进制值的事实是由Jedis做出的决定,因为Redis可以使用几乎任何东西作为密钥。
Redis键具有过期和其他占用额外空间的元数据。如果您担心空间,请考虑将所有值存储在单个Redis哈希中。哈希中的键/值对的开销明显少于标准键/值对的开销。