Redis Stack 技术栈之JSON数据模型 RedisJSON

简介

RedisJSON是RedisLabs公司开发的一款用于扩展Redis的JSON处理模块,能够让Redis像处理其他类型键一样处理JSON格式的数据,相当于扩展了Redis的数据类型。

Redis版本

Redis 4.0 以后提供了模块功能,能够让开发者基于开放的 API 来扩展Redis自身的功能,因此要想使用Redis的模块功能,至少要求Redis 4.0及以上版本。

特点

  1. 完全支持JSON标准
  2. 使用类似JSONPath的语法,用于在文档中选择元素
  3. 文档以二进制数据的形式存储在树结构中,允许快速访问子元素
  4. 所有JSON值类型都是原子操作

命令

官方命令

Redis Stack 技术栈之JSON数据模型 RedisJSON官方命令:https://redis.io/commands/?group=json&name=JSON

命令规范

  1. 命令和子命令的名称是大写的,例如JSON.SETINDENT
  2. 强制参数用尖括号括起来,例如<path>
  3. 可选参数用方括号括起来,例如[index]
  4. 其他可选参数由三个句点字符表示,即...
  5. 管道字符|表示异或

基础命令

设置JSON值

JSON.SET <key> <path> <json> [NX | XX]

说明:

  • NX: 如果不存在就添加
  • XX: 如果存在就更新

查询KEY语法

JSON.GET <key> [INDENT indentation-string] [NEWLINE line-break-string] [SPACE space-string] [path ...]

说明:

  • [path ...] 可以接受多个path,默认是root
  • INDENT: 设置嵌套级别
  • NEWLINE: 每行末尾打印的字符串
  • SPACE: 设置keyvalue之间的字符串
JSON.GET Tinywan INDENT "t" NEWLINE "n" SPACE " " .

JSON.SET doc $ '{"a":2, "b": 3, "nested": {"a": 4, "b": null}}'
JSON.GET doc $..b
JSON.GET doc ..a $..b

查询指定路径下的多个key,不存在的key或path返回null

JSON.MGET <key> [key ...] <path>

JSON.SET doc1 $ '{"a":1, "b": 2, "nested": {"a": 3}, "c": null}'
JSON.SET doc2 $ '{"a":4, "b": 5, "nested": {"a": 6}, "c": null}'

JSON.MGET doc1 doc2 $..a

删除值

JSON.DEL <key> [path]

说明:

  • 不存在的keypath会被忽略
  • 返回integer

字符串

# 添加
127.0.0.1:6379JSON.SET username . '"Tinywan"'
OK

# 查询
127.0.0.1:6379JSON.GET username
""Tinywan""

# 类型
127.0.0.1:6379JSON.TYPE username
"string"

# 字符串长度
127.0.0.1:6379JSON.STRLEN username
(integer) 7

# 字符串追加
127.0.0.1:6379JSON.STRAPPEND username . '"2024"'
(integer) 11

# 获取追加字符串
127.0.0.1:6379JSON.GET username
""Tinywan2024""
127.0.0.1:6379>

数字

# 添加TinywanNum
127.0.0.1:6379JSON.SET TinywanNum . 0
OK

# TinywanNum 加1
127.0.0.1:6379JSON.NUMINCRBY TinywanNum . 1
"1"

# TinywanNum 加 10.5
127.0.0.1:6379JSON.NUMINCRBY TinywanNum . 10.5
"11.5"

# TinywanNum 减 5.5
127.0.0.1:6379JSON.NUMINCRBY TinywanNum . -5.5
"6.0"

# TinywanNum 乘 100
127.0.0.1:6379JSON.NUMMULTBY TinywanNum . 100
"600.0"

# 查询TinywanNum
127.0.0.1:6379JSON.GET TinywanNum
"600.0"

JSON数据

# 添加json字符串resty
127.0.0.1:6379JSON.SET resty . '{"name":"Tinywan","age":24}'
OK

# 查询
127.0.0.1:6379JSON.GET resty
"{"name":"Tinywan","age":24}"

# 数据类型
127.0.0.1:6379JSON.TYPE resty
"object"

# 数据元素个数
127.0.0.1:6379JSON.OBJLEN resty
(integer) 2

# 所有的key
127.0.0.1:6379JSON.OBJKEYS resty
1"name"
2"age"

数组

# 添加空数组
127.0.0.1:6379JSON.SET TinywanArr . []
OK

# 查询
127.0.0.1:6379JSON.GET TinywanArr
"[]"

