Redis命令:LTRIM

发布时间:2026/10/18 6:56:39
Redis命令:LTRIM
Redis LTRIM 命令详细教程LTRIM裁剪列表只保留指定索引区间 [start, stop] 内的元素区间之外的元素被删除。区间语义与 LRANGE 完全一致0 基、闭区间含 stop、支持负索引、越界钳制不报错。它从 Redis 1.0.0 起提供与 LPUSH 搭配组成的限长列表是 Redis 最经典的固定长度写法。资料合集https://pan.quark.cn/s/10e98d308913、https://pan.quark.cn/s/f56bc69c5338一、概览与语法LTRIM key start stop项目说明数据类型List支持版本Redis 1.0.0 起key目标列表 Keystart保留区间的起始索引0 基可为负数stop保留区间的结束索引闭区间包含该索引可为负数返回值简单字符串 OK时间复杂度O(N)N 为被移除的元素个数ACLwrite、list、slow命令标记write、denyoom官方说明裁剪一个已存在的列表使其只保留指定区间的元素。start 与 stop 都是 0 基索引负偏移从表尾倒数区间外的元素将被移除。$TRAE_REF二、基础示例以下命令在测试实例的 redis-cli 中执行。文中结果是预期说明未实际连接 Redis 运行。示例沿用官方文档的数据与结果。DEL tutorial:{ltrim}:mylist RPUSH tutorial:{ltrim}:mylist one two three LTRIM tutorial:{ltrim}:mylist 1 -1 LRANGE tutorial:{ltrim}:mylist 0 -1预期结果LTRIM返回OKLRANGE返回two、three表头的 one 被裁掉只保留索引 1 到末尾的元素。三、区间语义详解LTRIM 的区间规则与 LRANGE 完全一致可以互相换算0 基索引表头是 0不是 1。闭区间stop 被包含LTRIM key 0 2保留 3 个元素。负索引-1 是表尾LTRIM key -10 -1只保留最后 10 个元素。stop 越界钳制stop 超过列表末尾时按最后一个元素处理不报错。DEL tutorial:{ltrim}:ex RPUSH tutorial:{ltrim}:ex a b c d e LTRIM tutorial:{ltrim}:ex 1 3 LRANGE tutorial:{ltrim}:ex 0 -1 LTRIM tutorial:{ltrim}:ex -2 -1 LRANGE tutorial:{ltrim}:ex 0 -1 LTRIM tutorial:{ltrim}:ex 0 100 LRANGE tutorial:{ltrim}:ex 0 -1预期结果初始 5 个元素LTRIM 1 3保留索引 1 到 3返回OK剩b、c、dLTRIM -2 -1只保留最后两个剩c、dLTRIM 0 100的 stop 被钳制到表尾列表不变仍为c、d。四、裁剪为空与 Key 删除当 start 超出列表末尾或 start 大于 stop 时保留区间与列表没有任何交集结果为空列表。与 LRANGE 返回空数组不同LTRIM 会真的把元素删光——空列表在 Redis 中不存在因此 Key 会被删除。DEL tutorial:{ltrim}:ex RPUSH tutorial:{ltrim}:ex a b c LTRIM tutorial:{ltrim}:ex 2 1 EXISTS tutorial:{ltrim}:ex预期结果初始a、b、cLTRIM 2 1的 start 大于 stop仍返回OK列表被裁空空列表不存在EXISTS返回0Key 已被删除。五、Key 不存在与类型行为Key 不存在时LTRIM返回OK但不做任何事也不创建 Key——这一点与LSET报ERR no such key形成鲜明对比。上一节裁空后 ex 已不存在直接对它验证LTRIM tutorial:{ltrim}:ex 0 2 EXISTS tutorial:{ltrim}:ex SET tutorial:{ltrim}:str text LTRIM tutorial:{ltrim}:str 0 1预期结果第一条对不存在的 Key 返回OK静默无操作EXISTS返回0确认没有创建 Key对 String 类型执行LTRIM报 WRONGTYPE。六、限长列表模式LPUSH写入 LTRIM裁剪是 Redis 经典的固定长度列表写法新元素从表头进入裁剪保留前 N 个旧数据从表尾淘汰。例如保留最新 100 条LPUSH tutorial:{ltrim}:feed item1 item2 item3 item4 item5 LTRIM tutorial:{ltrim}:feed 0 2 LRANGE tutorial:{ltrim}:feed 0 -1预期结果写入 5 个元素后LTRIM feed 0 2只保留最新 3 条返回OKLRANGE返回item5、item4、item3最早的 item1、item2 被淘汰。生产环境把 2 换成 99即是保留最新 100 条的标准实现。七、与相近命令的区别命令操作方式定位方式说明LTRIM按区间保留索引区间外的元素被删除返回 OKLRANGE按区间读取索引区间语义完全一致但只读不改LREM按值删除值删除匹配元素与位置无关LPOP / RPOP按位置弹出索引端点每次弹出一个元素并返回它DEL整 Key 删除无连 Key 带数据全部删除LTRIM 与 LRANGE 是“同区间规则、一写一读”的搭档LTRIM key 0 -1保留全部等于没裁LTRIM key 1 0则等价于清空并删除 Key。八、边界情况与错误处理场景行为Key 不存在返回 OK不做任何事不创建 Keystart 大于 stop裁成空列表Key 被删除start 超出列表末尾裁成空列表Key 被删除stop 超出列表末尾钳制到最后一个元素Key 类型不是 List报 WRONGTYPE缺少 start 或 stop报语法错误注意LTRIM恒返回OK即使实际什么都没保留裁剪结果是否符合预期需要用LLEN或LRANGE验证不能只看返回值。九、客户端示例前提为已安装 redis-py 并准备好本地测试实例。redis-py 的ltrim(name, start, end)成功返回 True。importredis rredis.Redis(hostlocalhost,port6379,decode_responsesTrue)keytutorial:{ltrim}:pytry:r.delete(key)r.rpush(key,a,b,c,d,e)print(r.ltrim(key,0,2))# True保留前 3 个print(r.lrange(key,0,-1))# [a, b, c]print(r.ltrim(key,-2,-1))# True只留最后两个print(r.lrange(key,0,-1))# [b, c]print(r.ltrim(key,3,1))# Truestart 越界裁空并删除 Keyprint(r.exists(key))# 0finally:r.delete(key)r.close()JavaJedis示例ltrim返回OKtry(JedisjedisnewJedis(localhost,6379)){Stringkeytutorial:{ltrim}:java;jedis.del(key);jedis.rpush(key,a,b,c,d,e);System.out.println(jedis.ltrim(key,1,-1));// OK去掉表头 aSystem.out.println(jedis.lrange(key,0,-1));// [b, c, d, e]System.out.println(jedis.ltrim(key,0,99));// OKstop 越界被钳制列表不变System.out.println(jedis.llen(key));// 4jedis.del(key);}十、原子性与性能复杂度O(N)N 为被移除的元素个数与列表总长无关只删几个元素时非常快。原子性单条LTRIM原子执行但 LPUSH LTRIM 是两条命令中间其他客户端的写入可能使列表暂时超过上限最终仍会收敛要求严格上限时把两条命令放进 MULTI/EXEC 或 Lua 脚本执行。高频写入配合管道批量执行可显著降低往返开销。误操作风险LTRIM key 1 0这类笔误会直接清空并删除 Key且返回 OK 不报错务必核对区间参数。十一、典型业务场景最新动态 FeedLPUSH发布 LTRIM feed 0 99每个用户的 Feed 恒定保留最新 100 条。浏览历史限长记录用户最近浏览的商品LTRIM history 0 49只保留 50 条。任务队列堆积上限对允许丢弃的低优先级队列执行LTRIM queue 0 999防止无限堆积。滑动窗口窗口内的事件列表配合 LTRIM 维护窗口大小读取端用LRANGE key 0 -1取全窗数据。十二、练习、排错与总结练习新建tutorial:{ltrim}:ex用 RPUSH 写入a b c d e执行LTRIM ex 1 3确认剩b c d闭区间含 stopLTRIM ex -2 -1剩c dLTRIM ex 0 99列表不变LTRIM ex 4 2返回OK且EXISTS为0Key 被删除对不存在的 Key 执行LTRIM返回OK且不创建 Key对 String Key 执行报 WRONGTYPE。排错要点元素个数比预期多 1 时检查是否把闭区间当成了“含头不含尾”Key 意外消失通常是 start 大于 stop 或 start 超出末尾导致裁空删除返回 OK 但数据没变说明区间覆盖了整个列表报 WRONGTYPE 时用 TYPE 检查类型LPUSHLTRIM 并发下短暂超限时用事务或 Lua 收紧。清理使用DEL tutorial:{ltrim}:mylist tutorial:{ltrim}:feed tutorial:{ltrim}:ex tutorial:{ltrim}:str tutorial:{ltrim}:py tutorial:{ltrim}:java。速记1.0 起支持、按区间保留区间外全删、区间规则同 LRANGE0 基闭区间负索引钳制、恒返回 OK、Key 不存在静默 OK 不创建、裁成空列表会删除 Key、与 LPUSH 组成限长列表、结果用 LLEN/LRANGE 验证、O(N) 只与删除量相关。