server.h|t_zset.c
数据结构定义
// tips 跳跃表的核心思想: 用空间换时间,如:level[]、zskiplist.length\zskiplist.header等O(1)// 跳表节点/* ZSETs use a specialized version of Skiplists */typedef struct zskiplistNode {sds ele; // 节点元素内容,sdsdouble score; // 分值: 从小到大排序struct zskiplistNode *backward; // 后退指针(前驱节点)struct zskiplistLevel {struct zskiplistNode *forward; // 前向指针(后继节点)或者说将next移至到level中unsigned long span; // 跨度, 即节点距离 ≥1} level[]; // 层数组: 数量越多访问越快 // tips 柔性数组} zskiplistNode;// 跳表 zskiplist// 链表节点(头节点、尾节点)// 长度length// 高度leveltypedef struct zskiplist {struct zskiplistNode *header, *tail; // 头、尾节点 头节点相当于航标unsigned long length; // 除头节点外的节点数int level; // 除头节点外的最大层数} zskiplist;
API
zskiplist *zslCreate(void);void zslFree(zskiplist *zsl);zskiplistNode *zslInsert(zskiplist *zsl, double score, sds ele);unsigned char *zzlInsert(unsigned char *zl, sds ele, double score);int zslDelete(zskiplist *zsl, double score, sds ele, zskiplistNode **node);zskiplistNode *zslFirstInRange(zskiplist *zsl, zrangespec *range);zskiplistNode *zslLastInRange(zskiplist *zsl, zrangespec *range);
内部函数
zskiplistNode *zslCreateNode(int level, double score, sds ele);void zslFreeNode(zskiplistNode *node);void zslDeleteNode(zskiplist *zsl, zskiplistNode *x, zskiplistNode **update);// 获取随机层数int zslRandomLevel(void) {int level = 1;while ((random()&0xFFFF) < (ZSKIPLIST_P * 0xFFFF))level += 1;return (level<ZSKIPLIST_MAXLEVEL) ? level : ZSKIPLIST_MAXLEVEL;}
说明
数据结构中
创建:分配内存(在结构体中注意柔性数组内存分配)以及初始化变量(及成员变量)
销毁:释放内存(或归还内存到内存池等),嵌套其他数据结构时也需释放、组合其他数据结构(如链表节点)时遍历释放,释放后指针指向NULL
