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