Redis 操作 list 详解
一、Redis List 是什么?
Redis List 是一个双端链表(有序、可重复):
有顺序
可重复
不能按值随机访问(只能按 index)
两端操作极快(O(1))
示例:
["job1", "job2", "job3"]
二、基础命令速查
1. LPUSH / RPUSH(入队)
LPUSH mylist a b c
# 结果: c b a
RPUSH mylist a b c
# 结果: a b c
2. LPOP / RPOP(出队)
LPOP mylist # 从左弹出
RPOP mylist # 从右弹出
3. 阻塞弹出(队列核心)
BLPOP mylist 0
BRPOP mylist 5
0= 永久阻塞返回:
[key, value]
4. 查看列表
LRANGE mylist 0 -1 # 全部
LRANGE mylist 0 9 # 前 10 个
5. 长度
LLEN mylist
三、修改 / 删除元素
1. 按索引修改
LSET mylist 0 first
2. 删除元素(按值)
LREM mylist 0 a
| count | 含义 |
|---|---|
| 0 | 删除所有 |
| >0 | 从左往右删 |
| <0 | 从右往左删 |
3. 截断列表(重要)
LTRIM mylist 0 99
只保留前 100 个。
四、高级命令(很有用)
1. RPOPLPUSH(安全队列)
RPOPLPUSH source dest
从 source 右侧弹出
推入 dest 左侧
任务处理不丢失
2. BRPOPLPUSH(阻塞版)
BRPOPLPUSH source dest 0
3. LMOVE(Redis ≥ 6.2)
LMOVE source dest RIGHT LEFT
五、List 在 Redis 中的性能
| 操作 | 复杂度 |
|---|---|
| LPUSH / RPUSH | O(1) |
| LPOP / RPOP | O(1) |
| LRANGE | O(n) |
| LREM | O(n) |
️ 避免超大 list(百万级)
六、典型使用场景
1. 消息队列(最常见)
# producer
RPUSH jobs job1
# consumer
BRPOP jobs 0
2. 延迟队列(简单)
List 不适合延迟
用 ZSet 更好
3. 最新消息列表
LPUSH news msg1
LTRIM news 0 99
4. 历史记录
RPUSH history action1
七、Laravel / PHP 示例
use Illuminate\Support\Facades\Redis;
// push
Redis::rpush('queue', json_encode($job));
// pop
$data = Redis::blpop('queue', 0);
$job = json_decode($data[1], true);