1 · 场景与价值

在日志累加、指标采集、消息追踪等场景中,我们常需快速判断某个字符串字段“到底有多长”,以便:

  • 阻止过大日志:若长度超限则截断或归档;
  • 动态分桶:按长度选择不同存储策略;
  • 性能监控:突然飙长可能暗示异常循环或恶意输入。

有了 JSON.STRLEN,无需把整段内容取回客户端,也无需额外存副本,即可 O(1) 地获取字段长度。

2 · 指令概览

指令作用复杂度
JSON.STRLEN key [path]返回指定路径 JSON 字符串的长度O(1)(单路径) / O(N)(多路径,与键大小相关)
  • 可用版本:RedisJSON ≥ 1.0
  • ACL 标签@json @read @slow
  • 默认路径$(根)

3 · 语法参数

JSON.STRLEN <key> [<path>]
参数必填说明
key目标键名
pathJSONPath,缺省为 $

返回值

  • 若匹配为字符串:返回其长度(整型)。
  • 若路径不存在 / 类型非字符串:返回 nil
  • 多路径:递归数组,顺序对应各匹配点。

4 · 基本示例

redis> JSON.SET doc $ '{"a":"foo","nested":{"a":"hello"},"nested2":{"a":31}}'
OK# 多路径统计
redis> JSON.STRLEN doc $..a
1) (integer) 3     # $.a -> "foo"
2) (integer) 5     # $.nested.a -> "hello"
3) (nil)           # $.nested2.a 不是字符串

5 · 常见用法场景

5.1 日志超长保护

> len=$(redis-cli JSON.STRLEN log:123 $.trace)
> if [ "$len" -gt 2048 ]; then
>   redis-cli JSON.SET log:123 $.trace '"<truncated>"'
> fi

5.2 统计动态字段占用

# 查看所有用户简介 bio 的平均长度
redis-cli --raw KEYS "user:*" | while read k; doredis-cli JSON.STRLEN $k $.bio
done | awk '{s+=$1;c++} END{print s/c}'

6 · 踩坑与注意

症状解决方案
路径非字符串返回 nil,误以为不存在JSON.TYPE 或保证字段类型一致
多路径扫描过大文档延迟抖动精准路径,避免 $..field
空键 / 空路径直接 nil先用 EXISTSJSON.TYPE 判断
把数组当字符串长度不是元素数STRLEN 只算字节数,不是元素数,数组用 JSON.ARRLEN

7 · Go-Redis 完整示例

package mainimport ("context""fmt""log""github.com/redis/go-redis/v9"
)func main() {ctx := context.Background()rdb := redis.NewClient(&redis.Options{Addr: "localhost:6379"})defer rdb.Close()// 初始化测试文档_, err := rdb.Do(ctx, "JSON.SET", "msg:1", "$",`{"body":"hello world","meta":{"note":"short"}}`).Result()if err != nil { log.Fatal(err) }// 1️⃣ 单路径长度len1, _ := rdb.Do(ctx, "JSON.STRLEN", "msg:1", "$.body").Int64()fmt.Println("body len =", len1) // 11// 2️⃣ 多路径长度res, _ := rdb.Do(ctx, "JSON.STRLEN", "msg:1", "$..note").Slice()fmt.Println("meta.note len =", res[0]) // 5// 3️⃣ 类型不符示例_, _ = rdb.Do(ctx, "JSON.SET", "msg:1", "$.count", 100)res2, _ := rdb.Do(ctx, "JSON.STRLEN", "msg:1", "$.count").Slice()fmt.Printf("count -> %#v\n", res2[0]) // <nil>
}

8 · 性能建议

  1. 批量调用使用 Pipeline

    pipe := rdb.Pipeline()
    keys := []string{"user:1", "user:2", "user:3"}
    for _, k := range keys {pipe.Do(ctx, "JSON.STRLEN", k, "$.bio")
    }
    _, _ = pipe.Exec(ctx)
    
  2. 监控慢查询
    复杂 JSON + 多路径 ($..field) 会触发 SLOWLOG,需关注。

  3. 字符串膨胀预警
    可用 MEMORY USAGE key + JSON.STRLEN 建立长度阈值报警。

9 · 与其它指令的协同

需求组合说明
追加后检测JSON.STRAPPENDJSON.STRLEN先写后查,防止长度爆表
长度分片JSON.STRLEN + JSON.SET达阈值切换到新字段
类型校验JSON.TYPE + JSON.STRLEN防止对非字符串统计

