Redis 的 List 类型是基于双向链表实现的有序字符串集合,支持从两端进行快速插入和删除操作。以下是 Redis List 类型的常见操作命令及其用途:
1. 插入操作
命令 | 描述 | 示例 |
---|---|---|
LPUSH key value [value ...] | 将一个或多个值插入到列表的头部(左侧)。 |
LPUSH mylist "a" "b" # 列表变为 ["b", "a"]
| RPUSH key value [value ...]
| 将一个或多个值插入到列表的尾部(右侧)。 |
RPUSH mylist "c" "d" # 列表变为 ["b", "a", "c", "d"]
| LINSERT key BEFORE|AFTER pivot value
| 在列表中某个值的前/后插入新值。 |
LINSERT mylist AFTER "a" "x" # 列表变为 ["b", "a", "x", "c", "d"]
| LPUSHX key value
| 若键已存在且为 List 类型,则将值插入到列表头部。否则不做操作。 |
LPUSHX mylist "e" # 若 mylist 存在,则插入 "e" 到头部。
2. 删除操作
命令 | 描述 | 示例 |
---|---|---|
LPOP key | 从列表的头部(左侧)弹出并返回第一个元素。 |
LPOP mylist # 返回 "b",列表变为 ["a", "x", "c", "d"]
| RPOP key
| 从列表的尾部(右侧)弹出并返回最后一个元素。 |
RPOP mylist # 返回 "d",列表变为 ["b", "a", "x", "c"]
| LREM key count value
| 从列表中删除指定数量的匹配值。 |
LREM mylist 1 "a" # 删除第一个 "a",列表变为 ["b", "x", "c"]
| LTRIM key start stop
| 修剪列表,保留指定范围内的元素(超出范围的元素会被删除)。 |
LTRIM mylist 0 1 # 保留索引 0~1 的元素,列表变为 ["b", "x"]
3. 查询操作
命令 | 描述 | 示例 |
---|---|---|
LRANGE key start stop | 获取列表中指定范围的元素(闭区间)。 |
LRANGE mylist 0 -1 # 返回 ["b", "x"](0~-1 表示全部元素)
| LINDEX key index
| 获取列表中指定索引位置的元素(支持负数索引)。 |
LINDEX mylist 1 # 返回 "x"
| LLEN key
| 返回列表的长度。 |
LLEN mylist # 返回 2
4. 修改操作
命令 | 描述 | 示例 |
---|---|---|
LSET key index value | 修改列表中指定索引位置的元素值。 |
LSET mylist 1 "y" # 列表变为 ["b", "y"]
5. 其他高级操作
命令 | 描述 | 示例 |
---|---|---|
RPOPLPUSH source destination | 从源列表弹出尾部元素,并将其插入到目标列表的头部。 |
RPOPLPUSH mylist anotherlist # 将 "y" 从 mylist 移到 anotherlist 头部
| BRPOP/BLPOP key timeout
| 阻塞式读取操作。若列表为空,则阻塞直到有元素可用或超时。 |
BLPOP mylist 10 # 最多等待 10 秒,直到 mylist 有元素可读
| LMOVE source destination LEFT|RIGHT LEFT|RIGHT
| 原子性地将元素从一个列表移动到另一个列表(Redis 6.2+)。 |
LMOVE mylist anotherlist LEFT LEFT # 将 mylist 的左端元素移到 anotherlist 左端
6. 应用场景
- 队列(FIFO):使用
LPUSH
+RPOP
或RPUSH
+BLPOP
实现。 - 栈(LIFO):使用
LPUSH
+LPOP
实现。 - 消息队列:结合
BRPOP
和RPOPLPUSH
实现可靠的消息传递。 - 时间线/日志:通过
RPUSH
添加新事件,通过LRANGE
查询历史记录。
7. 注意事项
- 性能优化:
- 头尾操作(如
LPUSH
/LPOP
)时间复杂度为 O(1),高效。 - 中间操作(如
LINDEX
/LINSERT
)时间复杂度为 O(N),需谨慎使用。
- 头尾操作(如
- 阻塞命令:
- 使用
BLPOP
/BRPOP
时,需处理连接超时或断开的情况。
- 使用
- 内存管理:
- 避免列表无限增长,可通过
LTRIM
限制长度(如实现固定大小的缓存)。
- 避免列表无限增长,可通过
示例代码(Python)
import redis
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
# 插入
r.lpush('mylist', 'a', 'b')
r.rpush('mylist', 'c', 'd')
# 查询
print(r.lrange('mylist', 0, -1)) # 输出: [b'b', b'a', b'c', b'd']
# 删除
r.lpop('mylist') # 弹出 'b'
r.rpop('mylist') # 弹出 'd'
# 修改
r.lset('mylist', 1, 'x') # 修改索引1的元素为 'x'
# 修剪
r.ltrim('mylist', 0, 1) # 保留前两个元素
通过灵活组合这些命令,可以高效地实现各种队列、栈或复杂的数据处理场景。
THE END