redis intset
ddatsh
set 集合全为 int ,且数量不多(< set-max-intset-entries)时,底层用 intset 结构,否则用 dict
随数据的添加而改变它的数据编码(只升不降)
typedef struct intset {
uint32_t encoding; // 保存元素所使用的类型的长度
uint32_t length; // 元素个数
int8_t contents[]; // 柔性数组,这部分内存不包含在 intset 结构当中,元素不重复;元素在数组中由小到大排列;
} intset;
#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))
intset 与 ziplist相比:
- ziplist 可存任意二进制串,intset 只能存整数
- ziplist 无序,intset 从小到大有序。ziplist 上查找只能遍历,intset 可进行二分查找,性能更高
- ziplist 可对每个数据项进行不同的变长编码(每个数据项前面都有数据长度字段
len
),intset 只能整体使用一个统一的编码(encoding
)