简介
RedisJSON是RedisLabs公司开发的一款用于扩展Redis的JSON处理模块,能够让Redis像处理其他类型键一样处理JSON格式的数据,相当于扩展了Redis的数据类型。
Redis版本
Redis 4.0 以后提供了模块功能,能够让开发者基于开放的 API 来扩展Redis自身的功能,因此要想使用Redis的模块功能,至少要求Redis 4.0及以上版本。
特点
-
完全支持JSON标准 -
使用类似JSONPath的语法,用于在文档中选择元素 -
文档以二进制数据的形式存储在树结构中,允许快速访问子元素 -
所有JSON值类型都是原子操作
命令
官方命令
官方命令:https://redis.io/commands/?group=json&name=JSON
命令规范
-
命令和子命令的名称是大写的,例如 JSON.SET
和INDENT
-
强制参数用尖括号括起来,例如 <path>
-
可选参数用方括号括起来,例如 [index]
-
其他可选参数由三个句点字符表示,即 ...
-
管道字符 |
表示异或
基础命令
设置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
: 设置key
和value
之间的字符串
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]
说明:
-
不存在的 key
或path
会被忽略 -
返回 integer
字符串
# 添加
127.0.0.1:6379> JSON.SET username . '"Tinywan"'
OK
# 查询
127.0.0.1:6379> JSON.GET username
""Tinywan""
# 类型
127.0.0.1:6379> JSON.TYPE username
"string"
# 字符串长度
127.0.0.1:6379> JSON.STRLEN username
(integer) 7
# 字符串追加
127.0.0.1:6379> JSON.STRAPPEND username . '"2024"'
(integer) 11
# 获取追加字符串
127.0.0.1:6379> JSON.GET username
""Tinywan2024""
127.0.0.1:6379>
数字
# 添加TinywanNum
127.0.0.1:6379> JSON.SET TinywanNum . 0
OK
# TinywanNum 加1
127.0.0.1:6379> JSON.NUMINCRBY TinywanNum . 1
"1"
# TinywanNum 加 10.5
127.0.0.1:6379> JSON.NUMINCRBY TinywanNum . 10.5
"11.5"
# TinywanNum 减 5.5
127.0.0.1:6379> JSON.NUMINCRBY TinywanNum . -5.5
"6.0"
# TinywanNum 乘 100
127.0.0.1:6379> JSON.NUMMULTBY TinywanNum . 100
"600.0"
# 查询TinywanNum
127.0.0.1:6379> JSON.GET TinywanNum
"600.0"
JSON数据
# 添加json字符串resty
127.0.0.1:6379> JSON.SET resty . '{"name":"Tinywan","age":24}'
OK
# 查询
127.0.0.1:6379> JSON.GET resty
"{"name":"Tinywan","age":24}"
# 数据类型
127.0.0.1:6379> JSON.TYPE resty
"object"
# 数据元素个数
127.0.0.1:6379> JSON.OBJLEN resty
(integer) 2
# 所有的key
127.0.0.1:6379> JSON.OBJKEYS resty
1) "name"
2) "age"
数组
# 添加空数组
127.0.0.1:6379> JSON.SET TinywanArr . []
OK
# 查询
127.0.0.1:6379> JSON.GET TinywanArr
"[]"
# 追加数据
127.0.0.1:6379> JSON.ARRAPPEND TinywanArr . false
(integer) 1
127.0.0.1:6379> JSON.ARRAPPEND TinywanArr . '{"wechat":2028}'
(integer) 2
127.0.0.1:6379> JSON.ARRAPPEND TinywanArr . null
(integer) 3
# 获取追加数据数组
127.0.0.1:6379> JSON.GET TinywanArr
"[false,{"wechat":2028},null]"
# 查询数组某个元素
127.0.0.1:6379> JSON.GET TinywanArr . [1].wechat
"{".":[false,{"wechat":2028},null],"[1].wechat":2028}"
# 查询
127.0.0.1:6379> JSON.GET TinywanArr
"[false,{"wechat":2028},null]"
# 查询数组某个元素
127.0.0.1:6379> JSON.GET TinywanArr [1].wechat
"2028"
# 删除最后一个元素
127.0.0.1:6379> JSON.DEL TinywanArr [-1]
(integer) 1
127.0.0.1:6379> JSON.GET TinywanArr
"[false,{"wechat":2028}]"
# 指定位置插入数据
127.0.0.1:6379> JSON.ARRINSERT TinywanArr . 0 -20 -100
(integer) 4
127.0.0.1:6379> JSON.GET TinywanArr
"[-20,-100,false,{"wechat":2028}]"
# 删除元素,只保留指定范围的元素
127.0.0.1:6379> JSON.ARRTRIM TinywanArr . 2 3
(integer) 2
127.0.0.1:6379> JSON.GET TinywanArr
"[false,{"wechat":2028}]"
# 获取数据并删除
127.0.0.1:6379> JSON.ARRPOP TinywanArr
"{"wechat":2028}"
127.0.0.1:6379> JSON.ARRPOP TinywanArr
"false"
127.0.0.1:6379> JSON.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');
依赖包基本支持了所有RedisJSON操作命令
官方更多的客户端 https://github.com/RedisJSON/RedisJSON
RedisJson 性能
官网也给了一个性能测试报告,可谓碾压其他 NoSQL,下面是核心的报告结论:
-
隔离写入(isolated writes)
:RedisJSON 比MongoDB
快5.4
倍,比ElasticSearch
快200
倍以上。 -
隔离读取(isolated reads)
:RedisJSON 比MongoDB
快12.7
倍,比ElasticSearch
快500
倍以上。
在混合工作负载场景中,实时更新不会影响 RedisJSON 的搜索和读取性能,而 ElasticSearch 会受到影响。以下是具体的数据:
-
RedisJSON*
支持的操作数/秒比MongoDB
高约50
倍,比ElasticSearch
高 7 倍/秒。 -
RedisJSON*
的延迟比MongoDB
低约90
倍,比ElasticSearch
低23.7
倍。
此外,RedisJSON 的读取、写入和负载搜索延迟在更高的百分位数中远比 ElasticSearch 和 MongoDB 稳定。当增加写入比率时,RedisJSON 还能处理越来越高的整体吞吐量,而当写入比率增加时,ElasticSearch 会降低它可以处理的整体吞吐量。
详细基准测试报告:https://redis.com/blog/redisjson-public-preview-performance-benchmarking/
其他
原文始发于微信公众号(开源技术小栈):Redis Stack 技术栈之JSON数据模型 RedisJSON
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/247930.html