次の Java コードは、100 万の整数ペアを 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 => キーと値のペアごとに 68 バイト。
両方の結果は、私が予想していたよりも数倍高いです。
CLI を使用して redis を見ると、典型的なキーは "\x00\x00\xc2\xff" のようになります。
フィードバックに感謝します
PS - 64 ビット マシンで Redis 2.2.14 と Jedis 2.0 を使用しています。
PSS-コメントの1つで提案されているように、すべての値を1つのハッシュに保存しようとしました。コードは次のとおりです。
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)
単一のハッシュを使用すると、結果はさらに悪化します。