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; // 节点元素内容,sds
double score; // 分值: 从小到大排序
struct zskiplistNode *backward; // 后退指针(前驱节点)
struct zskiplistLevel {
struct zskiplistNode *forward; // 前向指针(后继节点)或者说将next移至到level中
unsigned long span; // 跨度, 即节点距离 ≥1
} level[]; // 层数组: 数量越多访问越快 // tips 柔性数组
} zskiplistNode;
// 跳表 zskiplist
// 链表节点(头节点、尾节点)
// 长度length
// 高度level
typedef 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