Redis底层数据结构与对象(二)
2024-02-25 03:04:06
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结构