赞
踩
有生之年系列,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
docker exec -it rejson bash
redis-cli
JSON.SET testjson . '{"key1":11,"key2":22}'
JSON.GET testjson
路径总是从JSON值的根开始。根由字符(.)表示。对于引用根的子级的路径,可以选择在路径前面加上根前缀。
JSON.GET testjson .key1
命令和子命令的名称是大写的,例如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文档,还可以使用RediSearch模块进行索引,使用全文搜索功能。要使用此功能,必须安装两个模块:RedisJSON和RediSearch。
结合RediSearch也可以实现:
实时索引方法,让您立即查询已编入索引的文档
按数字属性和地理过滤距离
支持前缀、模糊、同义词和拼音搜索
多个基于词干的查询扩展语言(使用 Snowball)
聚合操作,如 groupby/reduce、map、排序和过滤
这个后面再补充。
<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>
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); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。