redis 中的 RedisJSON模块

7.4.RedisJSON模块

7.4.1.介绍

RedisJSON 模块是一个 Redis 社区贡献的模块,它为 Redis 增加了对 JSON 数据类型的原生支持。这个模块使得 Redis 能够直接存储、查询和操作 JSON 数据,而无需将数据序列化和反序列化成字符串或哈希表,从而提高了数据处理的效率和性能。

Redis 6.0版本之后支持 RedisJSON模块

RedisJSON 允许你将整个 JSON 文档存储为 Redis 键值对中的值。

  1. 路径表达式
    RedisJSON 支持 JSONPath 表达式,这允许你以一种灵活的方式访问和修改嵌套的 JSON 数据。
  2. 事务性操作
    RedisJSON 命令可以在事务中执行,保证数据的一致性和原子性。
  3. 性能优化
    由于数据直接以二进制形式存储,RedisJSON 减少了序列化和反序列化的开销,提高了读写速度。

7.4.2.安装模块 RedisJSON

1.docker

如果你使用的是 Docker,需要在运行Redis服务器的机器上安装该模块。

这通常涉及到下载模块并将其放置在Redis的模块目录中,然后在Redis配置文件中启用它。

接取镜像

docker pull redislabs/rejson

配置启动

docker run --name redis-json -p 6379:6379 -d redislabs/rejson
2.下载添加

需要下载 RedisJSON 模块源码,编译并将其放在 Redis 的模块目录中,然后在 Redis 的配置文件中启用模块。

