Redis开发与运维 读书小记

  1. 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