Redis设计与实现数据结构篇 跳跃表 整数集合 压缩列表
Redis设计与实现数据结构篇 跳跃表 整数集合 压缩列表
跳跃表
跳跃表支持平均 O(log n) ,最坏 O(n) 的查找效率。Redis只在两个地方使用了跳跃表,一个是有序集合SortedSet,另一个是在集群节点中用作内部数据结构。
跳跃表实现
typedef struct zskiplistNode{ //跳跃表节点 struct zskiplistLevel{ //层 struct zskiplistNode *forward; //前进指针 unsigned int span; //跨度 }level[]; struct zskiplistNode *backward; //后退指针 double score; //分值 obj *obj; }zskiplistNode;
typedef struct zskiplist{ struct zskiplistNode *header,*tail; unsigned long length; int level; }
跳跃表是有序集合的底层实现之一。(跳跃表、字典)
整数集合
整数集合实现
typedef struct intset{ uint32_t encoding; uint32_t length; unint8_t content[]; }intset;
- content内数字有序,编码以encoding方式为准。
- 若content内加入一个超过当前编码方式的数字,content类型升级。
- 类型升级过程:
- 先确认升级后content占用的位数,例如3个uint32_t占位96位。首先对空间进行扩容。
- 依次分配原空间中的元素位置及占用空间大小。
- 修改encoding类型
- 升级规则的优势:
- 灵活性
C语言是静态类型语言,为了避免类型错误,通常不将类型不同的值加入同一数据结构。升级的设计没有打破这一原则,同时使不同类型的值可以一同加入数组。 - 节约内存
如是为了避免类型错误,将uint_16,uint_32等类型不同的值加入同一数据结构,可以统一采用uint_64编码。与之相比,升级策略有效的节约了内存。
- 灵活性
- 整数集合一旦升级,就不能降级噢。
压缩列表
压缩列表的实现
压缩列表是哈希键和列表键的底层实现之一。
未完待续