RedisJson和RedisSearch探究(⼀)
⽬录
RedisJson突然⼤⽕,号称性能吊打ES和mongo。趁机⼩⼩研究了⼀下。
RedisJson官⽹:
1. RedisJson
1.1.  简介
RedisJson和RedisSearch都是Redis的⼀个模块,它提供了Json格式的存储结构。redis本⾝也可以⽤string或者hash等类型存储json,但是RedisJson提供了不⼀样的体验。它可以更⽅便的处理json,并且也有更⾼的效率。
可以通过docker,⾮常⽅便的安装RedisJson(默认最新版本):
docker pull redislabs/rejson
然后运⾏docker run就可以了。
docker run -d -p 6379:6379 --name redis-rejson redislabs/rejson:latest
可以通过module list查看当前的module:
[root@bogon friso]# docker exec -it f4fe2ec23644 sh
# redis-cli
127.0.0.1:6379> module list
1) 1) "name"
2) "ReJSON"
3) "ver"
redis doc
4) (integer) 20004
RedisJson存储Json的时候,会按照树的结构存储,这也很好理解,因为json本⾝就是⼀棵树。⽽对于存储的各个节点的添加和查,遵循了JsonPath规则,可以在这个链接进⾏查阅:
1.2.  基本使⽤
1.2.1 数据添加
命令: JSON.SET <key> <path> <json> [NX | XX]
实例:
JSON.SET myDoc $ '{"user":{"name":"John Smith","tag":"foo,bar","hp":1000, "dmg":150}}'
需要说明的是,此处$指的是在哪个路径下添加Json。上述例⼦说明是在$下添加的,如果想在user路径下再添加json,可以这么写。
效果如下:
"{\"user\":{\"name\":\"John Smith\",\"tag\":\"foo,bar\",\"hp\":1000,\"dmg\":150,\"job\":
{\"type\":\"teacher\",\"place\":\"beijing\"}}}"
当然,也可以通过这个命令,进⾏数据更新。
JSON.SET myDoc $.user.job '{"type":"doctor","place":"tianjin"}'
以下实例,如⽆特别说明,都会基于myDoc这个可以进⾏操作。
1.2.2 数据获取
命令:
JSON.GET <key>
[INDENT indentation-string]
[NEWLINE line-break-string]
[SPACE space-string]
[path ...]
实例:
127.0.0.1:6379> JSON.GET myDoc
"{\"user\":{\"name\":\"John Smith\",\"tag\":\"foo,bar\",\"hp\":1000,\"dmg\":150,\"job\":
{\"type\":\"teacher\",\"place\":\"beijing\"}}}"
参数说明:
INDENT:指的是嵌套级别的缩进字符串
NEWLINE :设置在每⾏末尾打印的字符串
SPACE:设置放在键和值之间的字符串
INDENT实例:
127.0.0.1:6379> JSON.GET myDoc indent "\t"
"{\t\"user\":{\t\t\"name\":\"John Smith\",\t\t\"tag\":\"foo,bar\",\t\t\"hp\":1000,\t\t\"dmg\":150,\t\t\"job\":
{\t\t\t\"type\":\"doctor\",\t\t\t\"place\":\"tianjin\"\t\t}\t}}"
可以对⽐来看,和没有设置indent,每个缩进层次加了不同的“\t”。⽐如user所在层,加了⼀个“\t”,name所在层加了两个"\t",等等。格式化看⼀下:
\t\t"hp": 1000,
\t\t"dmg": 150,
\t\t"job": {
\t\t\t"type": "doctor",
\t\t\t"place": "tianjin"
\t\t}
\t}
}
NEWLINE 实例:
127.0.0.1:6379> JSON.GET myDoc newline "\n"
"{\n\"user\":{\n\"name\":\"John Smith\",\n\"tag\":\"foo,bar\",\n\"hp\":1000,\n\"dmg\":150,\n\"job\":
{\n\"type\":\"doctor\",\n\"place\":\"tianjin\"\n}\n}\n}"
这么看的话,可能不太明⽩,格式化⼀下就很清晰了:
{\n
"user": {\n
"name": "John Smith",\n
"tag": "foo,bar",\n
"hp": 1000,\n
"dmg": 150,\n
"job": {\n
"type": "doctor",\n
"place": "tianjin"\n
}\n
}\n
}
直观上可以这么理解,INDENT指的是在每⾏头加字符,NEWLINE 是在⾏尾加字符。
SPACE实例:
127.0.0.1:6379> JSON.GET myDoc space "\n"
"{\"user\":\n{\"name\":\n\"John
Smith\",\"tag\":\n\"foo,bar\",\"hp\":\n1000,\"dmg\":\n150,\"job\":\n{\"type\":\n\"doctor\",\"place\":\n\"tianjin\"}}}"就是在键与值之间加的字符。同样格式化看⼀下:
"hp": \n1000,
"dmg": \n150,
"job": \n{
"type": \n"doctor",
"place": \n"tianjin"
}
}
}
这三种字符的添加,看起来如丝般顺滑,不过这个是在什么场景下会⽤到呢?
1.2.3 字符串数据增加
命令:
JSON.STRAPPEND <key> [path] <json-string>
实例:
JSON.STRAPPEND myDoc $.user.name '" TOM"'
查看结果:
127.0.0.1:6379> JSON.GET myDoc
"{\"user\":{\"name\":\"John Smith TOM\",\"tag\":\"foo,bar\",\"hp\":1000,\"dmg\":150,\"job\":
{\"type\":\"doctor\",\"place\":\"tianjin\"}}}"
可以看到,在路径$.user.name的值多了个“ TOM”。官⽹给的例⼦是基于路径".."的,可以将key中名字相同的键的值都更改了,可以在官⽹查看。
1.2.4 布尔类型的值切换
命令:
JSON.TOGGLE <key> <path>
实例:
先添加⼀个bool类型:JSON.SET myDoc $.user.male 'true'
toggle之:JSON.TOGGLE myDoc $.user.male
添加bool类型后的结果:
127.0.0.1:6379> JSON.GET myDoc
"{\"user\":{\"name\":\"John Smith TOM\",\"tag\":\"foo,bar\",\"hp\":1000,\"dmg\":150,\"job\": {\"type\":\"doctor\",\"place\":\"tianjin\"},\"male\":true}}"
toggle后的结果:
127.0.0.1:6379> JSON.GET myDoc
"{\"user\":{\"name\":\"John Smith TOM\",\"tag\":\"foo,bar\",\"hp\":1000,\"dmg\":150,\"job\": {\"type\":\"doctor\",\"place\":\"tianjin\"},\"male\":false}}"
1.2.5 数字增加
命令:
JSON.NUMINCRBY <key> <path> <number>
实例:
JSON.NUMINCRBY myDoc $.user.hp 235
查看结果:
127.0.0.1:6379> JSON.GET myDoc
"{\"user\":{\"name\":\"John Smith TOM\",\"tag\":\"foo,bar\",\"hp\":1235,\"dmg\":150,\"job\": {\"type\":\"doctor\",\"place\":\"tianjin\"},\"male\":false}}"
1.2.6 数组添加
命令:
JSON.ARRAPPEND <key> <path> <json> [json ...]
实例:
先创建有json数组的key值:
127.0.0.1:6379> doc6
"{\"a\":[1],\"nested\":{\"a\":[1,2]},\"nested2\":{\"a\":42}}"
增加数组元素:
127.0.0.1:6379> JSON.ARRAPPEND doc6 $..a 3 4

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。