RedisオブジェクトRedisおぶじぇくと:文字列オブジェクトもじれつおぶじぇくと


前に、複数のデータ構造文字列チェーン辞書ホッピング圧縮リスト整数セットについて説明しました.
次に、これらのデータ構造のRedisオブジェクトでの使用と変更について説明します.
Redisオブジェクトシステムは、文字列オブジェクトリストオブジェクトハッシュオブジェクト集合オブジェクト整列集合オブジェクトを含む
オブジェクトは少なくとも1種類以上のデータ構造を使用しており、条件が変化した場合にデータ構造の変更を行う
そのオブジェクトは参照カウント法に基づくメモリ回収メカニズムを実現した!!!メモリフラグメントの問題はどのように解決しますか?
Redis内の各オブジェクトは、1つのredisObject構造で表されます.
typedef struct redisObject {
    //  
    unsigned type:4;
 
    //  
    unsigned encoding:4;

    //             
    void *ptr;

} robj;

typeプロパティには、次のいずれかの値を持つオブジェクトのタイプが記録されます.
REDIS_STRING          
REDIS_LIST           
REDIS_HASH           
REDIS_SET            
REDIS_ZSET             

Redisの場合、キーは常に文字列オブジェクトであり、値は上記のいずれかであってもよい
 
キー値ペアを使用すると、少なくとも2つのオブジェクトが作成されます.1つのキーオブジェクト1つの値オブジェクト
たとえば、SET msg「hello redis」キーオブジェクト:msg文字列オブジェクト値オブジェクト:hello redis文字列オブジェクト
 
オブジェクトのptrポインタは、オブジェクトの最下位のデータ構造を指します.このデータ構造はオブジェクトのencodingプロパティによって決定されます
Encodingプロパティは、次の定数のいずれかです.
REDIS_ENCODING_INT         long     
REDIS_ENCODING_EMBSTR      embstr          
REDIS_ENCODING_RAW                
REDIS_ENCODING_HT            
REDIS_ENCODING_LINKEDLIST      
REDIS_ENCODING_ZIPLIST         
REDIS_ENCODING_INTSET          
REDIS_ENCODING_SKIPLIST              

各タイプの変数には、少なくとも2つの異なる符号化が使用されます.
1 5つのオブジェクトの最下位コード:
文字列タイプオブジェクト:REDIS_ENCODING_INT   REDIS_ENCODING_EMBSTR  REDIS_ENCODING_RAW
リストタイプのオブジェクト:REDIS_ENCODING_ZIPLIST     REDIS_ENCODING_LINKEDLIST
ハッシュオブジェクト:REDIS_ENCODING_ZIPLIST    REDIS_ENCODING_HT
コレクションオブジェクト:REDIS_ENCODING_INTSET     REDIS_ENCODING_HT
整列集合オブジェクト:REDIS_ENCODING_ZIPLIST       REDIS_ENCODING_SKIPLIST
2符号化変換条件
A:整数値を保存し、64ビット長整数で表すとencodingをintに設定し、ptrのタイプをvoid*からlongに変更します.
B:文字列が保存され、文字列の長さが39バイト以上の場合はencodingをrawに設定し、通常のSDSでこのオブジェクトを保存します.
C:1つの文字列が保存され、文字列の長さが39バイト未満の場合はencodingをembstrに設定し、emb SDSを使用してオブジェクトを保存します.
EmbはredisObjectとsdshdrを一度に作成し、メモリは連続しています.
メリット:
aメモリ割り当て回数を2回から1回に削減
bメモリの解放回数を2回から1回に削減
c連続メモリスペースアクセス効率の向上
intで64ビットが処理可能である場合、endcodingをintとして記憶する
strになり、39バイト未満のバイトになった場合、embstrを用いて記憶する
このオブジェクトは、embstrに対して39バイト以上の文字列を成長させる場合に、通常のSDSを使用して格納されます.
API:
SET
GET
APPEND
INCRBYFLOAT
INCRBY
DECRBY
STRLEN
SETRANGE
GETRANGE
 
3命令の符号化上の作用原理
2から推測するうち浮動小数点数はSDSで記憶する