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":"john@example.com"}'
# 获取整个 JSON 文档
JSON.GET user:1000
# 获取用户的年龄
JSON.GET user:1000 .age
# 更新用户的邮箱
JSON.SET user:1000 .email "john.doe@example.com"
# 删除用户的年龄信息
JSON.DEL user:1000 .age
# 追加一个兴趣到用户的兴趣列表
JSON.ARRAPPEND user:1000 .interests [] "fishing"
# 获取兴趣列表的长度
JSON.ARRLEN user:1000 .interests
  • 18
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis的search模块Redis一个功能强大的搜索引擎插件,它提供了全文搜索和模糊搜索等功能。它可以用于在Redis数据库快速查询和过滤数据,提供更高效的数据检索和搜索体验。 使用Redis的search模块,首先需要在Redis服务器上安装并配置search插件。安装完成后,我们可以通过使用search模块提供的指令来创建、配置和管理全文索引。 首先,我们需要创建一个索引,并指定索引的字段和分词器。分词器用于将索引的字段拆分成单词,以便进行更高效的搜索。然后,我们可以通过添加文档来建立索引,文档是搜索的最小单位,可以理解为数据库的一条数据记录。 一旦索引创建完成并添加了文档,我们就可以使用search模块提供的指令进行搜索。可以根据关键词进行全文搜索或模糊搜索,search模块会返回匹配的文档列表,并按照相关性进行排序。 此外,search模块还提供了过滤和排序的功能。我们可以通过设置过滤条件来快速查询符合特定条件的文档,也可以指定排序规则来调整搜索结果的顺序。 总的来说,Redis的search模块是一个非常实用的工具,它可以帮助我们在Redis数据库进行快速而高效的搜索和检索操作。无论是全文搜索还是模糊搜索,search模块都能提供优秀的搜索性能和灵活的搜索配置选项,使得Redis数据库的搜索功能更加强大和易用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值