原创

redis数据结构-五种数据类型-List


Redis的List类型可以从首、尾操作列表中的元素:

微信截图_20230209002437

哪一个数据结构能满足上述特征?

  • LinkedList:普通链表,可以从双端访问,内存占用较高,内存碎片较多
  • ZipList:压缩列表,可以从双端访问,内存占用低,存储上限低
  • QuickList: LinkedList + ZipList,可以从双端访问,内存占用较低,包含多个ZipList,存储上限高

Redis的List结构

Redis的List结构类似一个双端链表,可以从首、尾操作列表中的元素:

  • 在3.2版本之前,Redis采用ZipListLinkedList来实现List,当元素数量小于512并且元素大小小于64字节时采用ZipList编码,超过则采用LinkedList编码。
  • 在3.2版本之后,Redis统一采用QuickList来实现List:

微信截图_20230209002533

List源码

List的put方法他们都调用了pushGenericCommand

微信截图_20230209002708

查看pushGenericCommand方法

微信截图_20230209203626

然后再点createQuicklistObject方法看看他是怎么创建QuickList的

微信截图_20230209203711

这里可以看到OBJ_LIST(数据类型)和l(数据体)两个参数,查看Object的创建方法

微信截图_20230209210316

他把raw数据类型赋值给了object对象,然后再返回上一级方法进行重置,重置为OBJ_ENCODING_QUICKLIST

创建完成最后返回上面的pushGenericCommand方法,由于quickList里有zipList所以需要限制ziplist的大小,不能超过8kb,设置zipList的压缩深度(247行quicklistSetOptions方法)

总览图

最后可以用一张图来表示redis中的List

微信截图_20230209211552

redis原理
数据结构
  • 作者:陌攻(联系作者)
  • 发表时间:2023-02-13 02:40
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 公众号转载:请在文末添加作者公众号二维码
  • 评论