# 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
在原始输出模式下运行并包含格式化关键字,例如INDENT
、NEWLINE
,并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:
克隆RedisJSON 存储库(确保包含
--recursive
正确克隆子模块的选项):$ git clone --recursive https://github.com/RedisJSON/RedisJSON.git $ cd RedisJSON
安装依赖项:
$ ./sbin/setup
建造:
$ 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:
- 从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 内存使用
调试内存消耗
开发人员说明
调试、测试和文档说明
# 反馈
如果您在此页面上发现问题,或有改进建议,请提交请求以合并或打开存储库中的问题。