redis数据类型的数据结构
原创
Redis数据类型的数据结构
Redis是一种开源的、基于内存的键值存储数据库,它提供了多种数据结构来适应不同的场景。以下是Redis中常见的数据类型及其数据结构介绍。
1. 字符串(String)
字符串是Redis中最基本的数据类型,用于存储单纯的字符串、整数或浮点数。它的数据结构如下:
struct sdshdr {
int len; // 字符串长度
int free; // 未使用的空间
char buf[]; // 字符数组
};
2. 列表(List)
列表是按照插入顺序排序的字符串元素集合。它的数据结构是一个双向链表,如下:
typedef struct listNode {
struct listNode *prev; // 前一个节点
struct listNode *next; // 后一个节点
void *value; // 节点值
} listNode;
typedef struct list {
listNode *head; // 头节点
listNode *tail; // 尾节点
void *(*dup)(void *ptr); // 节点值复制函数
void (*free)(void *ptr); // 节点值释放函数
int (*match)(void *ptr, void *key); // 节点值比较函数
unsigned long len; // 列表长度
} list;
3. 集合(Set)
集合是无序的、不重复的字符串元素集合。它的数据结构是一个哈希表,如下:
typedef struct intset {
uint32_t encoding; // 编码行为
uint32_t length; // 集合长度
int64_t contents[]; // 集合元素数组
} intset;
4. 哈希(Hash)
哈希是一个键值对集合,它提供了字段和相关性的值。它的数据结构是另一个哈希表,如下:
typedef struct dict {
dictType *type; // 类型特定函数
void *privdata; // 私有数据
dictht ht[2]; // 两个哈希表
long rehashidx; // rehash索引
int iterators; // 当前迭代器数量
} dict;
typedef struct dictht {
dictEntry **table; // 哈希表数组
unsigned long size; // 哈希表大小
unsigned long sizemask; // 大小掩码,用于计算索引
unsigned long used; // 已使用节点数量
} dictht;
typedef struct dictEntry {
void *key; // 键
union {
void *val; // 值
uint64_t u64;
int64_t s64;
} v;
struct dictEntry *next; // 链接下一个节点
} dictEntry;
5. 有序集合(ZSet)
有序集合是集合的一种扩展,每个元素都会相关性一个分数(score),用于排序。它的数据结构是一个跳表(SkipList)和哈希表,如下:
typedef struct zskiplistNode {
sds ele; // 元素
double score; // 分数
struct zskiplistNode *backward; // 后退指针
struct zskiplistLevel {
struct zskiplistNode *forward; // 前进指针
unsigned long span; // 跨度
} level[]; // 层级数组
} zskiplistNode;
typedef struct zskiplist {
struct zskiplistNode *header, *tail; // 头尾节点
unsigned long length; // 长度
int level; // 最大层级
} zskiplist;
typedef struct zset {
dict *dict; // 哈希表
zskiplist *zsl; // 跳表
} zset;
以上是Redis中常见数据类型的数据结构介绍,这些数据结构促使