参考自《Redis开发与运维》
简介
列表类型是用来存储多个有序的字符串,一个列表最多可存储2^32-1个元素,列表结构实际上是双向链表,可以当队列或者栈
特点
- 列表中的元素是有序的,可以通过下标访问或者某个范围内的元素
- 列表中的元素可以是重复的
命令介绍
命令 | 命令描述 |
| 右边插入元素,左边插入则是lpush |
| 从列表中找到等于pivot的元素,在其前或后插入一个新元素value |
| 获取指定范围内的元素列表,索引下标从左到右为0到N-1,右到左为-1到-N |
| 获取指定索引下标的元素 |
| 获取列表长度 |
| 从左侧弹出,右侧弹出为rpop |
| 从列表中找到等于value的元素删除,根据count不同分三种情况:count>0,从左到右删除最多count个元素;count=0,删除所有;count<0,从右到左删除最多count绝对值个元素 |
| 按照索引范围修剪列表 |
| 修改指定索引下标的元素 |
| 阻塞式弹出,还有 |
注意:
-
blpop
如果是多个key,则会从左到右遍历每个key,一旦有一个key能弹出元素,客户端立即返回,blpop多个key,最后只会弹出一个key,然后就返回 - 如果多个客户端对同一个key执行blpop,那么最先执行blpop命令的客户端可以获取到弹出的值
内部编码
列表类型编码有三种:
ziplist(压缩列表)
linkedlist(链表)
quicklist,可以理解为是一个以ziplist为结点的linkedlist,结合了两种优势
使用场景
- 消息队列
lpush+brpop命令组合可以实现阻塞队列,生产者客户端使用lpush从列表左侧添加元素,多个消费者客户端从右侧阻塞式弹出,多个客户端保证了消费的负载均衡和高可用性 - 文章列表
把文章用哈希类型存储,再把文章哈希类型整体作为value插入到列表中,以用户id作为key,这样就可以保存一个用户的所有文章
注意:lrange命令在列表两端性能比较好,如果列表较大,获取列表中间范围的元素性能会变差,此时可以考虑将列表做二级拆分,或者使用quicklist内部编码实现,获取列表中间范围的元素时也很高效
列表的使用场景很多:
lpush+lpop=stack栈
lpush+rpop=queue队列
lpush+ltrim=有限集合
lpush+brpop=阻塞队列