面试题:Redis List 类型的常见操作命令有哪些?

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. 注意事项

  1. 性能优化
    • 头尾操作(如 LPUSH/LPOP)时间复杂度为 O(1),高效。
    • 中间操作(如 LINDEX/LINSERT)时间复杂度为 O(N),需谨慎使用。
  2. 阻塞命令
    • 使用 BLPOP/BRPOP 时,需处理连接超时或断开的情况。
  3. 内存管理
    • 避免列表无限增长,可通过 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
喜欢就支持一下吧
点赞8 分享