redis五种数据类型底层结构

原创
ithorizon 3个月前 (10-03) 阅读数 124 #Redis

Redis五种数据类型底层结构

Redis五种数据类型底层结构

Redis是一个开源的、高性能的键值数据库。它提供了五种数据结构,分别是字符串(String)、列表(List)、集合(Set)、有序集合(Sorted Set)和哈希(Hash)。下面将详细介绍这五种数据类型的底层结构。

1. 字符串(String)

字符串是Redis最基础的数据类型,它可以是单纯的字符串、整数或者浮点数。在Redis中,字符串的底层结构是单纯动态字符串(Simple Dynamic String,简称SDS)。

struct SDS {

int len; // 字符串长度

int free; // 未使用的空间长度

char buf[]; // 字符数组,保存字符串内容

};

2. 列表(List)

列表是一种按照插入顺序排序的字符串元素集合。列表的底层结构是双向链表(LinkedList)。

typedef struct listNode {

struct listNode *prev; // 前一个节点

struct listNode *next; // 后一个节点

void *value; // 节点值

} listNode;

typedef struct list {

listNode *head; // 头节点

listNode *tail; // 尾节点

unsigned long len; // 列表长度

} list;

3. 集合(Set)

集合是无序的、不重复的字符串元素集合。集合的底层结构是哈希表(HashTable)。

typedef struct dict {

dictType *type; // 操作函数表

void *privdata; // 私有数据

dictht ht[2]; // 两个哈希表,用于渐进式rehash

long rehashidx; // rehash进度

unsigned long 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;

double d;

} v; // 值

struct dictEntry *next; // 下一个节点

} dictEntry;

4. 有序集合(Sorted Set)

有序集合是集合和列表的结合体,元素具有唯一性,但每个元素都会相关性一个分数(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;

5. 哈希(Hash)

哈希是一个键值对的集合。哈希的底层结构是哈希表(HashTable)。

// 哈希表结构体和字典结构体与集合的相同


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: Redis


热门