0

次の 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)

単一のハッシュを使用すると、結果はさらに悪化します。

4

2 に答える 2

1

キー/値のタイプごとに 68 バイトが正しいです。Redis はプレーン テキスト ファイルとして内部的に保存しません。そうしないと、高速な方法で検索したり、さまざまな種類のオブジェクトを取得したりすることができなくなります。関連するオーバーヘッドがあります。これについては、Redis.io のドキュメントに詳しい情報があります。

于 2011-10-06T09:42:21.940 に答える
0

キーが読み取り不可能なバイナリ値であるという事実は、Redis がほとんど何でもキーとして使用できるため、Jedis が下した決定です。

Redis キーには、追加のスペースを占有する有効期限とその他のメタデータがあります。容量が気になる場合は、すべての値を 1 つの Redis ハッシュに格納することを検討してください。ハッシュ内のキーと値のペアのオーバーヘッドは、標準のキーと値のペアよりも大幅に少なくなります。

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

于 2011-10-06T17:42:47.017 に答える