RedisJSON
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 示例
此代码片段显示了如何将 RedisJSON 与来自 Python 和redis-py 的原始 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')
使用 Docker 运行
要使用 Docker 运行 RedisJSON,请使用 redis-stack-server Docker 映像:
$ docker run -d --name redis-stack-server -p 6379:6379 redis/redis-stack-server:latest
有关在 Docker 容器中运行 Redis Stack 的更多信息,请参阅在 Docker 上运行 Redis Stack。
下载二进制文件
要从预编译的二进制文件下载并运行 RedisJSON:
从Redis 下载中心下载 RediSearch 的预编译版本。
使用 RedisJSON 运行 Redis:
$ redis-server --loadmodule /path/to/module/src/rejson.so
从源代码构建
从源代码构建 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 *
9:M 11 Aug 2022 16:24:06.701 *
9:M 11 Aug 2022 16:24:06.701 *
9:M 11 Aug 2022 16:24:06.701 *
9:M 11 Aug 2022 16:24:06.701 * Module ‘ReJSON’ loaded from /opt/redis-stack/lib/rejson.so
…
局限性
传递给命令的 JSON 值的深度最多可达 128。如果传递给命令的 JSON 值包含嵌套级别超过 128 的对象或数组,则该命令会返回错误。
命令
命令概述
索引/搜索 JSON 文档
结合 RedisJSON 和 RediSearch 来索引和搜索 JSON 文档
小路
访问 JSON 文档中的特定元素
客户端库
RedisJSON 客户端库列表
表现
性能基准
RedisJSON 内存使用
调试内存消耗
开发人员说明
关于调试、测试和文档的说明
最后编辑:Jeebiz 更新时间:2024-08-16 11:44