redis原理之底层数据结构(三)-quicklist

1.绪论

前面讲过的ziplist在查找元素的时候是o(n)的复杂度,如果ziplist长度太长,会导致查找元素很缓慢,而ziplist是拥有内存连续的优势,为了保留ziplist内存连续的优势,但是又不能保留太长的长度,我们出现了quicklist,quicklist其实就是将多个ziplist通过指针链接成一个双端链表。

2.组成

cpp 复制代码
typedef struct quicklist {
    //quciklist的头指针
    quicklistNode *head;
    //quicklist的尾指针
    quicklistNode *tail;
    //quicklist的entry个数,由于quicklist是由多个ziplist组成,这里包含的是quicklist下面所有的ziplist所有的entry个数
    unsigned long count;        /* total count of all entries in all ziplists */
    //quicklist中节点的个数
    unsigned long len;          /* number of quicklistNodes */
    //表示quicklist中每个ziplist节点的大小,默认为16个entry节点
    int fill : QL_FILL_BITS;              /* fill factor for individual nodes */
    //表示压缩深度,比如为1,只压缩首尾两个节点
    unsigned int compress : QL_COMP_BITS; /* depth of end nodes not to compress;0=off */
    unsigned int bookmark_count: QL_BM_BITS;
    quicklistBookmark bookmarks[];
} quicklist;

可以看出,quickList是由多个ziplist组成的一个双向链表,其中有两个属性需要注意,分别是fill和compress。
fill: 表示每个ziplist最多包含的entry数量或者大小。可以通过list-max-ziplist-entries 进行设置**。**如果为正,表示最多包含多少个entry,如果为负的话,表示含义如下:

|----|--------|
| -1 | 最多4kb |
| -2 | 最多8kb |
| -3 | 最多16kb |
| -4 | 最多32kb |
| -5 | 最多64kb |

compress: 表示是压缩数量,如果为-1表示只压缩首尾两个节点,默认也是如此**。**

cpp 复制代码
typedef struct quicklistNode {
    //上一个节点指针
    struct quicklistNode *prev;
    //下一个节点指针
    struct quicklistNode *next;
    //ziplist,真正存储数据的地方
    unsigned char *zl;
    //ziplist的大小
    unsigned int sz;             /* ziplist size in bytes */
    //ziplist的字节数量
    unsigned int count : 16;     /* count of items in ziplist */
    //是否开启了压缩
    unsigned int encoding : 2;   /* RAW==1 or LZF==2 */
    unsigned int container : 2;  /* NONE==1 or ZIPLIST==2 */
    //该节点是否已经被压缩过
    unsigned int recompress : 1; /* was this node previous compressed? */
    unsigned int attempted_compress : 1; /* node can't compress; too small */
    //保留字段
    unsigned int extra : 10; /* more bits to steal for future usage */
} quicklistNode;

所以双端链表的组成如下

相关推荐
专注VB编程开发20年1 分钟前
2000条25列数据导出到Sqlite只用40毫秒,ACCESS用时800-1300毫秒
数据库·sqlite·access
2301_814809864 分钟前
HTML函数能否用外接显卡坞提升性能_eGPU对HTML函数帮助【汇总】
jvm·数据库·python
DaqunChen4 分钟前
如何优化SQL注入检测性能_通过预编译缓存提升效率
jvm·数据库·python
Greyson18 分钟前
如何通过Vagrant快速建库_自动化虚拟机Oracle部署方案
jvm·数据库·python
Wyz2012102413 分钟前
HTML函数运行时触控屏失灵是硬件故障吗_输入层兼容性测试【详解】
jvm·数据库·python
Greyson120 分钟前
TensorFlow中如何冻结模型层_设置layer.trainable等于False实现微调
jvm·数据库·python
老纪的技术唠嗑局20 分钟前
4.15 bubseek —— 让 Agent 的足迹,变成团队的洞察
大数据·数据库·sql·游戏·ai·oceanbase·sql优化
m0_7488394921 分钟前
SQL视图在ETL流程中的作用_数据清洗与标准化接口
jvm·数据库·python
2401_8326355822 分钟前
JavaScript中字符串toLowerCase与toUpperCase规范
jvm·数据库·python
Wyz2012102424 分钟前
如何在 Discord.py 中实现按钮权限控制:仅允许特定角色点击
jvm·数据库·python