首页/数据/Redis 进阶速查/RedisJSON:结构化文档读写
数据结构与选型42 条

RedisJSON:结构化文档读写

RedisJSON 模块把 JSON 文档存为树结构:JSON.SET 整体写入、JSON.GET 按路径取、JSON.NUMINCRBY 原子更新数值,适合字段级更新频繁的复杂对象。

Redis 进阶速查数据更新于 2026-10-13

文档型存储与路径读写

JSON 扩展把文档按树结构存储,支持按路径读写单个字段:整体写入后用带路径的取命令读某一段,数值字段可以原子递增,数组可以追加与删除。相比把整份 JSON 塞进字符串再读改写,它避免了取整块、改一处、写回整块的放大,字段级更新频繁的对象受益最明显。

基本信息

前置依赖需要 JSON 能力:老版本靠独立模块或整合发行版提供,新版已并入主体
常用命令写入、读取、数值递增、数组追加、删除路径、查看类型
路径语法以 $ 开头的路径表达式,旧式点号路径仍兼容
确认可用MODULE LIST 查看已加载模块,或直接执行一次读命令验证

典型使用场景

  • 用户档案与配置对象:字段多、更新频繁,只想改其中一个字段
  • 计数器与开关:文档里某个数值字段需要原子递增或翻转
  • 条件写入:只在字段不存在时写入或只在存在时更新
  • 检索联动:与全文检索类能力配合,把文档字段做成可查询的索引

使用示例

使用示例
redis-cli JSON.SET user:1 $ '{"name":"alice","vip":1,"tags":["a","b"]}'  # 整体写入
redis-cli JSON.GET user:1 $.name                    # 按路径取值
redis-cli JSON.GET user:1 '$'                       # 取整份文档,$ 路径返回数组包裹
redis-cli JSON.NUMINCRBY user:1 $.vip 1             # 数值字段原子递增
redis-cli JSON.ARRAPPEND user:1 $.tags '"c"'       # 数组尾部追加元素
redis-cli JSON.TYPE user:1 $.tags                   # 查看字段类型
redis-cli JSON.DEL user:1 $.vip                     # 删除指定字段
redis-cli MODULE LIST | grep -i json                # 确认模块是否已加载

常用命令速查

命令作用要点
写入命令写入或替换路径下的值支持仅在不存在时新建或仅在存在时更新的选项
读取命令读取路径对应的值$ 路径返回数组包裹,未命中返回空数组
数值递增对数值字段原子增减字段不是数字会直接报错
数组追加在数组尾部追加元素参数是 JSON 字面量,字符串需要带引号
删除路径删除指定路径删除根路径等同于删除整个键
查看类型返回字段的类型排查写入不符合预期时很有用
用 $ 路径取值返回的是匹配结果数组,取单个字段也会多一层包裹;旧式点号路径继续可用并返回原始值。从旧路径迁移的脚本要注意这个差异,否则类型判断会出错。
没有加载对应能力的实例执行这些命令会直接返回未知命令错误。容器化部署时先确认镜像里带的是整合发行版,还是需要额外挂载模块文件,否则上线后才发现命令不可用。
对根路径整体写入会替换整份文档,未包含的字段会消失,它不是单字段更新。需要改一个字段就用带路径的写入,避免误删其余字段。

易错点

  • 在未加载相应能力的实例上执行文档命令:直接报未知命令,脚本若没有降级分支会整段失败
  • 把 $ 路径的返回值当标量使用:返回的是数组,客户端需要多取一层,否则类型转换报错
  • 把根路径整体写入当成改一个字段:会丢掉未包含的字段,属于典型的误覆盖
  • 把超大文档塞进一个键:单键体积过大在集群里无法按字段分散,改一处字段也要整格加载与释放内存

数据来源与参考

  • Redis 官方文档:RedisJSON 模块命令(JSON.SET / JSON.GET)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