首页/数据/数据库速查/LINSERT 指定元素前后插入
Redis 命令96 条

LINSERT 指定元素前后插入

在列表中「找到某个值」然后在其前/后插入新元素:LINSERT key BEFORE|AFTER pivot value;pivot 不存在返回 -1。

数据库速查数据更新于 2026-10-13

LINSERT 是什么

LINSERT 按「值」定位再插入:找到列表中第一个等于 pivot 的元素,在它前面或后面插入新元素,并返回插入后的列表长度;如果 pivot 不存在则返回 -1 且不做任何改动。定位过程要遍历列表,复杂度 O(N)。用它最合适的场景是「插队」类需求——把高优先级项放到某个已知元素前后。

基本信息

适用版本Redis 2.2+
语法LINSERT key BEFORE|AFTER pivot value
返回值插入后列表长度;-1 表示 pivot 不存在;0 表示键不存在
复杂度O(N),需要扫描找到 pivot
匹配规则只匹配第一个等于 pivot 的元素
定位依据按值匹配,不是按下标

典型使用场景

  • 任务插队:把紧急任务插到普通任务前面
  • 顺序修正:在某个已知元素前后补一条记录
  • 消息补偿:在指定消息后插入一条更正消息
  • 列表展示顺序调整:小列表上的定点插入
  • 流水日志补录:在标记位前后补写一条记录

示例

示例
RPUSH tasks t1 t2 t3
LINSERT tasks BEFORE t2 urgent   # 3,列表变 t1 urgent t2 t3
LINSERT tasks AFTER t3 tail      # 4,列表变 t1 urgent t2 t3 tail
LINSERT tasks BEFORE t99 x       # -1:pivot 不存在,未插入
LINSERT tasks AFTER t2 y         # 5,插在第一个 t2 之后
LRANGE tasks 0 -1                # 核对最终顺序

返回码对照

返回值含义后续动作
-1pivot 不存在,未插入确认 pivot 值是否写错或已被消费
0键不存在(列表为空)先创建列表或改用 RPUSH
大于 0插入后的列表长度可用长度变化确认是否插入成功
错误键类型不是 List确认键未被其他结构占用
pivot 是值匹配而不是下标:列表中存在重复值时,只能插到第一个匹配位置之前或之后,无法指定「最后一个匹配」或「第二个匹配」,需要这种语义时应在应用侧改写下标并配合 LSET。
大列表上频繁 LINSERT 的代价随长度线性上升:每次都要从表头扫描找 pivot。做优先级队列更合适的选择是 ZSet(按 score 排序,插入 O(log N))。

易错点

  • 以为可以指定插入到最后一个匹配位置:实际只认第一个匹配,顺序可能不符合预期
  • 大列表高频 LINSERT:每次全列表扫描,延迟随长度线性增长
  • pivot 写错导致返回 -1 却被忽略:调用方以为插入成功,业务数据缺一条
  • 用列表做优先级队列:没有天然排序能力,插队逻辑复杂且易错,应改用 ZSet
  • 列表为空时调用:键不存在返回 0,误判为「插入失败」而重复重试

数据来源与参考

  • Redis 官方文档: LINSERT

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