7.4.RedisJSON模块
7.4.1.介绍
RedisJSON 模块是一个 Redis 社区贡献的模块,它为 Redis 增加了对 JSON 数据类型的原生支持。这个模块使得 Redis 能够直接存储、查询和操作 JSON 数据,而无需将数据序列化和反序列化成字符串或哈希表,从而提高了数据处理的效率和性能。
Redis 6.0版本之后支持 RedisJSON模块
RedisJSON 允许你将整个 JSON 文档存储为 Redis 键值对中的值。
- 路径表达式:
RedisJSON 支持 JSONPath 表达式,这允许你以一种灵活的方式访问和修改嵌套的 JSON 数据。 - 事务性操作:
RedisJSON 命令可以在事务中执行,保证数据的一致性和原子性。 - 性能优化:
由于数据直接以二进制形式存储,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