首页/数据/数据库速查/LTRIM 裁剪列表(固定长度场景)
Redis 命令96 条

LTRIM 裁剪列表(固定长度场景)

只保留指定区间,其余全删;配合 LPUSH + LTRIM 0 N-1 可维护「只留最近 N 条」的时间线/日志。

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

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 写成常量而不是散落在多处,避免读写两端不一致
  • 确认元素体积:裁剪只控数量不控体积,单元素很大时仍会占用大量内存

易错点

  • 把区间写反(start 大于 stop):列表直接被清空,业务数据不可恢复
  • 把 LRANGE 分页展示与 LTRIM 混用同一个键:裁剪会让下标漂移,翻页出现重复或缺失
  • 裁剪区间用正索引写死但列表长度不足:保留范围落在不存在的元素上,结果与预期不符
  • 以为 LTRIM 会保留 stop 之后的元素:区间外一律删除,包括尾部

数据来源与参考

  • Redis 官方文档: LTRIM

相关工具

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