# RedisJSON

对 Redis 的 JSON 支持

RedisJSON 模块为 Redis 提供 JSON 支持。RedisJSON 允许您在 Redis 数据库中存储、更新和检索 JSON 值,类似于任何其他 Redis 数据类型。RedisJSON 还可以与RediSearch无缝协作,让您索引和查询 JSON 文档。

# 主要特点

  • 完全支持 JSON 标准
  • 用于选择/更新文档内元素的JSONPath语法、JSONPath 语法
  • 以树结构存储为二进制数据的文档,允许快速访问子元素
  • 所有 JSON 值类型的类型化原子操作

# 使用 RedisJSON

要了解如何使用 RedisJSON,最好从 Redis CLI 开始。以下示例假设您连接到启用了 RedisJSON 的 Redis 服务器。

# redis-cli例子

首先,从redis-cli交互模式开始。

要尝试的第一个 RedisJSON 命令是JSON.SET,它使用 JSON 值设置 Redis 键。JSON.SET接受所有 JSON 值类型。此示例创建一个 JSON 字符串:

127.0.0.1:6379> JSON.SET animal $ '"dog"'
"OK"
127.0.0.1:6379> JSON.GET animal $
"[\"dog\"]"
127.0.0.1:6379> JSON.TYPE animal $
1) "string"

请注意命令如何包含美元符号字符$。这是 JSON 文档中值的路径(在这种情况下,它仅表示根)。

这里还有一些字符串操作。JSON.STRLEN告诉你字符串的长度,你可以用 . 追加另一个字符串JSON.STRAPPEND

127.0.0.1:6379> JSON.STRLEN animal $
1) "3"
127.0.0.1:6379> JSON.STRAPPEND animal $ '" (Canis familiaris)"'
1) "22"
127.0.0.1:6379> JSON.GET animal $
"[\"dog (Canis familiaris)\"]"

数字可以递增和相乘:

127.0.0.1:6379> JSON.SET num $ 0
OK
127.0.0.1:6379> JSON.NUMINCRBY num $ 1
"[1]"
127.0.0.1:6379> JSON.NUMINCRBY num $ 1.5
"[2.5]"
127.0.0.1:6379> JSON.NUMINCRBY num $ -0.75
"[1.75]"
127.0.0.1:6379> JSON.NUMMULTBY num $ 24
"[42]"

这是一个更有趣的示例,其中包含 JSON 数组和对象:

127.0.0.1:6379> JSON.SET example $ '[ true, { "answer": 42 }, null ]'
OK
127.0.0.1:6379> JSON.GET example $
"[[true,{\"answer\":42},null]]"
127.0.0.1:6379> JSON.GET example $[1].answer
"[42]"
127.0.0.1:6379> JSON.DEL example $[-1]
(integer) 1
127.0.0.1:6379> JSON.GET example $
"[[true,{\"answer\":42}]]"

JSON.DEL命令会删除您使用path参数指定的任何 JSON 值。

您可以使用专用的 RedisJSON 命令子集来操作数组:

127.0.0.1:6379> JSON.SET arr $ []
OK
127.0.0.1:6379> JSON.ARRAPPEND arr $ 0
1) (integer) 1
127.0.0.1:6379> JSON.GET arr $
"[[0]]"
127.0.0.1:6379> JSON.ARRINSERT arr $ 0 -2 -1
1) (integer) 3
127.0.0.1:6379> JSON.GET arr $
"[[-2,-1,0]]"
127.0.0.1:6379> JSON.ARRTRIM arr $ 1 1
1) (integer) 1
127.0.0.1:6379> JSON.GET arr $
"[[-1]]"
127.0.0.1:6379> JSON.ARRPOP arr $
1) "-1"
127.0.0.1:6379> JSON.ARRPOP arr $
1) (nil)

JSON 对象也有自己的命令:

127.0.0.1:6379> JSON.SET obj $ '{"name":"Leonard Cohen","lastSeen":1478476800,"loggedOut": true}'
OK
127.0.0.1:6379> JSON.OBJLEN obj $
1) (integer) 3
127.0.0.1:6379> JSON.OBJKEYS obj $
1) 1) "name"
   2) "lastSeen"
   3) "loggedOut"

