Redis命令:HSTRLEN Redis HSTRLEN 命令详细教程HSTRLEN返回 Hash 中指定字段值的字符串长度单位是字节。它从 Redis 3.2.0 起提供时间复杂度 O(1)不需要传输字段值本身。资料合集https://pan.quark.cn/s/10e98d308913、https://pan.quark.cn/s/f56bc69c5338一、概览与语法HSTRLEN key field项目说明数据类型Hash支持版本Redis 3.2.0 起keyHash 的 Keyfield一个字段名不支持通配符返回值整数字段值的字节长度字段或 Key 不存在时返回 0时间复杂度O(1)ACLread、hash、fast命令标记readonly、fast官方说明返回字段值的字符串长度如果 Key 或字段不存在返回 0。$TRAE_REF二、基础示例以下命令需要 Redis 3.2 或更新版本在测试实例的 redis-cli 中执行。文中结果是预期说明未实际连接 Redis 运行。示例沿用官方示例的数据。DEL tutorial:{hstrlen}:myhash HSET tutorial:{hstrlen}:myhash f1 HelloWorld f2 99 f3 -256 HSTRLEN tutorial:{hstrlen}:myhash f1 HSTRLEN tutorial:{hstrlen}:myhash f2 HSTRLEN tutorial:{hstrlen}:myhash f3 HSTRLEN tutorial:{hstrlen}:myhash absent HSTRLEN tutorial:{hstrlen}:missing f1预期结果HSET 返回3HSTRLEN 对 f1 返回10对 f2 返回2对 f3 返回4含负号。对不存在的字段返回0对不存在的 Key 也返回0。注意99的长度是 2-256的长度是 4。HSTRLEN 统计的是字符个数按字节不是数值大小。三、长度单位是字节不是字符Redis 字符串是二进制安全的长度按字节计算。对于 ASCII 文本字节数等于字符数对于中文等多字节字符一个汉字在 UTF-8 下占 3 个字节。值HSTRLEN说明abc3ASCII1 字节 1 字符你好6UTF-8 下每个汉字 3 字节é2UTF-8 下为 2 字节992数字文本同样按字符计0空字符串长度为 0DEL tutorial:{hstrlen}:text HSET tutorial:{hstrlen}:text en abc zh 你好 empty HSTRLEN tutorial:{hstrlen}:text en HSTRLEN tutorial:{hstrlen}:text zh HSTRLEN tutorial:{hstrlen}:text empty预期结果en 返回3zh 返回6empty 返回0。空字符串长度为 0与“字段不存在返回 0”结果相同这是本命令最需要注意的地方单看返回值无法区分“字段存在但内容为空”和“字段不存在”。需要区分时配合 HEXISTS状态HSTRLENHEXISTSHGET字段不存在00空值字段存在值为01空字符串字段存在值为abc31abc四、与相近命令的区别命令作用对象返回内容复杂度HSTRLENHash 字段值字节长度O(1)STRLENString Key字节长度O(1)HLENHash字段数量O(1)HGETHash 字段值本身O(1)HEXISTSHash 字段是否存在O(1)HSTRLEN 与 STRLEN 容易混淆前者作用于 Hash 的某个字段后者作用于 String 类型的整个 Key。HSTRLEN 与 HLEN 也容易混淆前者是“某个值的长度”后者是“字段的个数”。五、错误与边界情况场景行为Key 不存在返回 0字段不存在返回 0字段值为空字符串返回 0与字段不存在结果相同Key 是 String、List 等非 Hash报 WRONGTYPE 错误参数个数不对报语法错误HSTRLEN 只接受 key 与 field字段名大小写不同视为不同字段SET tutorial:{hstrlen}:wrong text HSTRLEN tutorial:{hstrlen}:wrong f1上述命令会报 WRONGTYPE而不是返回 0。需要注意类型错误是异常字段不存在是正常返回 0两者不应混为一谈。六、典型场景与性能HSTRLEN 的核心价值在于“只取长度不取内容”。当字段值很大而业务只关心大小时它能避免把整个值传输到客户端节省带宽与客户端内存。场景说明校验写入长度写入后确认是否超过限制监控值膨胀定期检查大字段的长度变化估算内存占用结合字段数量评估 Hash 规模判断是否为空配合 HEXISTS 区分空值与缺失避免传输大值只关心长度时不必 HGET 全量复杂度为 O(1)因为 Redis 内部记录了字符串长度无需遍历内容。它是fast命令可以安全地用于线上高频调用。七、客户端示例前提为已安装 redis-py 并准备好本地测试实例。importredis rredis.Redis(hostlocalhost,port6379,decode_responsesTrue)ktutorial:{hstrlen}:pythontry:r.delete(k)r.hset(k,mapping{en:abc,zh:你好,empty:})print(r.hstrlen(k,en))# 3print(r.hstrlen(k,zh))# 6UTF-8 每个汉字 3 字节print(r.hstrlen(k,empty))# 0print(r.hstrlen(k,absent))# 0# 区分空值与缺失fornamein(empty,absent):print(name,r.hstrlen(k,name),r.hexists(k,name))# empty 0 True# absent 0 Falsefinally:r.delete(k)r.close()JavaJedis示例try(JedisjedisnewJedis(localhost,6379)){jedis.hset(tutorial:{hstrlen}:java,f1,HelloWorld);System.out.println(jedis.hstrlen(tutorial:{hstrlen}:java,f1));// 10System.out.println(jedis.hstrlen(tutorial:{hstrlen}:java,absent));// 0jedis.del(tutorial:{hstrlen}:java);}八、TTL 与并发说明HSTRLEN 是只读命令不会刷新字段或 Key 的 TTL。在 Redis 7.4 及以后字段可以单独设置过期时间字段到期后 HSTRLEN 返回 0与字段从未存在表现一致需要区分时可配合 HTTL 或 HEXISTS。单条 HSTRLEN 是原子的返回执行瞬间的长度快照。但“先 HSTRLEN 判断长度再决定是否写入”是跨命令流程两次调用之间其他客户端可能已修改该字段。需要严格限制长度时应在 Lua 脚本中完成判断与写入。九、练习、排错与总结练习新建tutorial:{hstrlen}:exercise写入 asciihello、cjk你好世界、empty分别执行 HSTRLEN预期为5、12、0查询不存在的字段预期为0用 HEXISTS 区分 empty 与不存在的字段确认两者 HEXISTS 分别为 1 和 0。排错要点返回 0 时用 HEXISTS 区分空字符串与字段缺失中文长度大于预期说明按字节计算业务需要字符数时应自行按 UTF-8 解码后计数报 WRONGTYPE 时用 TYPE 检查类型长度与 HLEN 混淆时注意前者是值长度、后者是字段个数unknown command 时确认服务端版本不低于 3.2。清理使用DEL tutorial:{hstrlen}:myhash tutorial:{hstrlen}:text tutorial:{hstrlen}:wrong tutorial:{hstrlen}:exercise。速记3.2 起支持、O(1) 只返回长度、单位是字节、缺失与空值都返回 0、需配合 HEXISTS 区分。