- 列表最多可以存储 2 - 1 个元素
特点:
- 列表中的元素是有序的, 可以通过索引下标获取某个元素或者某个范围内的元素列表 (不确定这里的有序是指?)
- 元素可以重复
2.4.1 命令
1. 添加操作
(1) 从右边插入元素
- rpush
- 从左到右获取列表的所有元素: lrange
(2) 从左边插入元素
- lpush
(3) 向某个元素前或者后插入元素
- linsert
2. 查找
(1) 获取指定范围内的元素列表
- lrange
- 从左到右: 0~N-1
- 从右到左: -1~-N
- end 选项包含自身
(2) 获取列表指定索引下标的元素
- lindex
(3) 获取列表长度
- llen
3. 删除
(1) 从列表左侧弹出元素
- lpop
(2) 从列表右侧弹出
- rpop
(3) 删除指定元素
- lrem
- count 参数
0: 从左到右, 最多删除 count 个元素
- <0: 从右到左
- =0: 删除所有
- count 参数
(4) 按照索引范围修剪列表
- ltrim
4. 修改
- lset
5. 阻塞操作
阻塞式弹出:
- blpop
- brpop
- key
- timeout
注意:
- 如果是多个键, 那么 brpop 会从左至右遍历键, 一旦有一个键能弹出元素, 客户端立即返回
2.4.2 内部编码
列表类型的内部编码有两种:
- ziplist
当列表的元素个数小于 list-max-ziplist-entries 配置 (默认512个), 同时列表中每个元素的值都小于 list-max-ziplistvalue 配置时 (默认64字节), Redis 会选用 ziplist 来作为列表的内部实现来减少内存的使用。
- linkedlist
当列表类型无法满足 ziplist 的条件时, Redis 会使用 linkedlist 作为列表的内部实现
Redis3.2 版本提供了quicklist 内部编码, 简单地说它是以一个 ziplist 为节点的 linkedlist, 它结合了 ziplist 和 linkedlist 两者的优势, 为列表类型提供了一种更为优秀的内部编码实现, 它的设计原理可以参考 Redis 的另一个作者 Matt Stancliff 的博客: https://matt.sh/redis-quicklist
2.4.3 使用场景
1. 消息队列
阻塞队列:
- lpush + brpop
2. 文章列表
3. 其它
- lpush + lpop = Stack (栈)
- lpush + rpop = Queue (队列)
- lpsh + ltrim = Capped Collection (有限集合)
- lpush + brpop = Message Queue (消息队列)