Redis列表命令
列表(List)是有序的字符串集合,支持从两端插入和弹出,适合实现队列、栈等结构。
LPUSH/RPUSH插入元素
左端插入
Bash
# 从左侧插入元素(头部)
LPUSH mylist "a"
LPUSH mylist "b" "c"
# 列表内容: ["c", "b", "a"]
右端插入
Bash
# 从右侧插入元素(尾部)
RPUSH mylist "d" "e"
# 列表内容: ["c", "b", "a", "d", "e"]
条件插入
Bash
# 仅当列表存在时插入
LPUSHX mylist "f" # 成功
LPUSHX notexist "g" # 失败,返回0
RPUSHX mylist "g" # 成功
LPOP/RPOP弹出元素
左端弹出
Bash
# 从左侧弹出元素
LPOP mylist
# 返回: "c"
# 弹出多个元素(Redis 6.2+)
LPOP mylist 2
# 返回: "b", "a"
右端弹出
Bash
# 从右侧弹出元素
RPOP mylist
# 返回: "e"
LRANGE获取范围元素
基本语法
Bash
LRANGE key start stop
使用示例
Bash
RPUSH numbers 1 2 3 4 5
# 获取全部元素
LRANGE numbers 0 -1
# 返回: ["1", "2", "3", "4", "5"]
# 获取前3个元素
LRANGE numbers 0 2
# 返回: ["1", "2", "3"]
# 获取最后2个元素
LRANGE numbers -2 -1
# 返回: ["4", "5"]
-1表示最后一个元素,-2表示倒数第二个。
LLEN获取列表长度
基本语法
Bash
LLEN key
使用示例
Bash
LLEN numbers
# 返回: 5
# 不存在的列表
LLEN notexist
# 返回: 0
LINDEX获取指定位置元素
基本语法
Bash
LINDEX key index
使用示例
Bash
# 获取索引0的元素(第一个)
LINDEX numbers 0
# 返回: "1"
# 获取索引-1的元素(最后一个)
LINDEX numbers -1
# 返回: "5"
# 索引超出范围
LINDEX numbers 10
# 返回: (nil)
LSET设置指定位置元素
基本语法
Bash
LSET key index value
使用示例
Bash
# 设置索引0的值
LSET numbers 0 "one"
# 设置最后一个元素
LSET numbers -1 "five"
索引超出范围会报错。
LINSERT插入元素
基本语法
Bash
LINSERT key BEFORE|AFTER pivot value
使用示例
Bash
# 在"3"之前插入
LINSERT numbers BEFORE "3" "2.5"
# 在"3"之后插入
LINSERT numbers AFTER "3" "3.5"
LREM删除元素
基本语法
Bash
LREM key count value
使用示例
Bash
RPUSH mylist "a" "b" "a" "c" "a"
# count > 0: 从头开始删除count个
LREM mylist 2 "a"
# 删除前2个"a",剩余: ["b", "c", "a"]
# count < 0: 从尾开始删除count个
LREM mylist -1 "a"
# 删除最后1个"a"
# count = 0: 删除所有
LREM mylist 0 "a"
# 删除所有"a"
BLPOP/BRPOP阻塞弹出
基本语法
Bash
BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
使用示例
Bash
# 阻塞等待左端弹出,超时10秒
BLPOP myqueue 10
# 同时监听多个列表
BLPOP queue1 queue2 5
# 无限等待
BLPOP myqueue 0
BLPOP常用于实现消息队列消费者。
RPOPLPUSH移动元素
基本语法
Bash
RPOPLPUSH source destination
使用示例
Bash
# 将source尾部元素移动到destination头部
RPOPLPUSH queue1 queue2
# 阻塞版本
BRPOPLPUSH queue1 queue2 10
RPOPLPUSH可实现可靠队列,处理失败后元素在备份队列。
常用命令速查表
| 命令 | 说明 | 示例 |
|---|---|---|
| LPUSH | 左端插入 | LPUSH k v |
| RPUSH | 右端插入 | RPUSH k v |
| LPOP | 左端弹出 | LPOP k |
| RPOP | 右端弹出 | RPOP k |
| LRANGE | 获取范围 | LRANGE k 0 -1 |
| LLEN | 获取长度 | LLEN k |
| LINDEX | 获取指定位置 | LINDEX k 0 |
| LSET | 设置指定位置 | LSET k 0 v |
| LINSERT | 插入元素 | LINSERT k BEFORE p v |
| LREM | 删除元素 | LREM k 2 v |
| BLPOP | 阻塞左弹 | BLPOP k 10 |
| BRPOP | 阻塞右弹 | BRPOP k 10 |
| RPOPLPUSH | 移动元素 | RPOPLPUSH src dest |
要点总结
- 列表是双向链表,两端操作都是O(1)
- LPUSH/RPUSH从头部/尾部插入,LPOP/RPOP从头部/尾部弹出
- LRANGE 0 -1获取全部元素,支持负索引
- LREM count>0从头删,count<0从尾删,count=0删全部
- BLPOP/BRPOP阻塞弹出,实现消息队列消费者
- RPOPLPUSH实现可靠队列,元素移动到备份队列
- LINDEX/LSET操作中间元素效率较低O(N),尽量避免
📝 发现内容有误?点击此处直接编辑