绝地存储混乱,这是Redis还是绝地的问题?
下面的java代码将一百万个整数对插入到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
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)