内部的には、Redisは最も効率的な方法で文字列を保存します。整数を基数10の文字列に強制すると、実際にはより多くのメモリが使用されます。
Redisが文字列を保存する方法は次のとおりです-
- 10000未満の整数は共有メモリプールに格納され、メモリのオーバーヘッドはありません。必要に応じて、redis.hの定数REDIS_SHARED_INTEGERSを変更し、Redisを再コンパイルすることで、この制限を増やすことができます。
- 10000より大きく、longの範囲内の整数は8バイトを消費します。
- 通常の文字列は、len(string)+長さの場合は4バイト+空き領域のマーキングの場合は4バイト+ヌルターミネータの場合は1バイト+mallocオーバーヘッドの場合は8バイトを取ります。
引用した例では、長いv / sの場合は8バイト、文字列の場合は21バイトの質問です。
編集:
では、10,000未満の数値のセットがある場合、Redisはどのようにセットを保存しますか?
それはあなたが持っている要素の数に依存します。
セットに含まれる要素が512未満の場合(set-max-intset-entries
を参照) )、セットはIntSetとして保存されます。 IntSetは、ソートされた整数配列の称賛された名前です。数値が10000未満であるため、要素ごとに16ビットを使用します。これは(ほぼ)Cアレイと同じくらいメモリ効率が良いです。
512を超える要素がある場合、セットはHashTableになります。セット内の各要素は、robj
と呼ばれる構造にラップされています。 、16バイトのオーバーヘッドがあります。 robj
構造体には整数の共有プールへのポインタがあるため、整数自体に追加料金を支払う必要はありません。そして最後に、robj
インスタンスはハッシュテーブルに格納され、ハッシュテーブルにはセットのサイズに比例するオーバーヘッドがあります。
要素が消費するメモリの正確な量に関心がある場合は、データセットでredis-rdb-toolsを実行します(免責事項:私はこのツールの作成者です)。または、MemoryCallbackクラスのソースコードを読むことができます。コメントは、メモリがどのように配置されているかを説明しています。