RedisJSON:JSON 文档的存储、更新与查询技巧

好的,没问题,直接开始吧!

各位观众,各位朋友,各位程序员们,大家好!欢迎来到今天的“RedisJSON:JSON 文档的存储、更新与查询技巧”讲座。我是你们的老朋友,一位在代码海洋里沉浮多年的老水手,今天就和大家聊聊 RedisJSON 这个好东西。

开场白:告别字符串,拥抱 JSON 的丝滑体验

在座的各位,谁还没用过 Redis 存点儿东西?举个手我看看!好,很好,看来都是老司机了。但是,有没有遇到过这样的情况:想存个复杂点儿的数据结构,比如一个用户信息,里面又是姓名、又是年龄、又是地址,最后只能捏着鼻子把它变成一个巨大的字符串,然后各种 getsetsplitjoin,操作起来那叫一个酸爽,对不对?

别担心,今天我们就来告别这种原始社会的生活方式,拥抱 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 文档,第二条命令会分别获取 nameaddress.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 有一个更深入的了解,并且能够在实际项目中灵活运用它,让你的数据飞起来!

记住,代码的世界是充满乐趣的,只要你敢于尝试,勇于探索,就能发现更多的惊喜!

感谢大家的观看,再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注