Jedis Storage Confusion,这是Redis还是Jedis的问题?

时间:2011-10-06 07:30:40

标签: redis jedis

以下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)

当我使用单个哈希时,结果会更糟。

2 个答案:

答案 0 :(得分:1)

每个键/值类型68个字节是正确的。 Redis不会在内部将事物存储为纯文本文件,否则它将无法以快速方式查找它,拥有不同类型的对象,等等。有相关的开销。 Redis.io的文档中有更多相关信息。

答案 1 :(得分:0)

您的密钥是不可读的二进制值的事实是由Jedis做出的决定,因为Redis可以使用几乎任何东西作为密钥。

Redis键具有过期和其他占用额外空间的元数据。如果您担心空间,请考虑将所有值存储在单个Redis哈希中。哈希中的键/值对的开销明显少于标准键/值对的开销。

http://redis.io/topics/memory-optimization