RedisJSON 技术揭秘`JSON.GET` 一条命令,任取任出的「万能读取器」

1、指令速查

JSON.GET <key> [INDENT indent] [NEWLINE newline] [SPACE space] [path ...]
参数说明
keyRedis 键名
path0-N 个 JSONPath,缺省 $ 根;支持 ..[*]、筛选等
INDENT缩进字符(如 "\t"" "
NEWLINE行尾字符(如 "\n""\r\n"
SPACEkey:value 间空格字符

返回值

  • 1 条路径 → JSON 数组(字符串表示) ,内含所有匹配值
  • 多条路径 → JSON 对象,每条路径对应一个值数组
  • 路径不存在 → 空数组 / 空对象

⚠️ Legacy vs. JSONPath
老版「点路径」(如 ..a)若单独出现,会返回单值;一旦与 JSONPath 混用,全部路径都按「数组」语义返回。上新项目直接统一用 JSONPath,可避免兼容困扰。

时间复杂度

  • 单路径 → O(N),N 为目标值大小
  • 多路径 → O(N × 路径数)

2、格式化输出三件套

redis-cli 中,默认输出是一整行 JSON 字符串;阅读大型文档相当痛苦。加入三件套可瞬间「变美」:

redis-cli --raw
redis> JSON.GET doc INDENT "\t" NEWLINE "\n" SPACE " "
  • INDENT:层级缩进符(推荐 \t 或空格)
  • NEWLINE:行尾符(Mac/Linux \n,Windows \r\n
  • SPACE:key 与 value 间的空格,一般设 " "

效果:与 jq, json_pp 类似的彩色缩进输出,极大提升调试体验。

3、路径语义 & 返回结构

3.1 单路径

redis> JSON.GET doc $..b
"[3,null]"
  • 返回类型:JSON 数组字符串
  • 每个匹配值都会成为数组元素

3.2 多路径

redis> JSON.GET doc ..a $..b
"{\"$..b\":[3,null],\"..a\":[2,4]}"
  • 返回类型:JSON 对象字符串
  • key 为路径,value 为数组(或 legacy 单值)

建议:想拿结构化结果,直接 JSON.GET key $ 后在应用层解析;想要定点字段,使用多路径并解析对象即可。

4、CLI 实战:耳机商品读写

# 写入样例
JSON.SET item:3 $ '{
  "name":"TWS Pro",
  "spec":{"bt":"5.3","codec":["AAC","LDAC"]},
  "price":129.99,
  "stock":42
}'

# 4.1 读取单字段
redis> JSON.GET item:3 $.spec.codec[1]
"[\"LDAC\"]"

# 4.2 同时读取两个字段
redis> JSON.GET item:3 $.price $.stock
"{\"$.price\":[129.99],\"$.stock\":[42]}"

5、跨语言示例

5.1 Python(redis-py ≥ 5.0)

from redis import Redis
r = Redis(decode_responses=True)

# 获取 price 与 stock
resp = r.json().get("item:3", Path("$.price"), Path("$.stock"))
print(resp)  # {'$.price': [129.99], '$.stock': [42]}

5.2 Node.js(@redis/client)

import { createClient } from 'redis';
const cli = createClient(); await cli.connect();

const obj = await cli.json.get('item:3', '$.name', '$.spec.codec');
console.log(obj);
// { '$.name': ['TWS Pro'], '$.spec.codec': [['AAC','LDAC']] }

5.3 Go(go-redis/v9)

res, _ := rdb.Do(ctx, "JSON.GET",
    "item:3", "$.spec.codec[0]", "$.price").Text()
fmt.Println(res)

6、性能 & 坑点

问题 / 场景建议
超大文档全量 GET若仅需分页字段,用多路径精准取;或拆分文档
路径拼写错误返回空数组 / 对象但不报错,生产环境务必断言非空
混用 legacy 与 JSONPath可能导致返回结构变化,统一 JSONPath
格式化占用带宽INDENT 等仅用于 CLI;生产接口返回原始紧凑 JSON 避免多余字节
多路径过多过百路径一次 GET 会占用主线程,考虑拆批

7、最佳实践

  1. 客户端一次取多字段
    减少网络 RTT:JSON.GET key $.a $.b $.c → 客户端解析。
  2. 缓存层组合键
    需要多业务字段共享,可在 Redis 侧一次 GET,多字段放本地缓存。
  3. 调试快捷命令
    alias jget='redis-cli --raw JSON.GET' 配合缩进参秒变 jq。
  4. Lua / Pipeline
    批量 GET 不同键时,用 Pipeline;需与写结合时用 Lua 保证原子读改写。

8、总结

JSON.GET 是 RedisJSON 的「万能读取器」——

  • 单路径:数组化返回,适合批量匹配
  • 多路径:对象化返回,适合一次取多段
  • 格式化参数:让 CLI 输出秒变美观
  • 性能可控:精准路径 + 拆批

配合本系列其他写删改查指令,你已拥有构建高性能 JSON 服务端所需的全部武器。愿你读得高效、写得简单、查得精准!🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hello.Reader

请我喝杯咖啡吧😊

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值