1. 下载rejson插件
    地址Releases · RedisJSON/RedisJSON (github.com)1.04版本下面有直接编译号的,别的版本需要手动编译,第一次发布时间在2017年11月,也就是redis 4 发布以后,所以只有redis 4 以后才能支持 rejson
  2. 下载以后吧文件放到 redis-6.0.9/module 目录下面
  • module 需要自己创建,放在别的地方也可以
  • 需要修改权限: chmod 777 rejson.so
  1. 加载配置文件
  • 方法1:vi redis.conf ,然后添加 loadmodule rejson.so文件路径
  • 方法2在启动命令行loadmodule:redis-server --loadmodule /path/to/module/rejson.so (据说这种方法比较危险,具体哪里危险没去研究)
  1. 重启redis,然后使用 module list 查看是否已经加载 rejson
  2. redis命令行查看key redis命令行查看json_数组

  3. rejson源码编译
  • 下载源码包,然后解压
  • 源码包根目录执行:cargo build --release
  • 目标文件在target/release/target/release
  • 但是运行报错了,error: failed to run custom build command for redis-module v0.25.0,用window编译也是一样的错,不知道哪里的问题。
  • 还是去redis 的官网下载编译好的包,下载地址:Download Redis Enterprise | Redis
  • redis命令行查看key redis命令行查看json_redis命令行查看key_02


  1. 添加一个json
  • 格式:json.set keyName . 'json字符串'
  • 例子:json.set user1 . '{"name":"张三","age":2}'
  • 备注 点空格 后面表示整个对象替换,点字段名后面表示修改指定字段,设置的时候 . 不能省略,查询的整个的时候可以省略
  1. 查询json
  • 格式:json.get keyName .
  • 例子:json.get user1
  • 后面的 . 可加可不加,都表示获取整个对象
  1. 查询接送对象的部分字段
  • 格式:json.get keyName .字段名字
  • 例子:json.get user1 .age
  1. rejson支持两类语法,ReJSON和 2.0引入的 jsonpath 语法
  2. rejson 语法
  • json.set user1 . '{"name":"zhangsan","age":30}' #添加一个对象
  • json.numincrby user1 .age 2 #user1.age 加2
  • json.nummultby user1 .age 2 #user1.age 乘2
  • JSON.set user1 .age 200 #user1.age 设置为200
  • json.set user1 .state '1' #user1.添加一个新的字段 值是 1
  • json.set user1 .array '[1,2,3]' #user1 添加一个字段array, 并且它是一个数组
  • json.arrappend user1 .array 5 6 7 #user1字段为array的数组上面添加三个子元素
  • json.arrpop user1 .array #user1字段为array的数组上弹出一个原生,最右边弹出
  • json.type user1 .array #查询 user 里面 array字段的类型
  • json.set arr1 . {} NX #NX 表示存在就不更新,默认是XX直接覆盖
  • json.objlen user1 #查询对象key的个数
  • json.objkeys user1 #查询对象的keys
  • json.arrlen user1 .array #查看数组的长度
  • json.arrinsert user1 .array 2 '"abc"' #在user1 的 array的数组下标2位置添加一个abd
  • json.arrindex user1 .array '"abc"' #在 user1 的array 数组中查询 abc 的位置
  • json.arrappend user1 .array 312 #在数组末尾追
  • json.strlen user1 .name #获取字符串长度 (取到ascii的长度,一个中文长度是3)
  • json.del user1 .age #删除 age 属性
  1. jsonPath语法 需要 2.0 以后的版本才支持( 2021-11-17 日发布),上面装的1.0.4不支持
  2. redis命令行查看key redis命令行查看json_redis命令行查看key_03

  3. JsonPath 常见用法
  • json.set user1 $ '{"name":"zhangsan","age":30}' #添加一个对象
  • json.get user1 $.name #查询user1.name,但是拿到的值外面有个中括号
  • json.set user1 $.name '"李四"' #设置user1.name为李四
  • json.del user1 $.name #删除user1.name字段
  • json.set user1 $.ids [1,2,3] #user1 里面添加一个名字为 ids的数组
  • json.arrinsert user1 $.ids 2 '"a"' #user1.ids 数组下标2的位置添加 一个 a
  • json.arrpop user1 $.ids #弹出最右边一个元素
  • json.get user1 $.ids[1] #查看数组的指定下标的元素
  1. jsonpath语法表

表达式

说明

例子

$

文档根元素

$..book[?(@.isbn)] book数组下面存在is.bin字段的元素

@

当前元素

$..book[(@.length-1)] 数组的倒数第一个元素

.

匹配下级元素

$.book 根目录下面的 book 字段的字段

[]

匹配下级元素

$.book[0] 数组的第个小标的元素

..

递归匹配所有子元素

$..author 返回任务层级子孙节点中的author字段

*

匹配下级元素

$.store.book[*].author boor数据下面的author字段

[,]

连接操作符

[start:end]

数据切片操作

$.store.book[1:4] book数组下标 1-4的元素

[:len]

数据切片操作

$.store.book[:4] book数组的前4个内容

?()

条件过滤表达式

$..book[?(@.price<10)] book下面价格小于10 的元素

  1. redis search 需要rejson的支持
  2. java 客户端的使用 redisTemple 暂时还没有这方面的支持(也许是我这个版本没支持),使用原生的客户端,里面啥都有,下面是依赖导入
<!--jedit原生客户端,这里里面有对 rejson,redsis search  等新语法的支持 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>4.2.0</version>
        </dependency>
  1. 使用例子,一般来说这些知道这些方法就够了
/**
     * 默认 使用 jsonpath语法,不指定语法类型的时候默认使用 jsonpath
     */
    @Test
    public void t1() throws UnsupportedEncodingException {
        HostAndPort config = new HostAndPort("192.168.100.66", 6379);
        PooledConnectionProvider provider = new PooledConnectionProvider(config);
        UnifiedJedis client = new UnifiedJedis(provider);


        Goods goods = Goods.randomGoods();

        //设置
        client.jsonSet("goods", Path.ROOT_PATH, goods );
        goods.setId(1L);
        client.jsonSet("goods", Path.ROOT_PATH, goods , JsonSetParams.jsonSetParams().xx());

        //获取默认放回的  class com.google.gson.internal.LinkedTreeMap
        Object goods1 = client.jsonGet("goods");
        System.out.println("json.get:" + goods1.getClass() );

        //按照类型获取
        Goods goods2 = client.jsonGet("goods",Goods.class);
        System.out.println("json.get:" +  goods2.toString() );

        //添加新的字段
        client.jsonSet("goods", Path.of(".name2"),"name2Value");

        //查找
        Object name2 = client.jsonGet("goods", Path.of(".name2"));
        System.out.println( "name2:" + name2 );


        //删除
        client.jsonDel("goods", Path.of(".name2"));

        //查找不存在的字段会保存
        //name2 = client.jsonGet("goods", Path.of(".name2"));


        //数组的添加
        client.jsonSet("goods", Path.of(".ids"), Arrays.asList(1,2,3));
        client.jsonArrAppend("goods", Path.of(".ids"), Arrays.asList(5,6,5).toArray());


        //修改下标4的位置
        client.jsonSet("goods", Path.of(".ids[4]"),"我在下标4");

        //获取指定下标的数据
        Object index4 = client.jsonGet("goods", Path.of(".ids[4]"));
        System.out.println("下标4的位置是:" + new String( ((String) index4).getBytes("iso8859-1"), Charset.forName("utf8") ));




        client.close();
    }