私は、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
を参照する場合
私はredis-3.2.8を使用しています。シナリオ1とシナリオ2で撮影した正確なメモリを確認するにはどうすればよいですか? –
1)再設定をリセットする2)INFOメモリからベースラインを取る3)相当量の同一のキーを作成する4)別の読み取りを行う5)各実験ごとに繰り返して比較する。不正確ですが、v4より前にできることは最高です。 –
編集したバージョンが正しいかどうかを確認します。 –