这个数据结构分析的比较粗糙,因为实际使用的是redis2.8没有用这个结构.时间不够用了,先把代码粘过来
Redis3.2版本新增数据结构
代替原有的list的功能
本质是一个双向链表,
链表的节点是ziplist,
而不是具体的值
同时增加了压缩选项
可已将ziplist数据进行压缩
压缩算法为lzf算法
与原始链表对比
- 原始链表定位特定元素时耗时较大
- 原始链表元素分散,容易产生较多内存碎片
基本操作原理
向ql插入数据时
先获得头/尾的zl
当zl数量没有超过指定的zl元素数上限时
直接在zl中插入数据,
否则新建节点和空的zl,
然后再插入数据
相关文件
相关概念
- likely/unlikely 分支预测
简单说就是从内存取指令很慢,cpu要等待这个过程
如果能提前预测可能执行的指令,就提前从内存把指令读到cache
由于cache的访问速度较内存快.cpu要执行时就不用等很长时间了
如果开发人员可以告诉编译器,
哪个分支更有可能发生(likely)或者非常不可能发生(unlikely),
可以帮助编译器进行代码编译 - 数据的一般长度
和系统位数,编译器有关,这里只是一般的情况(x64)
类型 | 位数
-|
int | 4
long | 8
char* | 8 - 数据对齐 中
1
2
3
4
5struct a {
int a:8;
int b:8;
int c:16;
};sizeof(struct a)
的长度实际就是一个sizeof(int)
的长度
其中a.a
的范围是-128127,2^15-1a.c
的范围是-2^15
数据结构
1 | /* Node, quicklist, and Iterator are the only data structures used currently. */ |
主要宏
1 |
|
函数分析
quicklist *quicklistCreate(void);
功能
创建一个空的quicklist
源码
1 | /* Create a new quicklist. |
REDIS_STATIC quicklistNode *quicklistCreateNode(void);
功能
创建一个空的quicklist节点
源码
1 | REDIS_STATIC quicklistNode *quicklistCreateNode(void) { |
void quicklistRelease(quicklist *quicklist);
功能
释放完整的quicklist
源码
1 | /* Free entire quicklist. */ |
REDIS_STATIC void __quicklistInsertNode(quicklist *quicklist, quicklistNode *old_node, quicklistNode *new_node, int after);
功能
quick在指定节点的前/后插入新的节点
源码
1 | /* Insert 'new_node' after 'old_node' if 'after' is 1. |
REDIS_STATIC int _quicklistNodeAllowInsert(const quicklistNode *node, const int fill, const size_t sz);
功能
节点中的ziplist是否还可以插入数据
源码
1 |
|
int quicklistPushHead(quicklist *quicklist, void *value, size_t sz);
功能
在前面插入新的数据
源码
1 | /* Add new entry to head node of quicklist. |
int quicklistPushTail(quicklist *quicklist, void *value, size_t sz);
功能
在结尾插入新的数据
源码
1 | /* Add new entry to tail node of quicklist. |
REDIS_STATIC void __quicklistDelNode(quicklist *quicklist, quicklistNode *node);
功能
删除节点
源码
1 | REDIS_STATIC void __quicklistDelNode(quicklist *quicklist, |
REDIS_STATIC int quicklistDelIndex(quicklist *quicklist, quicklistNode *node, unsigned char **p);
功能
删除指定节点的元素
源码
1 | /* Delete one entry from list given the node for the entry and a pointer |
void quicklistDelEntry(quicklistIter *iter, quicklistEntry *entry);
功能
删除指定entry
源码
1 | /* Delete one element represented by 'entry' |
REDIS_STATIC void _quicklistInsert(quicklist *quicklist, quicklistEntry *entry, void *value, const size_t sz, int after);
功能
插入一个新数据
源码
1 | /* Insert a new entry before or after existing entry 'entry'. |
quicklistIter *quicklistGetIterator(const quicklist *quicklist, int direction);
功能
获取迭代器
源码
1 | /* Returns a quicklist iterator 'iter'. After the initialization every |
quicklistIter *quicklistGetIteratorAtIdx(const quicklist *quicklist, const int direction, const long long idx);
功能
获取指定位置的迭代器
源码
1 | /* Initialize an iterator at a specific offset 'idx' and make the iterator |
int quicklistNext(quicklistIter *iter, quicklistEntry *entry);
功能
迭代元素
源码
1 | /* Get next element in iterator. |
quicklist *quicklistDup(quicklist *orig);
功能
复制
源码
1 | /* Duplicate the quicklist. |
int quicklistPopCustom(quicklist *quicklist, int where, unsigned char **data, unsigned int *sz, long long *sval, void *(*saver)(unsigned char *data, unsigned int sz));
功能
取出一个元素并从quicklist中去除
源码
1 | /* pop from quicklist and return result in 'data' ptr. Value of 'data' |
int quicklistPop(quicklist *quicklist, int where, unsigned char **data, unsigned int *sz, long long *slong);
功能
pop功能
源码
1 | /* Default pop function |