1. 介绍
Redis 中的 list 相当于顺序表,并且内部更接近于"双端队列",所以也支持头插和尾插的操作,可以当做队列或者栈来使用,同时也存在下标的概念,不过和 Java 中的下标不同,Redis 支持负数下标,-1 表示倒数第一个元素,-2 表示倒数第二个元素,和 Java 中的 List 相同的是,列表中的元素是有序的,并且允许重复
2. 常用命令
|-------------------------------|---------------------------------------------------------|--------------------------------------------|
| 命令 | 介绍 | 时间 |
| rpush key value [value ...] | 将一个或多个值插入到列表 key 的表尾(最右边) | O (k),k 是元素个数 |
| lpush key value [value ...] | 将一个或多个值插入到列表 key 的表头(最左边) | O (k),k 是元素个数 |
| linsert key before | 在列表的元素 pivot 之前插入元素 value | O (n),n 是 pivot 距离头的距离 |
| after pivot value | 在列表的元素 pivot 之后插入元素 value | O (n),n 是 pivot 距离头的距离 |
| lrange key start end | 获取列表指定范围内的元素 | O (s+n),s 是 start 偏移量,n 是 start 到 end 的范围。 |
| lindex key index | 通过索引获取列表中的元素 | O (n),n 是索引的偏移量 |
| llen key | 获取列表的长度 | O (1) |
| lpop key | 移除并返回列表 key 的头元素 | O (1) |
| rpop key | 移除并返回列表 key 的尾元素 | O (1) |
| lrem key count value | count 大于 0 时,从左开始搜索,小于 0 时从右开始搜索,删除count 个值等于 value 的元素 | O (k),k 是元素个数 |
| ltrim key start end | 保留 key
对应列表中指定区间 [start, end]
的元素 | O (k),k 是元素个数 |
| lset key index value | 将列表 key 下标为 index 的元素的值设置为 value | O (n),n 是索引的偏移量。 |
| blpop | lpop 的阻塞版本 | O (1) |
| brpop | rpop 的阻塞版本 | O (1) |
3. 内部编码
在 Redis 3.2 之前主要采用linkedlist
和ziplist
,3.2 之后主要采用quicklist
linkedlist:双向链表
ziplist:经过特殊编码的连续内存块的顺序存储结构,它将多个元素紧凑地存储在一起,以节省内存空间
quicklist:它是一个双向链表,每个节点是一个 ziplist
4. 应用场景
- 消息队列
可以使用 lpush + brpop 来实现生产者-消费者模型队列
- 最新消息列表
用于展示最新的一些信息,如社交媒体平台上用户的最新动态、新闻网站的最新消息等,每当有新消息产生时,使用rpush
命令将消息添加到 List 的尾部。要获取最新消息,通过lrange
命令并设置合适的参数来获取 List 尾部的若干条消息。比如,在一个微博系统中,用户发布的微博可以存储在一个 List 结构中,通过获取 List 的尾部消息来展示用户关注的人发布的最新微博,可以方便地控制显示的消息数量,并且按照消息的发布顺序进行存储和展示,易于实现分页功能,以展示更多的消息