RedisJSON 模块是一个 Redis 社区贡献的模块,它为 Redis 增加了对 JSON 数据类型的原生支持。这个模块使得 Redis 能够直接存储、查询和操作 JSON 数据,而无需将数据序列化和反序列化成字符串或哈希表,从而提高了数据处理的效率和性能。
Redis 6.0版本之后支持 RedisJSON模块
RedisJSON 允许你将整个 JSON 文档存储为 Redis 键值对中的值。
如果你使用的是 Docker,需要在运行Redis服务器的机器上安装该模块。
这通常涉及到下载模块并将其放置在Redis的模块目录中,然后在Redis配置文件中启用它。
接取镜像
docker pull redislabs/rejson
配置启动
docker run --name redis-json -p 6379:6379 -d redislabs/rejson
需要下载 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 是否已成功加载 。
RedisJSON 模块使用了一种基于 JSONPath 的路径表达式语法,允许用户在 Redis 中定位和操作 JSON 数据的特定部分。路径表达式在 RedisJSON 的各种命令中扮演着核心角色,如 JSON.GET
, JSON.SET
, JSON.DEL
等。下面是对 RedisJSON 中路径表达式语法的详细讲解:
$
或 root
表示 JSON 文档的根节点。.
后跟属性名来访问对象的属性。例如,$.name
访问根对象的 name
属性。[index]
来访问数组中的特定元素。例如,$.tasks[0]
访问 tasks
数组的第一个元素。[start:end]
来访问数组的一个切片。例如,$.tasks[1:3]
访问 tasks
数组的第二个和第三个元素。[*]
用于匹配数组中的所有元素。例如,$.tasks[*]
匹配 tasks
数组的所有元素。[?(@.property == value)]
用于过滤数组元素,只返回满足条件的元素。例如,$.tasks[?(@.status == "pending")]
返回所有状态为 “pending” 的任务。.
来访问嵌套属性。例如,$.person.address.city
访问 person
对象的 address
对象的 city
属性。$.person.tasks[0].description
访问 person
对象的 tasks
数组中第一个元素的 description
属性。.
或方括号 []
),可以使用 \
进行转义。例如,$.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 数据,这对于处理复杂的数据结构特别有用。
以下是一些使用 RedisJSON 的基本命令示例:
注意 外层使用 '
单引号
使用 JSON.SET
命令可以设置一个 JSON 文档。
JSON.SET myjson $ '{"name":"John","age":30,"city":"New York"}'
注意,在 JSON.SET
命令中,键(key)是 myjson
,路径(path)是 $
(表示 JSON 文档的根),而值(value)是一个 JSON 格式的字符串。
JSON.SET myjson $ '{"city": "Beijing", "country": "China"}' NX
使用 JSON.GET
命令可以获取整个 JSON 文档。
JSON.GET myjson
这个命令会返回与 myjson
键关联的 JSON 数据。
如果你只想获取 JSON 文档中的某个字段,可以使用路径参数。
JSON.GET myjson $.name
JSON.OBJKEYS myjson
返回 JSON 对象的所有键。
JSON.OBJLEN myjson
返回 JSON 对象中元素的数量(不包括嵌套的对象或数组)。
使用 JSON.SET
命令也可以更新 JSON 文档中的字段。
JSON.SET myjson $.age 31
在这个例子中,.age
指定了要更新的字段路径,而 31
是新的值。
使用 JSON.DEL
命令可以删除 JSON 文档中的字段。
JSON.DEL myjson $.age
增加数组属性
JSON.set myjson $.hobbies '["sing", "study" ] '
如果你有一个 JSON 数组,你可以使用 JSON.ARRAPPEND
命令追加元素。
json.arrappend myjson $.hobbies '"reading"' '"traveling"'
json.arrinsert myjson $.hobbies 1 "cooking"
使用 JSON.ARRLEN
命令可以获取数组的长度。
JSON.ARRLEN myjson $.hobbies
使用 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