1、指令速查
JSON.GET <key> [INDENT indent] [NEWLINE newline] [SPACE space] [path ...]
参数 | 说明 |
---|---|
key | Redis 键名 |
path | 0-N 个 JSONPath,缺省 $ 根;支持 .. 、[*] 、筛选等 |
INDENT | 缩进字符(如 "\t" 、" " ) |
NEWLINE | 行尾字符(如 "\n" 、"\r\n" ) |
SPACE | key: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、最佳实践
- 客户端一次取多字段
减少网络 RTT:JSON.GET key $.a $.b $.c
→ 客户端解析。 - 缓存层组合键
需要多业务字段共享,可在 Redis 侧一次 GET,多字段放本地缓存。 - 调试快捷命令
alias jget='redis-cli --raw JSON.GET'
配合缩进参秒变 jq。 - Lua / Pipeline
批量 GET 不同键时,用 Pipeline;需与写结合时用 Lua 保证原子读改写。
8、总结
JSON.GET
是 RedisJSON 的「万能读取器」——
- 单路径:数组化返回,适合批量匹配
- 多路径:对象化返回,适合一次取多段
- 格式化参数:让 CLI 输出秒变美观
- 性能可控:精准路径 + 拆批
配合本系列其他写删改查指令,你已拥有构建高性能 JSON 服务端所需的全部武器。愿你读得高效、写得简单、查得精准!🚀