2017-04-27 16 views
1

私は、2つのシナリオで、赤目のメモリサイズを評価しようとしています。ハッシュマップ対文字列キーのRedisメモリ最適化

シナリオ1:このシナリオで

String commonString = "Test"; 
    long commonId = 1234567890L; 
    int size = 0; 
    for(int i = 1; i <= 100; i++) 
    { 
     jedis.set((commonString+"_"+commonId+"_KEY_"+i).getBytes(),("Value_"+i).getBytes()); 
     DebugParams debugParams = DebugParams.OBJECT(commonString+"_"+commonId+"_KEY_"+i); 
     size += Integer.parseInt(debugged.split(":")[4].split(" ")[0]); 
    } 

、サイズが892バイト

シナリオ2:このシナリオで

String commonString = "Test"; 
    long commonId = 1234567890L; 
    int size = 0; 
    for(int i = 1; i <= 100; i++) 
    { 
     jedis.hset((commonString+"_"+commonId).getBytes(),SafeEncoder.encode("KEY_"+i),("Value_"+i).getBytes()); 
    } 
    DebugParams debugParams = DebugParams.OBJECT(commonString+"_"+commonId); 
    String debugged = jedis.debug(debugParams); 
    size = Integer.parseInt(debugged.split(":")[4].split(" ")[0]); 

、それは925バイトを取ります。

Redis 2.2以降、多くのデータ型は、一定のサイズまでのスペースを少なくするように最適化されています。指定された数の要素より小さく、最大要素のサイズまでの、ハッシュ、リスト、整数だけで構成されるセット、ソートされたセットは、メモリを10倍も使用する非常にメモリ効率の良い方法でエンコードされます(5使用された時間が少ないメモリが平均保存率である)。

私はこの最適化を試みましたが、達成できませんでした。設定はデフォルト設定です。何がうまくいかなかったのでしょうか?

編集INFO1に

シナリオ1シナリオ1では

String commonString = "Test"; 
    long commonId = 1234567890L; 
    jedis.flushAll(); 
    String info1 = jedis.info(); 
    for(int i = 1; i <= 75; i++) 
    { 
     jedis.set(commonString+"_"+commonId+"_KEY_"+i, "VALUE_"+i); 
    } 
    String info2 = jedis.info(); 

、使用するメモリが "used_memory:844640" であり、INFO2に使用されるメモリは、 ":852176 used_memory" です。したがって、info2とinfo1の違いは7536バイトです。シナリオ2では

シナリオ2

String commonString = "Test"; 
    long commonId = 1234567890L; 
    jedis.flushAll(); 
    String info1 = jedis.info(); 
    for(int i = 1; i <= 75; i++) 
    { 
     jedis.hset(commonString+"_"+commonId,"KEY_"+i,"VALUE_"+i); 
    } 
    String info2 = jedis.info(); 

、INFO1に使用されるメモリは、 "used_memory:845576" であり、INFO2および使用メモリ ":847208 used_memory" です。したがって、info2とinfo1の違いは1632バイトです。

正しく評価されていますか?あなたはドキュメントに関するDEBUG OBJECTを参照する場合

答えて

1

、あなたはそれを学びます:

Debugオブジェクトは、クライアントによって使用されるべきではないデバッグコマンドです。代わりにOBJECTコマンドを確認してください。

DebugParams.OBJECTから戻ってくるものは、達成しようとしているものとはまったく関連していない可能性がほとんどあります。

Redis v4で新しいMEMORY(Doctor)コマンドが導入されました。以下は、@antirez's 'The first release candidate of Redis 4.0 is out'からの抜粋です。

6.新しいMEMORYコマンドです。

メーリングリスト に「マイレディスが遅い」という不満を軽く導入したのは、レイテンシードクターが好きだったのと同じくらい、大好きです。今私達は記憶の問題のためにそれを持っている。

127.0.0.1:6379> MEMORY DOCTOR 
Hi Sam, this instance is empty or is using very little memory, my issues detector can't be used in these conditions. Please, leave for 

あなたの使命は地球上にあり、いくつかのデータで埋めてください。新しいSamと私は が再起動したらすぐに私たちのプログラミングに戻ります。

SFの対話のインスピレーションを得るために映画の権利所有者が私を訴えるかもしれませんが、それでも問題ありません。私が の刑務所にいるとき、私のためにオレンジを持って来てください。

メモリはそれ以上のことがあります。

127.0.0.1:6379> MEMORY HELP 
1) "MEMORY USAGE <key> [SAMPLES <count>] - Estimate memory usage of key" 
2) "MEMORY STATS       - Show memory usage details" 
3) "MEMORY PURGE       - Ask the allocator to release memory" 
4) "MEMORY MALLOC-STATS     - Show allocator internal stats" 

USAGEサブコマンドのメモリ使用量の報告は非常に便利になるだろうが、また、「STATS」で提供中の深度情報れます。

今のところこれはすべて文書化されていないので、楽しいことが何であるかを理解してください。

+0

私はredis-3.2.8を使用しています。シナリオ1とシナリオ2で撮影した正確なメモリを確認するにはどうすればよいですか? –

+0

1)再設定をリセットする2)INFOメモリからベースラインを取る3)相当量の同一のキーを作成する4)別の読み取りを行う5)各実験ごとに繰り返して比較する。不正確ですが、v4より前にできることは最高です。 –

+0

編集したバージョンが正しいかどうかを確認します。 –

関連する問題