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 * version: 20009 git sha: d8d4b19 branch: HEAD
9:M 11 Aug 2022 16:24:06.701 * Exported RedisJSON_V1 API
9:M 11 Aug 2022 16:24:06.701 * Enabled diskless replication
9:M 11 Aug 2022 16:24:06.701 * 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。如果传递给命令的 JSON 值包含嵌套级别超过 128 的对象或数组,则该命令会返回错误。

命令
命令概述

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

小路
访问 JSON 文档中的特定元素

客户端库
RedisJSON 客户端库列表

表现
性能基准

RedisJSON 内存使用
调试内存消耗

开发人员说明
关于调试、测试和文档的说明

作者:Jeebiz  创建时间:2023-03-19 22:56
最后编辑:Jeebiz  更新时间:2024-08-16 11:44