Redis开发与运维 读书小记
- Redis数据结构对应的底层数据结构
1.1. 字符串. 字符串底层结构有三种,int (用于表示整数),embstr(用于不大于39byte的字符串),raw(大于39byte的字符串)
1.2. 列表. 列表的底层结构有两种,ziplist和linkedlist。linkedlist就是双向链表,ziplist是压缩链表,是连续的,去掉了 前后指针,使得空间得到了压缩。当列表的元素比较少时(阈值可以在配置文件里配)底层是用ziplist,当元素超过了这个阈值则变成 linkedlist。
1.3 集合. 集合的底层结构有两种,intset和hashtable。当集合的元素都是整数且元素个数比较小时,intset是集合的底层实现。其余情况 hashtable是底层实现。
1.4 有序集合. 有序集合的底层实现由两种,ziplist和skiplist。同样当zset里的元素数量比较小时,有序集合的内部实现是ziplist。 元素数量比较多时skiplist是底层实现,跳表是一种很特别的数据结构
命令object encoding +keyName 可以查看Redis对象的底层实现。
链表和链表节点的定义:
typedef struct listNode {
struct listNode *prev;
struct listNode *next;
} listNode;
typdef struct list {
listNode *head;
listNode *tail;
unsigned long len;
} list;
哈希表节点和哈希表定义:
typedef struct dictEntry {
void *key;
union {
void *val;s
unit64_t u64;
int64_t s64;
} v;
struct dictEntry *next
} dictEntry;
typedef struct dictht {
dictEntry **table;
unsigned long size;
unsigned long used;
} dictht;
整数集合的定义:
typedef struct intset {
uint32_t encoding;
uint32_t length;
int8_t contents[];
} intset;
zset是跳表+哈希表
typedef struct zset {
dict *dict;
zkiplist *zsl;
} zset;
Written on January 4, 2019