RedisJSON是RedisLabs公司开发的一款用于扩展Redis的JSON处理模块,能够让Redis像处理其他类型键一样处理JSON格式的数据,相当于扩展了Redis的数据类型。
Redis 4.0 以后提供了模块功能,能够让开发者基于开放的 API 来扩展Redis自身的功能,因此要想使用Redis的模块功能,至少要求Redis 4.0及以上版本。
官方命令
官方命令:https://redis.io/commands/?group=json&name=JSON
命令规范
JSON.SET
和INDENT
<path>
[index]
...
|
表示异或JSON.SET <key> <path> <json> [NX | XX]
说明:
NX
: 如果不存在就添加XX
: 如果存在就更新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字符串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)
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 = \Redislabs\Module\ReJSON\ReJSON::createWithPhpRedis($redisClient);
$res = $reJSON->set('Tinywan', '.', ['username'=>'Tinywan','age'=>25], 'NX');
官方更多的客户端 https://github.com/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 会降低它可以处理的整体吞吐量。