LTRIM 是什么
LTRIM 按索引区间裁剪列表:保留闭区间内的元素,其余全部删除,返回 OK。它常与 LPUSH 或 RPUSH 组合,用来维护「只保留最近 N 条」的时间线与日志,让列表长度恒定、内存可控,不需要额外写清理逻辑。
基本信息
| 语法 | LTRIM key start stop |
|---|---|
| 语义 | 闭区间保留,区间外全部删除,两侧都包含 |
| 负索引 | -1 表示最后一个元素,-2 表示倒数第二个 |
| 返回 | OK,不返回被删除的元素 |
| 复杂度 | 被删除元素数量相关的 O(N) |
典型使用场景
- 最近搜索或浏览记录:LPUSH 写入新记录,LTRIM 0 99 只留最近 100 条
- 应用内消息流:只保留近若干条展示,历史归档到数据库
- 日志缓冲:把 List 当环形缓冲,长度恒定避免内存持续增长
- 任务重试记录:只保留最近若干次执行结果,便于排障又不会无限堆积
- 定时清理的替代:写入时就裁剪,比依赖定时任务更及时
裁剪示例
裁剪示例
RPUSH feed 1 2 3 4 5
LTRIM feed 1 -1 # 保留 2 到 5,删掉第 0 个
LRANGE feed 0 -1 # 输出 2 3 4 5
LLEN feed # 4
# 只留最近 100 条的标准写法:
LPUSH recent:search 关键词
LTRIM recent:search 0 99
LLEN recent:search # 恒定为 100 以内区间写法对照
| 写法 | 结果 | 说明 |
|---|---|---|
| 0 99 | 保留前 100 个元素 | 配合 LPUSH 即「最近 100 条」 |
| 1 -1 | 删除第 0 个元素 | 常用于丢掉刚写入的占位项 |
| 0 -1 | 全量保留,等于不裁剪 | 常见于误写,注意区分 |
| 5 2 | 整表清空 | start 大于 stop 时结果为空列表 |
LPUSH 与 LTRIM 是两条命令,并发写入时列表长度可能瞬时超过 N(先接受再裁剪),只要最终收敛就不影响业务。
需要严格的定长窗口且要求原子,可以把写入与裁剪写进同一个 Lua 脚本,避免瞬时超长。
使用前确认三件事
- 确认保留方向:列表头部是最新还是最旧,取决于用 LPUSH 还是 RPUSH 写入
- 确认窗口大小:把 N 写成常量而不是散落在多处,避免读写两端不一致
- 确认元素体积:裁剪只控数量不控体积,单元素很大时仍会占用大量内存