Redis List 是一个简单的链表,支持在两端进行插入和删除操作。这种数据结构在许多场景下非常有用,例如任务队列、消息队列等。Redis 提供了一系列针对 List 的操作命令,帮助我们更高效地操作链表。
| 操作类型 | 命令 | 时间复杂度 |
| 添加 | push key value [value …] | O(k),k是元素个数 |
| push key value [value …] | O(k),k是元素个数 | |
| insert key before|after 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 | O(1) |
| rpop key | O(1) | |
| lremkey count value | O(k),k是元素个数 | |
| ltrim key start end | O(k),k是元素个数 | |
| 修改 | lset key index value | O(n),n是索引的偏移量 |
| 阻塞操作 | blpop brpop | O(1) |
1. LPUSH key value [value ...]
- LPUSH mylist "world"
- LPUSH mylist "hello"
- # 列表内容为:hello, world
2. RPUSH key value [value ...]
- RPUSH mylist "hello"
- RPUSH mylist "world"
- # 列表内容为:hello, world
3. LINSERT key BEFORE/AFTER pivot value
- RPUSH mylist "hello"
- RPUSH mylist "world"
- LINSERT mylist BEFORE "world" "there"
- # 列表内容为:hello, there, world
1. LRANGE key start end
- RPUSH mylist "one" "two" "three"
- LRANGE mylist 0 1
- # 返回:one, two
2. LINDEX key index
- RPUSH mylist "one" "two" "three"
- LINDEX mylist 1
- # 返回:two
3. LLEN key
- RPUSH mylist "one" "two" "three"
- LLEN mylist
- # 返回:3
1. LPOP key
- RPUSH mylist "one" "two" "three"
- LPOP mylist
- # 返回:one,列表内容为:two, three
2. RPOP key
- RPUSH mylist "one" "two" "three"
- RPOP mylist
- # 返回:three,列表内容为:one, two
3. LREM key count value
- RPUSH mylist "hello" "hello" "foo" "hello"
- LREM mylist 2 "hello"
- # 列表内容为:foo, hello
4. LTRIM key start end
- RPUSH mylist "one" "two" "three" "four"
- LTRIM mylist 1 2
- # 列表内容为:two, three
1. LSET key index value
- RPUSH mylist "one" "two" "three"
- LSET mylist 1 "four"
- # 列表内容为:one, four, three
1. BLPOP key [key ...] timeout
- RPUSH mylist "one" "two" "three"
- BLPOP mylist 0
- # 返回:one,列表内容为:two, three
-
2. BRPOP key [key ...] timeout
- RPUSH mylist "one" "two" "three"
- BRPOP mylist 0
- # 返回:three,列表内容为:one, two
通过以上命令,我们可以高效地操作 Redis 的 List 类型,满足不同场景下的数据处理需求。Redis 的高性能和丰富功能,使得它在实际应用中具有非常高的实用价值。
在 Redis 中,List(列表)是一种非常常用的数据结构,适用于各种场景,如任务队列、消息队列等。为了优化性能和内存使用,Redis 提供了2种内部编码方式来存储 List 数据结构。
Redis 中 List 的内部编码主要有两种:
如图所示,Redis 可以使用lpush+brpop 命令组合实现经典的阻塞式生产者-消费者模型队列,生产者客户端使用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop命令阻塞式地从队列中"争抢"队首元素。通过多个客户端来保证消费的负载均衡和高可用性。

- # 生产者将消息推送到队列
- LPUSH message_queue "message1"
- LPUSH message_queue "message2"
-
- # 消费者从队列取出消息
- RPOP message_queue
- # 返回: message1
- RPOP message_queue
- # 返回: message2
如图所示,Redis 同样使用 lpush+brpop 命令,但通过不同的键模拟频道的概念,不同的消费者可以通过 brpop 不同的键值,实现订阅不同频道的理念。
分频道消息队列是一种将消息按照频道进行分类和分发的消息系统。其主要特点如下:
使用 Redis List 实现分频道消息队列的基本思路是:
LPUSH 命令将消息推送到对应频道的 List。BRPOP 命令阻塞等待频道中的消息。