有生之年系列,Redis 现在也支持json格式了,不用像以前那样把json转成一个大的字符串存储了。
RedisJSON 是一种高性能 JSON 文档存储,允许开发人员构建现代应用程序。它在内存中存储和处理 JSON,以亚毫秒级支持每秒数百万次操作响应时间。 JSON 文档的原生索引、查询和全文搜索允许开发人员创建二级索引,快速查询数据。
目前官方有两个要求:1:redis6以上 2:json不能超过128层。
安装:
拉取镜像
docker pull docker.io/redislabs/rejson
查看一下镜像
docker images
启动
docker run -d -p 6739:6379 --name rejson redislabs/rejson:latest
使用RedisJson
进入容器内部
docker exec -it rejson bash
链接
redis-cli
添加json
JSON.SET testjson . '{"key1":11,"key2":22}'
取出json中全部的值
JSON.GET testjson
取出json中其中一个key,key1 的值 注意空格
路径总是从JSON值的根开始。根由字符(.)表示。对于引用根的子级的路径,可以选择在路径前面加上根前缀。
JSON.GET testjson .key1
更多api命令:
命令和子命令的名称是大写的,例如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,默认是root
INDENT: 设置嵌套级别
NEWLINE: 每行末尾打印的字符串
SPACE: 设置key和value之间的字符串
JSON.GET myjsonkey 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
#增加数字的值
JSON.NUMINCRBY <key> <path> <number>
#数字乘法,过时了
JSON.NUMMULTBY <key> <path> <number>
#追加字符串
JSON.STRAPPEND <key> [path] <json-string>
#字符串的长度
JSON.STRLEN <key> [path]
##数组命令
#追加数组元素
JSON.ARRAPPEND <key> <path> <json> [json ...]
#搜索指定元素在数组中第一次出现的位置,如果存在返回索引,不存在返回-1
JSON.ARRINDEX <key> <path> <json-scalar> [start [stop]]
说明:
[start [stop]] 从start开始(包含)到stop(不包含)的范围
#在数组指定位置插入元素
JSON.ARRINSERT <key> <path> <index> <json> [json ...]
说明:
index: 0是数组第一个元素,负数表示从末端开始计算
#数组的长度
JSON.ARRLEN <key> [path]
说明:
如果key或path不存在,返回null
#删除返回数组中指定位置的元素
JSON.ARRPOP <key> [path [index]]
说明:
index: 默认是-1,最后一个元素
#去掉元素,使其仅包含指定的包含范围的元素
JSON.ARRTRIM <key> <path> <start> <stop>
##对象命令
#返回对象中的key
JSON.OBJKEYS <key> [path]
#返回对象key的数量
JSON.OBJLEN <key> [path]
##模块命令
#返回json value的数据类型
JSON.TYPE <key> [path]
#返回key的字节数
JSON.DEBUG MEMORY <key> [path]
使用工具链接一下
照官网的意思,性能碾压es和mongodb,因为它在内存中存储和处理 JSON。
索引json文档
除了存储JSON文档,还可以使用RediSearch模块进行索引,使用全文搜索功能。要使用此功能,必须安装两个模块:RedisJSON和RediSearch。
结合RediSearch也可以实现:
实时索引方法,让您立即查询已编入索引的文档
按数字属性和地理过滤距离
支持前缀、模糊、同义词和拼音搜索
多个基于词干的查询扩展语言(使用 Snowball)
聚合操作,如 groupby/reduce、map、排序和过滤
这个后面再补充。
Springboot整合RedisJSON
添加maven依赖
<dependency>
<groupId>com.redislabs</groupId>
<artifactId>jrejson</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version> 1.2.70</version>
</dependency>
创建redisjson 客户端配置
package pdf.kit.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.google.gson.internal.LinkedTreeMap;
import com.redislabs.modules.rejson.JReJSON;
import com.redislabs.modules.rejson.Path;
import java.util.List;
/**
* @ClassName RedisJsonTest * @Description TODO
* @Author lgn
* @Date 9:46 2022/9/2
* @Version 1.0
**/
public class RedisJsonTest {
public static void main(String[] args) {
// 获取连接
JReJSON client = new JReJSON("10.10.11.79", 6739);
JSONObject jsonObject=new JSONObject();
jsonObject.put("周杰伦","青花瓷");
jsonObject.put("林俊杰","江南");
jsonObject.put("陶喆","望春风");
jsonObject.put("王力宏","花田错");
jsonObject.put("Eminem","Stan");
JSONArray jsonArray=new JSONArray();
jsonArray.add("Out on Bail");
jsonArray.add("All Eyez on Me was");
jsonObject.put("Tupac",jsonArray);
// 添加字符串(路径为根路径)并返回
//路径总是从JSON值的根开始。根由字符(.)表示。对于引用根的子级的路径,可以选择在路径前面加上根前缀。
client.set("singer",jsonObject, Path.ROOT_PATH);
LinkedTreeMap allName = client.get("singer");
System.out.println("singer-allName:"+allName);//取出全部json
//取json中某一个key的String类型的值
String str = client.get("singer", String.class, Path.of(".Eminem"));
System.out.println("singer-字符串类型的值:"+str);
//取json中某一个key的JSONArray类型的值
JSONArray arr = client.get("singer", JSONArray.class, Path.of(".Tupac"));
System.out.println("singer-JSONArray类型的值:"+arr);
JSONObject jsonObject2=new JSONObject();
jsonObject2.put("Eminem","I Need A Doctor");
client.set("singer2",jsonObject2, Path.ROOT_PATH);
//过滤出不同json里面相同key 的值
List list =client.mget(Path.of(".Eminem"),String.class, "singer","singer2");
System.out.println("singer-singer2-mgetkey:"+list);
}
}