返回

Redis底层数据结构与对象(二)

后端

intset(整数集合)

intset是Redis中一种专门用于存储整数的集合数据结构。intset结构体定义如下:

typedef struct intset {
    uint32_t encoding;
    uint32_t length;
    int8_t contents[];
} intset;

虽然intset结构将contents属性声明为int8_t类型的数组,但实际上contents数组并不保存任何int8_t类型的值。contents数组的真正类型取决于encoding属性的值。

  • INTSET_ENC_INT16 :contents数组保存的是int16_t类型的值。这种编码方式适用于存储不大于2^16-1的整数。
  • INTSET_ENC_INT32 :contents数组保存的是int32_t类型的值。这种编码方式适用于存储不大于2^32-1的整数。
  • INTSET_ENC_INT64 :contents数组保存的是int64_t类型的值。这种编码方式适用于存储大于2^32-1的整数。

intset结构中还定义了一个encoding属性,该属性的值表示contents数组的编码方式。

intset结构中还定义了一个length属性,该属性的值表示intset中存储的整数数量。

intset是一种非常高效的整数集合数据结构。它可以在O(log n)的时间复杂度内完成插入、删除和查找操作。

SDS(简单动态字符串)

SDS是Redis中一种专门用于存储字符串的动态字符串数据结构。SDS结构体定义如下:

typedef struct sdshdr {
    int len;
    int free;
    char buf[];
} sdshdr;

SDS结构体中定义了一个len属性,该属性的值表示SDS中存储的字符串长度。

SDS结构体中定义了一个free属性,该属性的值表示SDS中剩余的可用空间大小。

SDS结构体中定义了一个buf属性,该属性的值是指向SDS中字符串内容的指针。

SDS是一种非常高效的动态字符串数据结构。它可以在O(1)的时间复杂度内完成字符串追加操作。

ziplist

ziplist是Redis中一种专门用于存储链表数据的压缩列表数据结构。ziplist结构体定义如下:

typedef struct ziplist {
    unsigned char prevlen;
    unsigned char len;
    unsigned char header;
    unsigned char tail;
    void *p;
} ziplist;

ziplist结构体中定义了一个prevlen属性,该属性的值表示前一个节点的长度。

ziplist结构体中定义了一个len属性,该属性的值表示当前节点的长度。

ziplist结构体中定义了一个header属性,该属性的值表示ziplist的头部标志。

ziplist结构体中定义了一个tail属性,该属性的值表示ziplist的尾部标志。

ziplist结构体中定义了一个p属性,该属性的值是指向ziplist中数据的指针。

ziplist是一种非常高效的链表数据结构。它可以在O(1)的时间复杂度内完成链表节点的插入和删除操作。

quicklist

quicklist是Redis中一种专门用于存储链表数据的快速列表数据结构。quicklist结构体定义如下:

typedef struct quicklist {
    unsigned long count;
    unsigned long head;
    unsigned long tail;
    struct quicklistNode *first;
    struct quicklistNode *last;
} quicklist;

quicklist结构体中定义了一个count属性,该属性的值表示quicklist中存储的节点数量。

quicklist结构体中定义了一个head属性,该属性的值表示quicklist的头部节点的索引。

quicklist结构体中定义了一个tail属性,该属性的值表示quicklist的尾部节点的索引。

quicklist结构体中定义了一个first属性,该属性的值是指向quicklist的第一个节点的指针。

quicklist结构体中定义了一个last属性,该属性的值是指向quicklist的最后一个节点的指针。

quicklist是一种非常高效的链表数据结构。它可以在O(1)的时间复杂度内完成链表节点的插入和删除操作。

hashtable(哈希表)

hashtable是Redis中一种专门用于存储键值对数据的哈希表数据结构。hashtable结构体定义如下:

typedef struct hashtable {
    dictType *type;
    unsigned long size;
    unsigned long used;
    dictEntry **table;
} hashtable;

hashtable结构体中定义了一个type属性,该属性的值是指向hashtable的类型信息的指针。

hashtable结构体中定义了一个size属性,该属性的值表示hashtable的大小。

hashtable结构体中定义了一个used属性,该属性的值表示hashtable中已使用的节点数量。

hashtable结构体中定义了一个table属性,该属性的值是指向hashtable的table数组的指针。

hashtable是一种非常高效的哈希表数据结构。它可以在O(1)的时间复杂度内完成键值对数据的插入、删除和查找操作。

skiplist(跳跃表)

skiplist是Redis中一种专门用于存储有序集合数据的跳跃表数据结构。skiplist结构体定义如下:

typedef struct skiplist {
    unsigned long length;
    unsigned long level;
    struct skiplistNode *header, *tail;
} skiplist;

skiplist结构体中定义了一个length属性,该属性的值表示skiplist中存储的节点数量。

skiplist结构体中定义了一个level属性,该属性的值表示skiplist的层数。

skiplist结构体中定义了一个header属性,该属性的值是指向skiplist的头部节点的指针。

skiplist结构体中定义了一个tail属性,该属性的值是指向skiplist的尾部节点的指针。

skiplist是一种非常高效的有序集合数据结构。它可以在O(log n)的时间复杂度内完成有序集合数据的插入、删除和查找操作。

zset(有序集合)

zset是Redis中一种专门用于存储有序集合数据的有序集合数据结构。zset结构体定义如下:

typedef struct zset {
    dict *dict;
    zskiplist *zsl;
} zset;

zset结构体中定义了一个dict属性,该属性的值是指向zset的字典对象的指针。

zset结构体中定义了一个zsl属性,该属性的值是指向zset的skiplist对象的指针。

zset是一种非常高效的有序集合数据结构。它可以在O(log n)的时间复杂度内完成有序集合数据的插入、删除和查找操作。

hyperloglog

hyperloglog是Redis中一种专门用于估计集合基数的基数估计器数据结构。hyperloglog结构体定义如下:

typedef struct hyperloglog {
    unsigned long long count;
    uint8_t registers[16];
} hyperloglog;

hyperloglog结构体中定义了一个count属性,该属性的值表示hyperloglog估计的集合基数。

hyperloglog结构体中定义了一个registers属性,该属性的值是一个长度为16的数组,用于存储hyperloglog的寄存器值。

hyperloglog是一种非常高效的基数估计器数据结构。它可以在O(1)的时间复杂度内完成集合基数的估计操作。

geospatial(地理空间)

geospatial是Redis中一种专门用于存储地理空间数据的地理空间数据结构。geospatial结构体定义如下:

typedef struct geospatial {
    double longitude;
    double latitude;
    uint32_t flags;
    union {
        long long integer;
        double distance;
    } distance;
} geospatial;

geospatial结构体中定义了一个longitude属性,该属性的值表示地理空间数据的经度。

geospatial结构体中定义了一个latitude属性,该属性的值表示地理空间数据的纬度。

geospatial结构体中定义了一个flags属性,该属性的值表示地理空间数据的标志。

geospatial结构体中定义了一个distance属性,该属性的值表示地理空间数据的距离。

geospatial是一种非常高效的地理空间数据结构。它可以在O(1)的时间复杂度内完成地理空间数据的插入、删除和查找操作。

stream(流)

stream是Redis中一种专门用于存储流数据的流数据结构。stream结构体定义如下:

typedef struct stream {
    unsigned long long length;
    unsigned long long radix_tree_keys;
    unsigned long long radix_tree_nodes;
    ziplist *entries;
} stream;

stream结构体中定义了一个length属性,该属性的值表示stream中存储的条目数量。

stream结构