阿里云网站的logo怎么写进去的,有什么网站可以做跳转连接的,网站建设电脑,做微商做什么网站比较好本文是深入理解 Redis 常用数据类型源码及底层实现系列的第5篇#xff5e;前4篇可移步(#xffe3;∇#xffe3;)/
【Redis】深入理解 Redis 常用数据类型源码及底层实现#xff08;1.结构与源码概述#xff09;-CSDN博客
【Redis】深入理解 Redis 常用数据类型源码及底…本文是深入理解 Redis 常用数据类型源码及底层实现系列的第5篇前4篇可移步(∇)/
【Redis】深入理解 Redis 常用数据类型源码及底层实现1.结构与源码概述-CSDN博客
【Redis】深入理解 Redis 常用数据类型源码及底层实现(2.版本区别dictEntry redisObject详解)-CSDN博客
【Redis】深入理解 Redis 常用数据类型源码及底层实现(3.详解String数据结构)-CSDN博客
【Redis】深入理解 Redis 常用数据类型源码及底层实现(4.详解Hash数据结构)_查看 hash-max-ziplist-entries 命令-CSDN博客 正文开始
在Redis 3之前List数据结构底层ziplist和linkedlist双向链表当列表对象中元素的长度比较小或者数量比较少的时候采用ziplist来存储内存紧凑访问效率高但是更新效率低当数据量较大时可能导致大量的内存复制当列表对像中元素的长度比较大或者数据数量比较多的时候会使用linkedlist修改效率高但是内存开销大当节点较多时会产生大量的内存碎片。
后续综合了两者的优缺点使用quicklist替换了ziplist和linkedlist双向链表。
虽然都是quicklist但其实在Redis 6及其以前和Redis 7及其以后也存在较大的不同。简单一句话来理解就是Redis 6的quicklist中装的是ziplist而Redis 7的quicklist中装的是listpack看过上一篇介绍Hash得文章的朋友应该了解listpack就是用来替代ziplist的
我们可以对比下来看首先是相关的配置参数 先看下都有的list-compress-depth和list-max-ziplist-size
list-compress-depth指的是压缩配置表示一个quicklist两端不被压缩的节点个数这里的节点是quicklist双向链表的节点不是里面的ziplist/listpack 取值含义 0默认值表示都不压缩nquicklist两端各有n个节点不被压缩中间的都压缩n1/2/3……
list-max-ziplist-size指的是ziplist中的entry的配置 取值含义 正值表示按照数据项个数来限定每个quicklist节点上的ziplist的长度例如取5的时候表示每个quicklist节点的ziplist最多包含5个数据项负值表示按照占用字节数来限定每个quicklist节点上的ziplist长度 取值含义只能取-5/-4/-3/-2/-1五个值 -5每个quicklist节点上的ziplist大小不能超过64Kb1kb1024 bytes即64*1024 bytes-4每个quicklist节点上的ziplist大小不能超过32Kb1kb1024 bytes即32*1024 bytes-3每个quicklist节点上的ziplist大小不能超过16Kb1kb1024 bytes即16*1024 bytes-2默认值每个quicklist节点上的ziplist大小不能超过8Kb1kb1024 bytes即8*1024 bytes-1每个quicklist节点上的ziplist大小不能超过4Kb1kb1024 bytes即4*1024 bytes
而Redis 7多了一个参数list-max-listpack-size这个参数的含义跟list-max-ziplist-size基本一致不过指的不是ziplist中的entry而是listpack中的entry的配置
取值含义 正值表示按照数据项个数来限定每个quicklist节点上的listpack的长度例如取5的时候表示每个quicklist节点的listpack最多包含5个数据项负值表示按照占用字节数来限定每个quicklist节点上的ziplist长度 取值含义只能取-5/-4/-3/-2/-1五个值 -5每个quicklist节点上的listpack大小不能超过64Kb1kb1024 bytes即64*1024 bytes-4每个quicklist节点上的listpack大小不能超过32Kb1kb1024 bytes即32*1024 bytes-3每个quicklist节点上的listpack大小不能超过16Kb1kb1024 bytes即16*1024 bytes-2默认值每个quicklist节点上的listpack大小不能超过8Kb1kb1024 bytes即8*1024 bytes-1每个quicklist节点上的listpack大小不能超过4Kb1kb1024 bytes即4*1024 bytes
看张比较形象的图 quicklist.h
在quicklist.h的源代码中我们可以看到每个节点被封装成了quicklistNode对象 typedef struct quicklist {quicklistNode *head;quicklistNode *tail;unsigned long count; /* total count of all entries in all ziplists */unsigned long len; /* number of quicklistNodes */int fill : QL_FILL_BITS; /* fill factor for individual nodes */unsigned int compress : QL_COMP_BITS; /* depth of end nodes not to compress;0off */unsigned int bookmark_count: QL_BM_BITS;quicklistBookmark bookmarks[];
} quicklist;
我们解释下关键参数
*head指向双向列表表头的指针*tail指向双向列表表尾的指针count记录ziplist中存放的元素个数len双向链表的长度quicklistNode的数量compress压缩深度默认0表示不压缩
不知道有没有小伙伴觉得奇怪这些参数都没见到ziplist但是为什么count表示的是ziplist中存放的元素个数
那是因为在每个quicklistNode对象中装着一个ziplist typedef struct quicklistNode {struct quicklistNode *prev;struct quicklistNode *next;unsigned char *zl;unsigned int sz; /* ziplist size in bytes */unsigned int count : 16; /* count of items in ziplist */unsigned int encoding : 2; /* RAW1 or LZF2 */unsigned int container : 2; /* NONE1 or ZIPLIST2 */unsigned int recompress : 1; /* was this node previous compressed? */unsigned int attempted_compress : 1; /* node cant compress; too small */unsigned int extra : 10; /* more bits to steal for future usage */
} quicklistNode;
我们解释下关键参数
*prev指向前一个节点的指针*next指向后一个节点的指针*zl指向实际存储数据的ziplistsc当前ziplist占用的字节数count当前ziplist中存放的元素数最大65536encoding表示采用的压缩算法1:RAW、2:LZF
结构图解 接下来我们看下当执行新增元素操作时源码的底层代码逻辑 Redis 6和Redis 7pushGenericCommand()方法略有不同其实主要就是listpack替代ziplist的区别 搞定