10 · 总结

  • JSON.STRLEN 提供 O(1) 字段级长度统计,是日志与配额场景的利器。
  • 返回值为整型或 nil,多路径时请按序处理。
  • 精准路径 ≫ 通配路径,能显著降低 O(N) 扫描成本。
  • 在 Go-Redis 中用 Do() 一行即可调用,并能与 Pipeline/事务无缝整合。

至此,字符串家族三兄弟 STRLEN / STRAPPEND / SET 已全部集齐。灵活运用它们,你的 RedisJSON 文档读写将更加高效、细粒度且安全。祝编码愉快,欢迎留言交流实践体会!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89931.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89931.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89931.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据量查询计算引发数据库CPU告警问题复盘

大数据量查询计算引发数据库CPU告警问题复盘一、背景二、根因分析三、解决方案方案1&#xff1a;多线程缓存方案2&#xff1a;利用中间表缓存四、总结一、背景 2025年7月份某天&#xff0c;CDP系统每天不定时推送我们的Portal服务&#xff0c;生产环境运营看板会展示统计数据&…

2025最新版虚幻引擎5(UE5)C++入门教程:前言——你的随身教程和学习笔记

大家好&#xff0c;我是开发游戏的老王&#xff0c;一名高校教师&#xff0c;我主讲游戏开发已有十余年时间&#xff0c;通过我的博客大家应该可以了解我所涉猎的游戏技术范畴非常广泛&#xff0c;除了Unreal,Unity,Godot等主流游戏引擎&#xff0c;还包括Blender、Houdini、3D…

(3)重定向 | 时间相关指令 | 文件查找 | 打包与压缩

Ⅰ . 初始重定向01 输出重定向 >在上一节中我们为了方便讲解 head 和 tail 指令&#xff0c;我们用到了 > 去生成了一千行文本。通过 > 将生成的一千行文本写入到了 large.txt 中……我们现在来正式介绍一下&#xff1a;$ echo "内容" > [目标] 本来应…

DTH11测量温湿度学习(第十一天)

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-削好皮的Pineapple! &#x1f468;‍&#x1f4bb; hello 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 削好皮的Pineapple! 原创 &#x1f468;‍&#x1f4…

Go语言初识--标识符 可见性

Go语言初识–标识符 可见性 和C语言相似&#xff0c;go语言的基本组成有&#xff1a; 包声明&#xff0c;编写源文件时&#xff0c;必须在非注释的第一行指明这个文件属于哪个包&#xff0c;如package main。引入包&#xff0c;其实就是告诉Go 编译器这个程序需要使用的包&…

Python实例之画小猪佩奇

效果图&#xff1a;python代码以及解释&#xff0c;没有运用模块。 """ 绘制小猪佩奇 """ from turtle import *def nose(x,y):"""画鼻子"""penup()# 将海龟移动到指定的坐标goto(x,y)pendown()# 设置海龟的方向&…

Unity笔记——事件中心

事件中心是什么事件中心是 Unity 游戏开发中常用的架构设计&#xff0c;它基于观察者模式 或 发布-订阅模式&#xff0c;通过委托和事件构建的一种消息管理系统。主要用于降低代码耦合度&#xff0c;实现模块间的松耦合通信的消息处理系统能大幅提升代码的可维护性和扩展性&…

Java: 反射机制的 ParameterizedType(参数化类型)

在 Java 中&#xff0c;ParameterizedType 是 java.lang.reflect 包下的一个接口&#xff0c;属于反射 API 的一部分&#xff0c;主要用于表示参数化类型&#xff08;即带有类型参数的泛型类型&#xff09;。它是 Java 反射机制中处理泛型类型信息的关键接口之一。 一、什么是参…

OkHttp 与 Retrofit 完美结合:打造高效的 Android 网络请求

前言在现代 Android 开发中&#xff0c;网络请求是几乎每个应用都必不可少的功能。OkHttp 和 Retrofit 作为当前最流行的网络请求库组合&#xff0c;为开发者提供了简洁高效的解决方案。本文将详细介绍如何将这两者结合使用&#xff0c;充分发挥它们的优势。一、OkHttp 和 Retr…

系统辨识建模