# 追加数据
127.0.0.1:6379JSON.ARRAPPEND TinywanArr . false
(integer) 1
127.0.0.1:6379JSON.ARRAPPEND TinywanArr . '{"wechat":2028}'
(integer) 2
127.0.0.1:6379JSON.ARRAPPEND TinywanArr . null
(integer) 3

# 获取追加数据数组
127.0.0.1:6379JSON.GET TinywanArr
"[false,{"wechat":2028},null]"

# 查询数组某个元素
127.0.0.1:6379JSON.GET TinywanArr . [1].wechat
"{".":[false,{"wechat":2028},null],"[1].wechat":2028}"

# 查询
127.0.0.1:6379JSON.GET TinywanArr
"[false,{"wechat":2028},null]"

# 查询数组某个元素
127.0.0.1:6379JSON.GET TinywanArr [1].wechat
"2028"

# 删除最后一个元素
127.0.0.1:6379JSON.DEL TinywanArr [-1]
(integer) 1
127.0.0.1:6379JSON.GET TinywanArr
"[false,{"wechat":2028}]"

# 指定位置插入数据
127.0.0.1:6379JSON.ARRINSERT TinywanArr . 0 -20 -100
(integer) 4
127.0.0.1:6379JSON.GET TinywanArr
"[-20,-100,false,{"wechat":2028}]"

# 删除元素,只保留指定范围的元素
127.0.0.1:6379JSON.ARRTRIM TinywanArr . 2 3
(integer) 2
127.0.0.1:6379JSON.GET TinywanArr
"[false,{"wechat":2028}]"

# 获取数据并删除
127.0.0.1:6379JSON.ARRPOP TinywanArr
"{"wechat":2028}"
127.0.0.1:6379JSON.ARRPOP TinywanArr
"false"
127.0.0.1:6379JSON.ARRPOP TinywanArr
(nil)

PHP 来操作 RedisJson

RedisJSON-PHP为Redislabs的ReJSON Module for PHP提供了一个客户端。这个库支持广泛使用的redis客户端(PECL Redis Extension和Predis)。

安装依赖包

composer require mkorkmaz/redislabs-rejson

使用

以下以PECL Redis扩展为示例

$redisClient = new Redis();
$redisClient->connect('192.168.13.168',63789);
$reJSON = RedislabsModuleReJSONReJSON::createWithPhpRedis($redisClient);
$res = $reJSON->set('Tinywan''.', ['username'=>'Tinywan','age'=>25], 'NX');
Redis Stack 技术栈之JSON数据模型 RedisJSON

依赖包基本支持了所有RedisJSON操作命令

Redis Stack 技术栈之JSON数据模型 RedisJSON

官方更多的客户端 https://github.com/RedisJSON/RedisJSON

Redis Stack 技术栈之JSON数据模型 RedisJSON

RedisJson 性能

官网也给了一个性能测试报告,可谓碾压其他 NoSQL,下面是核心的报告结论:

  • 隔离写入(isolated writes):RedisJSON 比 MongoDB5.4 倍,比 ElasticSearch200 倍以上。
  • 隔离读取(isolated reads):RedisJSON 比 MongoDB12.7 倍,比 ElasticSearch500 倍以上。
Redis Stack 技术栈之JSON数据模型 RedisJSON

在混合工作负载场景中,实时更新不会影响 RedisJSON 的搜索和读取性能,而 ElasticSearch 会受到影响。以下是具体的数据:

  • RedisJSON* 支持的操作数/秒比 MongoDB 高约 50 倍,比 ElasticSearch 高 7 倍/秒。
  • RedisJSON* 的延迟比 MongoDB 低约 90 倍,比 ElasticSearch23.7 倍。
Redis Stack 技术栈之JSON数据模型 RedisJSON

此外,RedisJSON 的读取、写入和负载搜索延迟在更高的百分位数中远比 ElasticSearchMongoDB 稳定。当增加写入比率时,RedisJSON 还能处理越来越高的整体吞吐量,而当写入比率增加时,ElasticSearch 会降低它可以处理的整体吞吐量。

Redis Stack 技术栈之JSON数据模型 RedisJSON

详细基准测试报告:https://redis.com/blog/redisjson-public-preview-performance-benchmarking/

其他

上一章节:Redis Stack技术栈入门实战指南

原文始发于微信公众号(开源技术小栈):Redis Stack 技术栈之JSON数据模型 RedisJSON

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/247930.html

(0)
李, 若俞的头像李, 若俞

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!