2

私はRedisを初めて使用し、いくつかのデータをキャッシュして、メモリ使用量/パフォーマンスがMemcachedなどの他のオプションとどのように比較されるかを試しています。IRedisClient経由で ServiceStack.Redis クライアント ライブラリを使用しています

私は Redis をテストしており、25,000 個のキー/値オブジェクトは、100MB の dump.rdb ファイルで約 250MB のメモリをプッシュしています。これよりも多くをキャッシュする必要があり、可能であればメモリ消費を削減したいと考えています。私の推測では、各キャッシュ アイテムのテキスト (JSON blob) のサイズは約 4k ですが、私の基本的な計算が正しければ、少なくともメモリ フットプリントの観点から、各アイテムは Redis で約 10k を消費しています。ダンプ サイズとメモリ内サイズの大きな違いは、私にとっては少し憂慮すべきことです。

私は現在64ビットVMでも実行しています.32ビットに比べて多くの余分なスペースを浪費していることを理解しているので、それも調べます. redis は、ポインタごとに 2 倍のメモリを必要とするようです (キャッシュされたキー/値ごとに?)。これが 2.5 倍のディスクとメモリの比率の由来でしょうか?

Redis に出入りする途中でデータの圧縮/解凍を処理するコードを自分の側で記述できることは理解していますが、StreamExtensionsと同様のことを行うようにクライアント ライブラリを構成する方法があるかどうかに興味があります。

使用パターンは準備ができており、書き込みの頻度が低く、キャッシュ更新書き込みのバッチ処理が行われています。

とにかく、特定のメモリ量でより多くのキャッシュ アイテムを取得する方法についての提案を探しています。

4

2 に答える 2

2

考慮すべき点は複数あります。以下では、データが JSON オブジェクトを含む文字列に格納されているとします。

最初のポイントは、4 KB の JSON オブジェクトが格納されていることです。動的データ構造とポインターによる Redis のオーバーヘッドは、有用なデータのサイズと比較して、まったく無視できます。非常に小さなオブジェクト (キーあたり約 80 バイト) が多数ある場合、このオーバーヘッドは高くなりますが、4 KB のオブジェクトでは問題になりません。

そのため、32 ビット バージョン (ポインターのサイズを小さくする) を使用しても役に立ちません。

2 番目のポイントは、メモリ フットプリントとダンプ ファイル サイズの違いは、ダンプ ファイル内の文字列が LZF アルゴリズムを使用して圧縮される (そして JSON は非常によく圧縮される) という事実によって簡単に説明できるということです。一般に、圧縮されていないデータの場合、メモリ フットプリントはダンプ ファイルのサイズよりもはるかに大きくなります。

データの実際のサイズとメモリ フットプリントの違いは、おそらくアロケーターの内部断片化によるものです。一般に、人々は外部の断片化 (つまり、ほとんどの人が一般的にメモリの断片化と呼ぶもの) のみを考慮しますが、状況によっては、内部の断片化も大きなオーバーヘッドになることがあります。ここで定義を参照してください。

あなたの状況では、4 KB のオブジェクトは実際にはこの最悪のケースの 1 つです。Redis は、明確に定義された割り当てクラスを特徴とする jemalloc アロケーターを使用します。4 KB が割り当てクラスで、次が 8 KB であることがわかります。これは、多くのオブジェクトの重量が 4 KB (8 バイトの Redis 文字列オーバーヘッドを含む) を少し超える場合、4 KB ではなく 8 KB が割り当てられ、メモリの半分が無駄になることを意味します。

この点は、4 KB より少し小さいオブジェクトのみを格納することで簡単に確認でき、メモリ フットプリントと有用なデータの予想サイズとの比率を計算できます。4 KB より少し大きいオブジェクトで同じ操作を繰り返し、結果を比較します。

オーバーヘッドを削減するために考えられる解決策:

  • クライアント側の圧縮。任意の軽量圧縮アルゴリズム (LZF、LZO、quicklz、snappy) を使用します。ほとんどのオブジェクトのサイズを 4 KB 未満に維持できれば、うまく機能します。

  • メモリ アロケータを変更します。Redis makefile は、メモリ アロケータとして tcmalloc (Google アロケータ) もサポートしています。割り当てクラスが異なるため、これらの 4 KB オブジェクトのメモリ オーバーヘッドを削減できます。

他のインメモリ ストアでも、同じ種類のオーバーヘッドが発生することに注意してください。たとえば、memcached の場合、メモリ消費を最適化し、内部および外部の断片化を最小限に抑えるのはスラブ アロケータの役割です。

于 2012-11-05T09:07:07.073 に答える
1

Redis を効率的に使用する方法を理解するのに苦労しました。特に Memcache(get/set) VS Redis (文字列、ハッシュ、リスト、セット、ソート済みセット) から来た場合。

Redis のメモリ使用量に関するこの記事を読む必要があります: http://nosql.mypopescu.com/post/1010844204/redis-memory-usage。古い記事 (2010 年) ですが、それでも興味深いものです。

ここに2つの解決策があります:

  • 32 ビット インスタンスをコンパイルして使用します。ダンプ ファイルは 32 ビットと 64 ビットの間で互換性があり、必要に応じて後で切り替えることができます。

  • ハッシュを使用すると、私はより良く見えます: http://redis.io/topics/memory-optimization。「ハッシュを使用して、Redis 上の非常にメモリ効率の良いプレーンなキー値ストアを抽象化する」セクションを読んでください。ServiceStack.Redis は RedisClientHash を提供します。使いやすいはずです!

それがあなたを助けることを願っています!

于 2012-11-04T22:01:50.920 に答える