绝地存储混乱,这是Redis还是绝地的问题?

绝地存储混乱,这是Redis还是绝地的问题?,redis,jedis,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[]) { J

下面的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)); 
                } 
        } 
} 
89319664表示每个键值对约89字节

我期望的是8MB左右(4字节表示键+4字节值)

我还以32位模式编译了redis(仍然在64位计算机上运行测试) 钻头机)

32位版本redis的结果如下:

已用内存:68831664=>68字节/键值对

这两个结果都比我预期的高出好几倍

当我使用CLI查看redis时,我看到一个典型的键如下所示:“\x00\x00\xc2\xff”

我感谢你的反馈

PS-我在64位机器上使用Redis 2.2.14和绝地2.0

PSS-我还尝试按照其中一条注释的建议将所有值存储在一个哈希中,代码如下:

for (int i = 0;i<1000*1000;i++){
    j.hset("my-hash".getBytes(),fromInt(i),fromInt(i));
}

当我使用单个散列时,结果更糟。

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

您的密钥是不可读的二进制值这一事实是绝地武士的决定,因为Redis几乎可以使用任何东西作为密钥

Redis密钥具有过期时间和其他元数据,这会占用更多空间。如果你关心空间,考虑把所有的值存储在一个单独的ReHIS散列中。散列中键/值对的开销比标准键/值对的开销小得多

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)