系统辨识建模 一、系统辨识建模的作用 1. 建立真实物理系统的数学模型 2. 为后续控制器/强化学习算法提供仿真环境 3. 提高控制精度和安全性 二、本文的系统辨识是怎么做的 1. 实验采集 2. 数学建模 3. 在控制系统中的作用 三、实际用法流程(简化版) 1. 系统辨识阶段 2. 强化…

Android开发:Java与Kotlin深度对比

1. 语言特性与现代性 Java (特别是 Android 主要使用的 Java 8 及之前版本): 相对冗长&#xff1a; 需要编写更多的样板代码&#xff08;如 getter/setter、findViewById 的显式类型转换、匿名内部类等&#xff09;。空指针异常 (NPE)&#xff1a; 类型系统默认允许 null&#…

米家打印机驱动:Wi-Fi 无线打印丝滑顺畅不卡顿,从此告别对打印机干瞪眼

各位小米家居控们&#xff0c;你们有没有过这种经历&#xff0c;新买的打印机回家&#xff0c;结果电脑跟它像俩傲娇的小情侣&#xff0c;死活不搭话&#xff1f;急得你想当场表演一个“打印机抱头痛哭”&#xff1f;别急&#xff0c;今天就给你们安利个神队友——米家打印机驱…

日语学习-日语知识点小记-构建基础-JLPT-N3阶段(7):自動詞 & 他動詞

日语学习-日语知识点小记-构建基础-JLPT-N3阶段&#xff08;7&#xff09;&#xff1a;自動詞 &#xff06; 他動詞1、前言&#xff08;1&#xff09;情况说明&#xff08;2&#xff09;工程师的信仰2、知识点&#xff08;&#xff11;&#xff09;自動詞 &#xff06; 他動…

深入理解设计模式:访问者模式详解

在软件开发中&#xff0c;我们经常会遇到需要对一个复杂对象结构进行操作的情况。随着需求的不断变化&#xff0c;我们可能需要在这个对象结构上添加各种新的操作。如果直接在对象结构中添加这些操作&#xff0c;会导致类的职责过重&#xff0c;且每次添加新操作都需要修改原有…

Linux timerfd 定时器封装

使用 timerfd epoll() 实现&#xff0c;简洁精确。没定义 MU_ERROR 宏的话替换为 printf 即可。mu_timer.h:#ifndef _MU_TIMER_H_ #define _MU_TIMER_H_#ifdef __cplusplus extern "C" { #endif#include <stdint.h> #include <time.h> #include <pth…

【样式效果】Vue3实现仿制iOS按钮动态效果

iOS开关效果定义变量&#xff1a; <style scoped lang"scss">.layout {// 按钮宽度$button-width: 500px;// 按钮高度$button-height: 250px;// 按钮里面圆形直径$circle-diameter: 200px;// 按钮背景与里面圆形间距$button-circle-offset:calc(($button-he…

京东疯狂投资具身智能:众擎机器人+千寻智能+逐际动力 | AI早报

每日分享全球最新AI资讯【应用商业八卦技术】&#xff0c;&#x1f30f;&#xff1a;未来世界2099应用 1、马斯克推出儿童AI"Baby Grok"引热议&#xff1a;安全性能否经受考验&#xff1f; 2、蚂蚁AQ健康应用霸榜苹果商店&#xff0c;或将联手Apple Watch打造智能健康…

Jiasou TideFlow AIGC SEO Agent:全自动外链构建技术重构智能营销新标准

AI时代SEO技术革命&#xff1a;企业如何突破流量增长瓶颈&#xff1f;随着Google算法升级至MUM模型&#xff0c;传统SEO工具已难以应对多模态内容优化需求。在搜索引擎日均处理120亿次查询的生态中&#xff0c;企业官网平均自然流量转化周期长达6-8个月&#xff0c;因此诸如Jia…

Docker-compose:服务编排

Docker-compose 介绍 服务编排:按照一定的业务规则批量管理容器 在微服务架构的应用系统中,一般包含 N 个微服务,且每个微服务一般都会部署多个实例。此时,如果每个微服务都要手动启停,维护的工作量会很大。 要从 Dockerfile build image 或者去 docker hub 拉取 image …

异地服务器备份Mysql数据

前言异地服务器备份Mysql数据即Mysql的server端与备份服务器不是同一个。Mysql服务端安装在192.168.3.36中&#xff0c;现在需要在IP为192.168.209.129的服务器中使用mysqldump命令备份指定数据库数据;192.168.209.129没有装过Mysql客户端;1.安装Mysql客户端不安装Mysql客户端就…