要以更易于阅读的格式返回 JSON 响应,请redis-cli在原始输出模式下运行并包含格式化关键字,例如INDENTNEWLINE,并SPACE使用以下JSON.GET命令:

$ redis-cli --raw
127.0.0.1:6379> JSON.GET obj INDENT "\t" NEWLINE "\n" SPACE " " $
[
	{
		"name": "Leonard Cohen",
		"lastSeen": 1478476800,
		"loggedOut": true
	}
]

# Python 示例

此代码片段显示了如何通过redis-py将 RedisJSON 与 Python 中的原始 Redis 命令一起使用:

import redis

data = {
    'dog': {
        'scientific-name' : 'Canis familiaris'
    }
}

r = redis.Redis()
r.json().set('doc', '$', data)
doc = r.json().get('doc', '$')
dog = r.json().get('doc', '$.dog')
scientific_name = r.json().get('doc', '$..scientific-name')

# 从源代码构建

从源代码构建 RedisJSON:

  1. 克隆RedisJSON 存储库(确保包含--recursive正确克隆子模块的选项):

    $ git clone --recursive https://github.com/RedisJSON/RedisJSON.git
    $ cd RedisJSON
    
  2. 安装依赖项:

    $ ./sbin/setup
    
  3. 建造:

    $ make build
    

# 将模块加载到 Redis

要求:

一般来说,最好运行最新的 Redis 版本。

如果您的操作系统有Redis 6.x 包或更高版本,您可以使用操作系统包管理器安装它。

否则,您可以调用

$ ./deps/readies/bin/getredis

要加载 RedisJSON 模块,请使用以下方法之一:

  • Makefile 配方
  • 配置文件
  • 命令行选项
  • 模块加载命令

# Makefile 配方

使用 RedisJSON 运行 Redis:

$ make run

# 配置文件

或者,您可以通过将以下内容添加到文件中来让 Redis 在启动期间加载模块redis.conf

loadmodule /path/to/module/target/release/librejson.so

在 Mac OS 上,如果此模块构建为动态库,请运行:

loadmodule /path/to/module/target/release/librejson.dylib

在上面的行中替换/path/to/module/为模块的实际路径。

或者,您可以从预编译的二进制文件下载并运行 RedisJSON:

  1. 从Redis 下载中心下载RedisJSON 的预编译版本。

# 命令行选项

或者,您可以让 Redis 使用以下命令行参数语法加载模块:

$ redis-server --loadmodule /path/to/module/librejson.so

在上面的行中替换/path/to/module/为模块库的实际路径。

# MODULE LOAD命令

您还可以使用该MODULE LOAD命令加载 RedisJSON。请注意,这MODULE LOAD是一个危险的命令,出于安全考虑,将来可能会被阻止/弃用。

成功加载模块后,Redis 日志应该有类似于以下内容的行:

...
9:M 11 Aug 2022 16:24:06.701 * <ReJSON> version: 20009 git sha: d8d4b19 branch: HEAD
9:M 11 Aug 2022 16:24:06.701 * <ReJSON> Exported RedisJSON_V1 API
9:M 11 Aug 2022 16:24:06.701 * <ReJSON> Enabled diskless replication
9:M 11 Aug 2022 16:24:06.701 * <ReJSON> Created new data type 'ReJSON-RL'
9:M 11 Aug 2022 16:24:06.701 * Module 'ReJSON' loaded from /opt/redis-stack/lib/rejson.so
...

# 局限性

传递给命令的 JSON 值的深度最高可达 128。如果将包含嵌套级别超过 128 的对象或数组的 JSON 值传递给命令,该命令将返回错误。

命令

命令概述

索引/搜索 JSON 文档

结合 RedisJSON 和 RediSearch 来索引和搜索 JSON 文档

小路

访问 JSON 文档中的特定元素

客户端库

RedisJSON 客户端库列表

表现

性能基准

RedisJSON 内存使用

调试内存消耗

开发人员说明

调试、测试和文档说明

# 反馈

如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。

Last Updated: 4/18/2023, 8:45:33 AM