2012-11-06 1 views
12

実際、私は3つのRedisインスタンスを持っていて、それらをまとめてこの500MB + dump.rdbに入れます。 Redisサーバーはこのdump.rdbを読み取ることができ、すべて正常であるようです。その後、私はredis-serverのコストが5.0GB以上のメモリになることに気付きました。どうしてか分かりません。500MBのRedisのdump.rdbファイルに約5.0GBのメモリが必要なのはなぜですか?

ファイルに問題がありますか?私のdbには約300万のキーがあり、各キーの値は約80個の整数を含むリストです。

私はこのMETHODを使用して3つのインスタンスをまとめます。

PS:同じサイズと同じキー値構造の別のdump.rdbは、わずか1GBのメモリしか必要としません。

私のデータは、keyNum - > {num1、num2、num3、......}のように見えます。すべての数字は1〜4,000,000です。リストを使ってそれらを保存する必要がありますか?今のところ、私はlpush(k、v)を使います。この方法はコストがかかりすぎましたか?

答えて

0

それ以上はあるかもしれませんが、私はRedisがダンプファイルを圧縮すると信じています。

+0

はい、データを圧縮します。 500MBから5.0GBまで、今すぐプログラムを起動することはできません:-( – wyp

15

メモリとダンプのサイズの比は、Redisが内部で使用するデータ型によって異なります。

小さなオブジェクト(ハッシュ、リスト、ソートセット)の場合、redisはziplistsを使用してデータをエンコードします。整数で構成される小さなセットの場合、redisはIntsetsを使用します。 ZipListsおよびIntSetは、ディスクに、メモリに保存されているのと同じ形式で格納されます。したがって、データがこれらのエンコードを使用する場合、1対1の比率を期待します。

大きなオブジェクトの場合、インメモリ表現はディスク上の表現とはまったく異なります。オンディスクフォーマットは圧縮されており、ポインタを持たず、メモリの断片化を処理する必要もありません。したがって、オブジェクトが大きい場合、10:1のメモリとディスクの比率は正常であり、予想されます。

メモリを消費するオブジェクトを知りたい場合は、redis-rdb-toolsを使用してデータをプロファイルします。そこから、memory optimization notes on redis.iomemory optimization wiki entry on redis-rdb-toolsに従ってください。

関連する問題