底层结构:
list 是一个有序的数据结构, 长度不固定,所以数组不行
(1)ziplist(压缩列表)【紧凑】:当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
(2)quicklist(双端链表):当列表类型无法满足ziplist的条件时,Redis会使用quicklist作为列表的内部实现。
ziplist(压缩列表)
zlbytes: 32bit,表示ziplist占用字节的总数
zltail: 32bit,表示ziplist表中最后一项(entry)在ziplist中的偏移字节数,通过zltail可以很方便地找到最后一项,从而可以在ziplist尾端快速地执行push或pop操作
zlen: 16bit,表示ziplist中数据项(entry)的个数
prerawlen:前一个entry的数据长度
len: entry中的数据长度
data: 真实数据的存储
优点:
(1)紧凑型,极大地节省内存空间
缺点:
(1)通过时间换取空间,操作更加复杂
quicklist
数据实际节点还是存储在ziplist中
配置ziplist大小
list-max-ziplist-size -2 // 设置ziplist大小
由于list一般用于存储热点数据,所以中间数据很少关心,所以可以对中间数据进行压缩设置
list-compress-depth 1 // 默认为0,不压缩,如果是1,从左边第一个,右边第一个开始中间的压缩
双向链表的缺点:
由于需要有前后指针,所以,指针会浪费内存。ziplist不使用指针
应用场景
好友列表,粉丝列表,消息队列,最新消息排行等。
list操作命令【有序,可重复,双端队列】
1.lpush: 往list最左边添加元素
2.rpush:往list最右边添加元素
3.lpop:推出最左边的元素
4.rpop:推出最右边元素
5.llen:查看list长度
6.linsert key before value newValue: 在list指定的值前插入newValue
7.linsert key after value newValue: 在list指定的值后插入newValue