【Redis技术进阶之路】「底层源码解析」揭秘高效存储模型与数据结构底层实现(链表)
在Redis中,高效的数据存储模型和底层数据结构是Redis能够实现高性能的关键。Redis使用了一系列复杂的数据结构来存储键值对,并根据使用场景的不同选择不同的数据结构。
以下是Redis中一些常见的底层数据结构及其源码实现:
- 字典(dict):用于保存键值对的哈希表,是Redis中最基础的数据结构。
// 字典结构体定义
typedef struct dict {
// 字典类型特定函数
dictType *type;
// 私有数据
void *privdata;
// 哈希表
dictht ht[2];
// 重新哈希的标志
int rehashidx; /* rehashing not in progress if rehashidx == -1 */
} dict;
- 哈希表(dictht):是字典的一个组成部分,用来存储键值对的数组。
// 哈希表结构体定义
typedef struct dictht {
// 哈希表数组
dictEntry **table;
// 数组大小
unsigned long size;
// 哈希表大小掩码,用于计算索引值
unsigned long sizemask;
// 已有节点的数量
unsigned long used;
} dictht;
- 哈希节点(dictEntry):是哈希表中的一个节点,存放键值对。
// 哈希节点结构体定义
typedef struct dictEntry {
// 键
void *key;
// 值
union {
void *val;
uint64_t u64;
int64_t s64;
} v;
// 指向下一个节点的指针,形成链表
struct dictEntry *next;
} dictEntry;
- 跳跃列表(skiplist):用于有序集合数据类型。
// 跳跃列表节点结构体定义
typedef struct skiplistNode {
// 成员对象
robj *obj;
// 后退指针
struct skiplistNode *backward;
// 层
struct skiplistLevel {
// 前进指针
struct skiplistNode *forward;
// 跳跃的距离
unsigned int span;
} level[];
} skiplistNode;
// 跳跃列表结构体定义
typedef struct skiplist {
// 表头节点和表尾节点
struct skiplistNode *header, *tail;
// 表中节点的数量
unsigned long length;
// 表中层数最大的节点的层数
int level;
} skiplist;
- 跳跃列表(linkedlist):用于列表数据类型。
// 链表节点结构体定义
typedef struct listNode {
// 前置节点
struct listNode *prev;
// 后置节点
struct listNode *next;
// 值
void *value;
} listNode;
// 链表结构体定义
typedef struct list {
// 表头节点和表尾节点
listNode *head, *tail;
// 节点数量
unsigned long len;
// 函数
void (*free)(void *ptr);
// 复制函数
void (*match)(void *ptr, void *key);
} list;
- 整数集合(intset):用于集合数据类型,当集合只包含整数时使用。
// 整数集合结构体定义
评论已关闭