Redis源码剖析之快速列表(quicklist)( 三 )

删除相对于插入而言简单多了 , 我先看的插入逻辑 , 插入中有节点的分裂 , 但删除里却没有节点的合并 , quicklist有节点最大容量 , 但没有最小容量限制 。
其他API理解了quicklist数据结构的设计 , 也基本就能猜测到每个api的具体实现了 , 这里我就不再罗列代码了 , 有兴趣可以自行查阅 。
【Redis源码剖析之快速列表(quicklist)】quicklist *quicklistCreate(void);// 创建quicklist quicklist *quicklistNew(int fill, int compress);// 用一些指定参数创建一个新的quicklistvoid quicklistSetCompressDepth(quicklist *quicklist, int depth);// 设置压缩深度 void quicklistSetFill(quicklist *quicklist, int fill); // 设置容量上限 void quicklistSetOptions(quicklist *quicklist, int fill, int depth); void quicklistRelease(quicklist *quicklist); // 释放quicklistint quicklistPushHead(quicklist *quicklist, void *value, const size_t sz);// 头部插入int quicklistPushTail(quicklist *quicklist, void *value, const size_t sz);// 尾部插入void quicklistPush(quicklist *quicklist, void *value, const size_t sz,int where); // 指定头部或者尾部插入void quicklistAppendZiplist(quicklist *quicklist, unsigned char *zl); // 把一个ziplist放到quicklist中quicklist *quicklistAppendValuesFromZiplist(quicklist *quicklist,unsigned char *zl); // 把ziplist中的所有数据放到quicklist中quicklist *quicklistCreateFromZiplist(int fill, int compress,unsigned char *zl);// 从ziplist生成一个quicklistvoid quicklistInsertAfter(quicklist *quicklist, quicklistEntry *node,void *value, const size_t sz);void quicklistInsertBefore(quicklist *quicklist, quicklistEntry *node,void *value, const size_t sz);void quicklistDelEntry(quicklistIter *iter, quicklistEntry *entry); // 数据删除 int quicklistReplaceAtIndex(quicklist *quicklist, long index, void *data,int sz);// 数据替换 int quicklistDelRange(quicklist *quicklist, const long start, const long stop);// 范围删除quicklistIter *quicklistGetIterator(const quicklist *quicklist, int direction);// 迭代器 quicklistIter *quicklistGetIteratorAtIdx(const quicklist *quicklist,int direction, const long long idx);// 从指定位置开始的迭代器int quicklistNext(quicklistIter *iter, quicklistEntry *node);// 迭代器下一个位置void quicklistReleaseIterator(quicklistIter *iter);// 释放迭代器quicklist *quicklistDup(quicklist *orig);// 去重int quicklistIndex(const quicklist *quicklist, const long long index,quicklistEntry *entry);// 找到entry的下标索引 void quicklistRewind(quicklist *quicklist, quicklistIter *li);void quicklistRewindTail(quicklist *quicklist, quicklistIter *li);void quicklistRotate(quicklist *quicklist);// 选择quicklistint quicklistPopCustom(quicklist *quicklist, int where, unsigned char **data,unsigned int *sz, long long *sval,void *(*saver)(unsigned char *data, unsigned int sz)); int quicklistPop(quicklist *quicklist, int where, unsigned char **data,unsigned int *sz, long long *slong); // 数据pop unsigned long quicklistCount(const quicklist *ql);int quicklistCompare(unsigned char *p1, unsigned char *p2, int p2_len); // 比较大小size_t quicklistGetLzf(const quicklistNode *node, void **data);// LZF节点参考资料

  • men_wen Redis源码剖析和注释(七)--- 快速列表(quicklist)
  • 张铁蕾 Redis内部数据结构详解(5)——quicklist
本文是Redis源码剖析系列博文 , 同时也有与之对应的Redis中文注释版 , 有想深入学习Redis的同学 , 欢迎star和关注 。Redis中文注解版仓库:Redis源码剖析专栏:如果觉得本文对你有用 , 欢迎一键三连 。 本文来自