好的,没问题,直接开始吧!
各位观众,各位朋友,各位程序员们,大家好!欢迎来到今天的“RedisJSON:JSON 文档的存储、更新与查询技巧”讲座。我是你们的老朋友,一位在代码海洋里沉浮多年的老水手,今天就和大家聊聊 RedisJSON 这个好东西。
开场白:告别字符串,拥抱 JSON 的丝滑体验
在座的各位,谁还没用过 Redis 存点儿东西?举个手我看看!好,很好,看来都是老司机了。但是,有没有遇到过这样的情况:想存个复杂点儿的数据结构,比如一个用户信息,里面又是姓名、又是年龄、又是地址,最后只能捏着鼻子把它变成一个巨大的字符串,然后各种 get
、set
、split
、join
,操作起来那叫一个酸爽,对不对?
别担心,今天我们就来告别这种原始社会的生活方式,拥抱 RedisJSON!有了它,你可以直接把 JSON 文档存到 Redis 里,而且还能像操作数据库一样,对 JSON 文档进行各种骚操作,简直不要太方便!
第一部分:RedisJSON 是什么?能干啥?
RedisJSON 顾名思义,就是 Redis 的一个模块,专门用来存储、操作和查询 JSON 数据的。它基于 Redis 构建,继承了 Redis 的高性能和灵活性,同时又增加了对 JSON 数据的原生支持。
RedisJSON 的优势:
- 原生 JSON 支持: 直接存储和操作 JSON 文档,避免了字符串序列化和反序列化的开销。
- 高性能: 基于 Redis 的内存数据库,读写速度非常快。
- 灵活性: 支持各种 JSON 操作,包括增删改查、数组操作、数值运算等等。
- 查询能力: 支持 JSONPath 查询,可以快速找到 JSON 文档中特定的数据。
- 索引支持: 可以创建索引,进一步提高查询效率。
RedisJSON 能干啥?
- 存储和管理 JSON 数据: 比如用户信息、产品信息、配置信息等等。
- 构建 API 后端: 可以作为 API 的数据存储,提供高性能的 JSON 数据服务。
- 实现缓存: 可以缓存 JSON 数据,减轻数据库的压力。
- 构建实时应用: 可以用于构建实时数据看板、实时聊天应用等等。
第二部分:安装与配置 RedisJSON
想要体验 RedisJSON 的强大,首先得把它装上。安装方式有很多种,这里介绍两种常用的:
1. 通过 Docker 安装:
这是最简单快捷的方式,只需要一条命令:
docker run -p 6379:6379 redislabs/rejson:latest
这条命令会下载并运行 RedisJSON 的 Docker 镜像,并将 Redis 的 6379 端口映射到宿主机。
2. 通过源码编译安装:
如果你喜欢折腾,或者需要在特定的环境下安装,可以选择源码编译安装。
-
下载 RedisJSON 源码:
git clone https://github.com/RedisJSON/RedisJSON.git cd RedisJSON
-
编译 RedisJSON:
make
-
将 RedisJSON 模块加载到 Redis:
在
redis.conf
文件中添加一行:loadmodule /path/to/RedisJSON/src/rejson.so
将
/path/to/RedisJSON
替换为你的 RedisJSON 源码目录。 -
重启 Redis:
redis-cli shutdown redis-server /path/to/redis.conf
将
/path/to/redis.conf
替换为你的 Redis 配置文件。
验证安装:
安装完成后,可以使用 redis-cli
连接到 Redis,然后执行 MODULE LIST
命令,如果看到 ReJSON
模块,说明安装成功了。
redis-cli
127.0.0.1:6379> MODULE LIST
1) 1) "name"
2) "ReJSON"
3) "ver"
4) (integer) 20605
第三部分:RedisJSON 的基本操作
安装好了 RedisJSON,接下来我们就可以开始玩耍了。RedisJSON 提供了一系列命令,用于操作 JSON 数据。
1. JSON.SET:设置 JSON 文档
JSON.SET key path json
命令用于设置指定 key 的 JSON 文档。
key
:要设置的 key。path
:要设置的 JSON 路径,"."
表示根路径。json
:要设置的 JSON 文档。
示例:
redis-cli
127.0.0.1:6379> JSON.SET user . '{"name": "张三", "age": 30, "address": {"city": "北京", "street": "长安街"}}'
OK
这条命令会将一个包含姓名、年龄和地址的 JSON 文档存储到 key 为 user
的地方。
2. JSON.GET:获取 JSON 文档
JSON.GET key [path ...]
命令用于获取指定 key 的 JSON 文档。
key
:要获取的 key。path ...
:可选参数,指定要获取的 JSON 路径,可以指定多个路径。
示例:
redis-cli
127.0.0.1:6379> JSON.GET user
"{"name":"张三","age":30,"address":{"city":"北京","street":"长安街"}}"
127.0.0.1:6379> JSON.GET user .name .address.city
""张三""
""北京""
第一条命令会获取整个 JSON 文档,第二条命令会分别获取 name
和 address.city
的值。
3. JSON.DEL:删除 JSON 文档
JSON.DEL key [path]
命令用于删除指定 key 的 JSON 文档。
key
:要删除的 key。path
:可选参数,指定要删除的 JSON 路径,如果省略,则删除整个文档。
示例:
redis-cli
127.0.0.1:6379> JSON.DEL user .address
(integer) 1
127.0.0.1:6379> JSON.GET user
"{"name":"张三","age":30}"
第一条命令会删除 address
字段,第二条命令会获取删除后的 JSON 文档。
4. JSON.TYPE:获取 JSON 值的类型
JSON.TYPE key [path]
命令用于获取指定 key 的 JSON 值的类型。
key
:要获取类型的 key。path
:可选参数,指定要获取类型的 JSON 路径。
示例:
redis-cli
127.0.0.1:6379> JSON.TYPE user .name
"string"
127.0.0.1:6379> JSON.TYPE user .age
"integer"
127.0.0.1:6379> JSON.TYPE user
"object"
5. JSON.NUMINCRBY:数值增量
JSON.NUMINCRBY key path number
命令用于对指定 key 的 JSON 数值进行增量操作。
key
:要操作的 key。path
:要操作的 JSON 路径。number
:增量值,可以是正数或负数。
示例:
redis-cli
127.0.0.1:6379> JSON.NUMINCRBY user .age 5
"35"
127.0.0.1:6379> JSON.GET user
"{"name":"张三","age":35}"
这条命令会将 age
字段的值增加 5。
6. JSON.NUMMULTBY:数值乘法
JSON.NUMMULTBY key path number
命令用于对指定 key 的 JSON 数值进行乘法操作。
key
:要操作的 key。path
:要操作的 JSON 路径。number
:乘数。
示例:
redis-cli
127.0.0.1:6379> JSON.NUMMULTBY user .age 2
"70"
127.0.0.1:6379> JSON.GET user
"{"name":"张三","age":70}"
这条命令会将 age
字段的值乘以 2。
7. JSON.STRAPPEND:字符串追加
JSON.STRAPPEND key path string
命令用于对指定 key 的 JSON 字符串进行追加操作。
key
:要操作的 key。path
:要操作的 JSON 路径。string
:要追加的字符串。
示例:
redis-cli
127.0.0.1:6379> JSON.STRAPPEND user .name " 先生"
"8"
127.0.0.1:6379> JSON.GET user
"{"name":"张三 先生","age":70}"
这条命令会在 name
字段的值后面追加 " 先生" 字符串。
8. JSON.STRLEN:获取字符串长度
JSON.STRLEN key [path]
命令用于获取指定 key 的 JSON 字符串的长度。
key
:要获取长度的 key。path
:可选参数,指定要获取长度的 JSON 路径。
示例:
redis-cli
127.0.0.1:6379> JSON.STRLEN user .name
(integer) 8
9. JSON.ARRAPPEND:数组追加
JSON.ARRAPPEND key path json [json ...]
命令用于对指定 key 的 JSON 数组进行追加操作。
key
:要操作的 key。path
:要操作的 JSON 路径。json ...
:要追加的 JSON 值,可以追加多个值。
示例:
redis-cli
127.0.0.1:6379> JSON.SET user .hobbies '["coding", "reading"]'
OK
127.0.0.1:6379> JSON.ARRAPPEND user .hobbies "gaming" "traveling"
(integer) 4
127.0.0.1:6379> JSON.GET user .hobbies
"["coding","reading","gaming","traveling"]"
这条命令会在 hobbies
数组后面追加 "gaming" 和 "traveling" 两个值。
10. JSON.ARRINDEX:查找数组元素索引
JSON.ARRINDEX key path json [start [stop]]
命令用于在指定 key 的 JSON 数组中查找指定元素的索引。
key
:要操作的 key。path
:要操作的 JSON 路径。json
:要查找的 JSON 值。start
:可选参数,指定查找的起始索引。stop
:可选参数,指定查找的结束索引。
示例:
redis-cli
127.0.0.1:6379> JSON.ARRINDEX user .hobbies "gaming"
(integer) 2
127.0.0.1:6379> JSON.ARRINDEX user .hobbies "nonexistent"
(integer) -1
11. JSON.ARRINSERT:数组插入
JSON.ARRINSERT key path index json [json ...]
命令用于在指定 key 的 JSON 数组中插入元素。
key
:要操作的 key。path
:要操作的 JSON 路径。index
:要插入的位置索引。json ...
:要插入的 JSON 值,可以插入多个值。
示例:
redis-cli
127.0.0.1:6379> JSON.ARRINSERT user .hobbies 1 "swimming"
(integer) 5
127.0.0.1:6379> JSON.GET user .hobbies
"["coding","swimming","reading","gaming","traveling"]"
这条命令会在 hobbies
数组的索引 1 的位置插入 "swimming" 元素。
12. JSON.ARRLEN:获取数组长度
JSON.ARRLEN key [path]
命令用于获取指定 key 的 JSON 数组的长度。
key
:要获取长度的 key。path
:可选参数,指定要获取长度的 JSON 路径。
示例:
redis-cli
127.0.0.1:6379> JSON.ARRLEN user .hobbies
(integer) 5
13. JSON.ARRPOP:数组弹出
JSON.ARRPOP key path [index]
命令用于从指定 key 的 JSON 数组中弹出元素。
key
:要操作的 key。path
:要操作的 JSON 路径。index
:可选参数,指定要弹出的元素的索引,如果省略,则弹出最后一个元素。
示例:
redis-cli
127.0.0.1:6379> JSON.ARRPOP user .hobbies
""traveling""
127.0.0.1:6379> JSON.GET user .hobbies
"["coding","swimming","reading","gaming"]"
14. JSON.ARRTRIM:数组修剪
JSON.ARRTRIM key path start stop
命令用于修剪指定 key 的 JSON 数组,只保留指定范围内的元素。
key
:要操作的 key。path
:要操作的 JSON 路径。start
:起始索引。stop
:结束索引。
示例:
redis-cli
127.0.0.1:6379> JSON.ARRTRIM user .hobbies 1 2
(integer) 2
127.0.0.1:6379> JSON.GET user .hobbies
"["swimming","reading"]"
这条命令会只保留 hobbies
数组中索引 1 和 2 的元素。
第四部分:RedisJSON 的高级操作:JSONPath 查询与索引
掌握了基本操作,我们就可以开始探索 RedisJSON 的高级功能了。
1. JSONPath 查询
JSONPath 是一种用于查询 JSON 文档的语言,类似于 XPath 用于查询 XML 文档。RedisJSON 使用 JSONPath 来查询 JSON 文档中的数据。
JSONPath 语法:
符号 | 描述 |
---|---|
$ |
根对象/元素 |
@ |
当前对象/元素 |
. |
子节点运算符,用于访问对象的属性 |
[] |
数组索引运算符,用于访问数组的元素 |
* |
通配符,用于匹配所有元素或属性 |
.. |
递归下降,用于匹配所有深度的子节点 |
[,] |
联合运算符,用于选择多个路径 |
?() |
过滤表达式,用于根据条件过滤元素 |
() |
脚本表达式,用于执行脚本代码 |
[start:end:step] |
切片,用于选择数组的一部分。start 是起始索引,end 是结束索引(不包含),step 是步长。 |
示例:
redis-cli
127.0.0.1:6379> JSON.SET users . '[{"name": "张三", "age": 30}, {"name": "李四", "age": 25}, {"name": "王五", "age": 35}]'
OK
127.0.0.1:6379> JSON.GET users '$[*].name'
"["张三","李四","王五"]"
127.0.0.1:6379> JSON.GET users '$[?(@.age > 30)].name'
"["王五"]"
第一条命令会获取所有用户的姓名,第二条命令会获取年龄大于 30 岁的用户的姓名。
2. 索引
为了提高查询效率,RedisJSON 提供了索引功能。可以对 JSON 文档中的特定字段创建索引,从而加速查询速度。
创建索引:
redis-cli
127.0.0.1:6379> FT.CREATE user_index ON JSON SCHEMA $.name AS name TEXT $.age AS age NUMERIC
OK
这条命令会创建一个名为 user_index
的索引,对 name
字段创建文本索引,对 age
字段创建数值索引。
查询:
redis-cli
127.0.0.1:6379> FT.SEARCH user_index "@name:张三"
1) (integer) 1
2) "user"
3) 1) "$"
2) "{"name":"张三","age":30}"
127.0.0.1:6379> FT.SEARCH user_index "@age:[30 35]"
1) (integer) 2
2) "user"
3) 1) "$"
2) "{"name":"张三","age":30}"
4) 1) "$"
2) "{"name":"王五","age":35}"
第一条命令会查询 name
字段包含 "张三" 的用户,第二条命令会查询 age
字段在 30 到 35 之间的用户。
第五部分:RedisJSON 的应用场景
RedisJSON 的应用场景非常广泛,这里列举几个常见的例子:
- 用户画像: 可以使用 RedisJSON 存储用户的各种属性和行为数据,构建用户画像,用于个性化推荐、精准营销等。
- 电商平台: 可以使用 RedisJSON 存储商品信息、订单信息、用户信息等,提供高性能的查询服务。
- 社交应用: 可以使用 RedisJSON 存储用户信息、帖子信息、评论信息等,构建实时社交应用。
- 物联网平台: 可以使用 RedisJSON 存储设备信息、传感器数据等,构建物联网平台。
表格总结:RedisJSON 命令一览
命令 | 描述 | 示例 |
---|---|---|
JSON.SET |
设置 JSON 文档 | JSON.SET user . '{"name": "张三", "age": 30}' |
JSON.GET |
获取 JSON 文档 | JSON.GET user .name |
JSON.DEL |
删除 JSON 文档 | JSON.DEL user .address |
JSON.TYPE |
获取 JSON 值的类型 | JSON.TYPE user .age |
JSON.NUMINCRBY |
数值增量 | JSON.NUMINCRBY user .age 5 |
JSON.NUMMULTBY |
数值乘法 | JSON.NUMMULTBY user .age 2 |
JSON.STRAPPEND |
字符串追加 | JSON.STRAPPEND user .name " 先生" |
JSON.STRLEN |
获取字符串长度 | JSON.STRLEN user .name |
JSON.ARRAPPEND |
数组追加 | JSON.ARRAPPEND user .hobbies "gaming" |
JSON.ARRINDEX |
查找数组元素索引 | JSON.ARRINDEX user .hobbies "gaming" |
JSON.ARRINSERT |
数组插入 | JSON.ARRINSERT user .hobbies 1 "swimming" |
JSON.ARRLEN |
获取数组长度 | JSON.ARRLEN user .hobbies |
JSON.ARRPOP |
数组弹出 | JSON.ARRPOP user .hobbies |
JSON.ARRTRIM |
数组修剪 | JSON.ARRTRIM user .hobbies 1 2 |
FT.CREATE |
创建索引 | FT.CREATE user_index ON JSON SCHEMA $.name AS name TEXT $.age AS age NUMERIC |
FT.SEARCH |
查询 | FT.SEARCH user_index "@name:张三" |
结束语:RedisJSON,让你的数据飞起来!
好了,今天的 RedisJSON 讲座就到这里了。希望通过今天的分享,大家能够对 RedisJSON 有一个更深入的了解,并且能够在实际项目中灵活运用它,让你的数据飞起来!
记住,代码的世界是充满乐趣的,只要你敢于尝试,勇于探索,就能发现更多的惊喜!
感谢大家的观看,再见!