sql >> データベース >  >> NoSQL >> Redis

32ビット符号付き整数をRedisに格納するためのメモリ効率の高い方法

    内部的には、Redisは最も効率的な方法で文字列を保存します。整数を基数10の文字列に強制すると、実際にはより多くのメモリが使用されます。

    Redisが文字列を保存する方法は次のとおりです-

    1. 10000未満の整数は共有メモリプールに格納され、メモリのオーバーヘッドはありません。必要に応じて、redis.hの定数REDIS_SHARED_INTEGERSを変更し、Redisを再コンパイルすることで、この制限を増やすことができます。
    2. 10000より大きく、longの範囲内の整数は8バイトを消費します。
    3. 通常の文字列は、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クラスのソースコードを読むことができます。コメントは、メモリがどのように配置されているかを説明しています。



    1. MongoDBの接続文字列(例付き)

    2. Redis RDBとAOFを無効にする方法は?

    3. MongoDBの耐久性と書き込みの安全性を理解する

    4. Spring Data Redis-UUID id-ConverterNotFoundException