Redis設計と実装(第6章)--整数集合(intset)


Redis設計と実装(第6章)--整数集合(intset)

概要


1.intsetの概要
2.intset実装
3.intsetアップグレード

intsetの概要


整数集合はRedis集合キーの最下位実装の1つであり、値がすべて整数の場合、redisは整数集合を最下位実装として選択します.
int 16_を保存できますt,int32_t,int64_tタイプの整数値であり、コレクションに重複要素は表示されません.

intset実装


まずintsetのデータ構造を見てみましょう.
typedef struct intset {
    uint32_t encoding;  //encoding  
    uint32_t length;  //  
    int8_t contents[]; //    
} intset;

contents[]はint 8_を宣言したがtタイプの配列ですが、実際にはcontents[]はint 8_を保存しません.tタイプのデータ、本当のデータ型はencodingのタイプに依存します.
Encodingタイプには、次の3つがあります.
#define INTSET_ENC_INT16 (sizeof(int16_t))#define INTSET_ENC_INT32 (sizeof(int32_t))#define INTSET_ENC_INT64 (sizeof(int64_t))

intsetアップグレード


encodingタイプがint_の場合16ですが、この場合は新しい要素を保存する必要がありますが、要素はint 16_を通過できません.tは、アップグレード操作に関連する必要があることを示します.
アップグレード後、すべての要素は対応するアップグレード後のタイプにアップグレードされ、setには複数のタイプが存在せず、アップグレード後にダウングレードできません.
アップグレードの手順は次のとおりです.
1.アップグレードに必要なスペースを判断し、スペースの大きさを割り当てる.
2.すべての要素を新しい要素と同じタイプにアップグレードし、変換タイプの要素を正しい位置に追加します.
3.最下層配列に新しい要素を追加する.
アップグレードのメリットは何ですか?
1.柔軟性の向上
Cは静的タイプであるため、エラーを回避するために、通常は2つの異なるタイプを同じデータ構造に保存しません.しかし、アップグレードはint 16の保存をサポートします.t,int32_t,int64_tのデータ;
2.省スペース
保存したデータがint 16_しかない場合t,じゃあint 64を割り当てるtの空間は空間の浪費をもたらすので、最初の値はint 16_を割り当てます.tのスペース、int 32_を追加する必要がある場合t,int64_tのデータをアップグレードします.
 
posted on
2017-09-27 17:12 qiezijiajia読書(
...) コメント(
...) コレクションの編集
転載先:https://www.cnblogs.com/dpains/p/7602805.html