资讯详情

Redis命令:LSET

📅 2026/10/19 2:07:58 | 华诺云谱 👁 阅读
Redis命令:LSET
Redis LSET 命令详细教程LSET将列表指定索引位置的元素覆盖为新值列表长度保持不变是按位置改写元素的基础命令。索引规则与 LRANGE 一致0 基且支持负索引从表尾倒数。它从 Redis 1.0.0 起提供注意它不会自动创建 Key索引越界与 Key 不存在都会直接报错。资料合集https://pan.quark.cn/s/10e98d308913、https://pan.quark.cn/s/f56bc69c5338一、概览与语法LSET key index element项目说明数据类型List支持版本Redis 1.0.0 起key目标列表 Keyindex目标位置索引0 基可为负数-1 表示最后一个元素element覆盖后的新值返回值简单字符串 OK时间复杂度O(N)N 为列表长度设置表头或表尾元素为 O(1)ACLwrite、list、slow命令标记write、denyoom官方说明将列表 index 位置的元素设置为 element。索引超出范围或 Key 不存在时返回错误。$TRAE_REF二、基础示例以下命令在测试实例的 redis-cli 中执行。文中结果是预期说明未实际连接 Redis 运行。示例沿用官方文档的数据与结果。DEL tutorial:{lset}:mylist RPUSH tutorial:{lset}:mylist one two three LSET tutorial:{lset}:mylist 0 four LRANGE tutorial:{lset}:mylist 0 -1预期结果LSET返回OKLRANGE返回four、two、three索引 0 的 one 被覆盖为 four列表长度仍为 3。三、索引规则LSET 与 LRANGE 使用同一套索引约定0 基索引表头元素是 0不是 1。负索引-1 是最后一个元素-2 是倒数第二个以此类推。长度不变LSET 只做覆盖不插入也不删除执行前后 LLEN 相同。首尾最快索引 0 与 -1 直接定位端点复杂度 O(1)中间位置需要从表头或表尾走到目标。LSET tutorial:{lset}:mylist -1 six LRANGE tutorial:{lset}:mylist 0 -1 LLEN tutorial:{lset}:mylist预期结果LSET返回OK列表变为four、two、sixLLEN返回3长度未变。四、越界与 Key 不存在LSET有两类专属错误需要单独留意索引越界对非空列表执行时index 必须落在[0, LLEN-1]区间内或是有合法负索引否则报ERR index out of range。Key 不存在LSET不会像 LPUSH 那样自动创建 Key对不存在的 Key 执行报ERR no such key。LSET tutorial:{lset}:nokey 0 x EXISTS tutorial:{lset}:nokey LSET tutorial:{lset}:mylist 5 x预期结果第一条报ERR no such keyEXISTS返回0确认 LSET 没有创建 Key第三条对长度 3 的列表设置索引 5报ERR index out of range。示例中的 nokey 从未被成功创建无需清理。五、返回值说明成功时LSET恒返回简单字符串OK失败时直接报错没有“部分成功”的中间态。由于成功与失败都是明确结果客户端可以依据返回值可靠判断但不能用 LSET 给不存在的 Key 建表这是它与 LPUSH/RPUSH 的本质差异。结果返回覆盖成功OKKey 不存在ERR no such key索引越界ERR index out of rangeKey 类型不是 ListWRONGTYPEERR no such key ERR index out of range WRONGTYPE Operation against a key holding the wrong kind of value六、边界情况与错误处理场景行为Key 不存在报 ERR no such key不创建 Key索引越界超出长度或非法负索引报 ERR index out of rangeKey 类型不是 List报 WRONGTYPEelement 为空字符串允许正常覆盖缺少 index 或 element报语法错误空列表列表非空才存在实际不会遇到Key 不存在走 no such keySET tutorial:{lset}:str text LSET tutorial:{lset}:str 0 a预期结果对 String 类型执行报 WRONGTYPE类型检查先于索引定位。七、与相近命令的区别命令操作方式列表长度说明LSET按索引覆盖不变只改写指定位置的值LINSERT按值邻位插入加 1在锚点元素前后插入不改锚点LPOS按值查索引不变返回匹配元素的索引常与 LSET 组合LREM按值删除变短删除匹配元素LPUSH / RPUSH两端追加加 1可对不存在的 Key 自动创建列表“查找替换”组合先LPOS key element拿到索引再LSET key index newValue即可按值精准覆盖不影响其他元素。八、客户端示例前提为已安装 redis-py 并准备好本地测试实例。redis-py 的lset(name, index, value)成功返回 True失败抛出 ResponseError。importredis rredis.Redis(hostlocalhost,port6379,decode_responsesTrue)keytutorial:{lset}:pytry:r.delete(key)r.rpush(key,one,two,three)print(r.lset(key,0,four))# Trueprint(r.lrange(key,0,-1))# [four, two, three]print(r.lset(key,-1,six))# True负索引覆盖表尾print(r.lrange(key,0,-1))# [four, two, six]try:r.lset(key,5,x)# 索引越界exceptredis.exceptions.ResponseErrorase:print(e)# index out of rangefinally:r.delete(key)r.close()JavaJedis示例lset返回OK错误情形抛出 JedisDataExceptiontry(JedisjedisnewJedis(localhost,6379)){Stringkeytutorial:{lset}:java;jedis.del(key);jedis.rpush(key,one,two,three);System.out.println(jedis.lset(key,1,TWO));// OKSystem.out.println(jedis.lrange(key,0,-1));// [one, TWO, three]try{jedis.lset(tutorial:{lset}:nokey,0,x);}catch(redis.clients.jedis.exceptions.JedisDataExceptione){System.out.println(e.getMessage());// ERR no such key}jedis.del(key);}九、原子性与并发安全单命令原子LSET本身原子执行并发客户端同时改写同一索引时最后执行者获胜不会出现半写状态。读改写组合非原子典型模式“LINDEX 读出旧值、业务判断、LSET 写回新值”由三步组成整体不具备原子性并发下可能覆盖他人刚写入的修改丢失更新。解决方案需要“读取-判断-写回”一致语义时用 WATCH/MULTI/EXEC 乐观锁或把整段逻辑放进 Lua 脚本执行。性能中间位置的定位是 O(N)大列表上高频改写中间元素有开销若热点更新集中且顺序无业务意义考虑改用 Hash 按字段更新。十、典型业务场景状态回写任务列表中某个任务完成后用LSET key idx new-status把对应元素替换为带新状态的值。轮播与推荐位以 List 维护坑位顺序运营调整某个坑位内容时按索引覆盖。按值精准替换LPOS查索引 LSET覆盖实现“把元素 a 替换为 b”而不动其他元素。修复脏数据列表某位置的值写错时直接按索引改写避免删了重插破坏原有顺序。十一、练习、排错与总结练习新建tutorial:{lset}:ex用 RPUSH 写入a b c执行LSET ex 1 B返回OK且列表变为a B c执行LSET ex -1 C返回OK且列表变为a B CLLEN仍为3执行LSET ex 3 x报ERR index out of range对不存在的 Key 执行LSET报ERR no such key且EXISTS为0对 String Key 执行报 WRONGTYPE。排错要点报 no such key 时确认是否误以为 LSET 会建 Key应先 RPUSH/LPUSH 再改写报 index out of range 时先用 LLEN 核对长度注意负索引最小只到 -LLEN值没变检查是否改错了索引0 基报 WRONGTYPE 时用 TYPE 检查类型并发覆盖问题用 WATCH 或 Lua 包裹读改写流程。清理使用DEL tutorial:{lset}:mylist tutorial:{lset}:ex tutorial:{lset}:str tutorial:{lset}:py tutorial:{lset}:java示例中的 nokey 从未被创建无需清理。速记1.0 起支持、按索引覆盖长度不变、返回 OK、不创建 Key、Key 不存在与索引越界都报错、首尾 O(1) 中间 O(N)、与 LPOS 组合实现查找替换、读改写组合需自行保证原子性。
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