从 Redis 官网(https://redis.io/modules/redisjson)下载并安装 RedisJSON 模块

使用 --loadmodule 选项加载 RedisJSON 模块

redis-server --loadmodule /path/to/redisjson.so

确保将 /path/to/redisjson.so 替换为 RedisJSON 模块的正确路径。

或者,

也可以在 redis.conf 配置文件中添加以下行:

loadmodule /path/to/redisjson.so

然后重启 Redis。

启动 Redis 服务器后,使用 MODULE LIST 命令来检查 RedisJSON 是否已成功加载 。

7.4.3.路径表达式

RedisJSON 模块使用了一种基于 JSONPath 的路径表达式语法,允许用户在 Redis 中定位和操作 JSON 数据的特定部分。路径表达式在 RedisJSON 的各种命令中扮演着核心角色,如 JSON.GET, JSON.SET, JSON.DEL 等。下面是对 RedisJSON 中路径表达式语法的详细讲解:

1. 基础路径表达式
  • 根路径$root 表示 JSON 文档的根节点。
  • 属性访问:使用 . 后跟属性名来访问对象的属性。例如,$.name 访问根对象的 name 属性。
2. 数组索引
  • 索引访问:使用 [index] 来访问数组中的特定元素。例如,$.tasks[0] 访问 tasks 数组的第一个元素。
  • 范围访问:使用 [start:end] 来访问数组的一个切片。例如,$.tasks[1:3] 访问 tasks 数组的第二个和第三个元素。
3. 通配符
  • 数组元素[*] 用于匹配数组中的所有元素。例如,$.tasks[*] 匹配 tasks 数组的所有元素。
4. 过滤器
  • 条件过滤[?(@.property == value)] 用于过滤数组元素,只返回满足条件的元素。例如,$.tasks[?(@.status == "pending")] 返回所有状态为 “pending” 的任务。
5. 复杂表达式
  • 嵌套属性:可以连续使用 . 来访问嵌套属性。例如,$.person.address.city 访问 person 对象的 address 对象的 city 属性。
  • 嵌套数组索引$.person.tasks[0].description 访问 person 对象的 tasks 数组中第一个元素的 description 属性。
6. 特殊字符
  • 转义:如果需要在路径中使用特殊字符(如点号 . 或方括号 []),可以使用 \ 进行转义。例如,$.key\.with\.dot$.key\[with\]square\[brackets\]
示例

假设我们有以下 JSON 结构:

{
  "person": {
    "name": "John Doe",
    "address": {
      "street": "123 Main St",
      "city": "Anytown"
    },
    "tasks": [
      {"id": 1, "description": "Buy milk", "status": "completed"},
      {"id": 2, "description": "Call mom", "status": "pending"}
    ]
  }
}

使用以下路径表达式:

  • $.person.name 返回 "John Doe"
  • $.person.address.city 返回 "Anytown"
  • $.person.tasks[*].description 返回数组 ["Buy milk", "Call mom"]
  • $.person.tasks[?(@.status == "pending")].description 返回数组 ["Call mom"]

RedisJSON 的路径表达式提供了一个强大的工具集,可以精确地定位和操作 JSON 数据,这对于处理复杂的数据结构特别有用。

7.4.4.使用示例

以下是一些使用 RedisJSON 的基本命令示例:

注意 外层使用 ' 单引号

1. 设置 JSON 文档

使用 JSON.SET 命令可以设置一个 JSON 文档。

JSON.SET myjson $ '{"name":"John","age":30,"city":"New York"}'

注意,在 JSON.SET 命令中,键(key)是 myjson,路径(path)是 $(表示 JSON 文档的根),而值(value)是一个 JSON 格式的字符串。

添加或更新 JSON 字段??
JSON.SET myjson $ '{"city": "Beijing", "country": "China"}' NX 
2. 获取整个 JSON 文档

使用 JSON.GET 命令可以获取整个 JSON 文档。

JSON.GET myjson

这个命令会返回与 myjson 键关联的 JSON 数据。

3. 获取 JSON 文档中的特定字段

如果你只想获取 JSON 文档中的某个字段,可以使用路径参数。

JSON.GET myjson $.name
4.返回 JSON 对象的所有键
JSON.OBJKEYS  myjson

返回 JSON 对象的所有键。

5.返回 JSON 对象中元素的数量
JSON.OBJLEN  myjson

返回 JSON 对象中元素的数量(不包括嵌套的对象或数组)。

6. 更新 JSON 文档中的字段

使用 JSON.SET 命令也可以更新 JSON 文档中的字段。

JSON.SET myjson $.age 31

在这个例子中,.age 指定了要更新的字段路径,而 31 是新的值。

7. 删除 JSON 文档中的字段或整个文档。

使用 JSON.DEL 命令可以删除 JSON 文档中的字段。

JSON.DEL myjson $.age
8. 追加数组元素

增加数组属性

JSON.set myjson $.hobbies '["sing", "study"  ] '

如果你有一个 JSON 数组,你可以使用 JSON.ARRAPPEND 命令追加元素。

 json.arrappend myjson $.hobbies  '"reading"'  '"traveling"'
9.数组中插入元素
json.arrinsert myjson $.hobbies 1 "cooking"
10. 获取数组长度

使用 JSON.ARRLEN 命令可以获取数组的长度。

JSON.ARRLEN myjson $.hobbies
11. 查询 JSONPath

使用 JSON.GET 命令结合 JSONPath 表达式来查询嵌套数据:

json.get myjson $.hobbies[1]

这将返回 "cooking"

完整示例

下面是一个简单的完整示例,演示了如何使用 RedisJSON:

# 设置一个 JSON 文档
JSON.SET user:1000 . '{"name":"John Doe","age":30,"email":"[email protected]"}'
# 获取整个 JSON 文档
JSON.GET user:1000
# 获取用户的年龄
JSON.GET user:1000 .age
# 更新用户的邮箱
JSON.SET user:1000 .email "[email protected]"
# 删除用户的年龄信息
JSON.DEL user:1000 .age
# 追加一个兴趣到用户的兴趣列表
JSON.ARRAPPEND user:1000 .interests [] "fishing"
# 获取兴趣列表的长度
JSON.ARRLEN user:1000 .interests

你可能感兴趣的:(redis,redis,RedisJSON)