Docker安装RedisJson及整合Springboot

有生之年系列,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);
    }
}


在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值