背景介绍
Redis中list数据结构,也就是队列,使用quicklist作为底层存储结构,quicklist本质上是一个双向链表
数据结构
quicklist本身的结构如下
1 | /* quicklist is a 40 byte struct (on 64-bit systems) describing a quicklist. |
可以看到有head和tail,方便从首尾两个方向做push和pop操作,quicklistNode结构如下:
1 | /* quicklistNode is a 32 byte struct describing a ziplist for a quicklist. |
其中prev和next分别指向之前和之后的Node,而zl表示存储数据的ziplist,关于ziplist前面已经介绍过了,这里要注意的是一个ziplist是存储了多个元素的,在插入数据的时候会根据情况选择增加一个新的Node还是将数据插入到当前已经存在的Node的zl中,这样应该也是一种节约内存的方式
总结
双向链表学过数据结构的都会知道,这里做的优化是使用ziplist,在一个Node里面存储多条数据以节省内存,具体的规则优点复杂这里不介绍了