redis rejson 命令行客户端使用和java客户端使用

发布时间 2023-03-22 21:16:09作者: zhangyukun
  1. 下载rejson插件
    地址Releases · RedisJSON/RedisJSON (github.com)

    1.04版本下面有直接编译号的,别的版本需要手动编译

    image-20230322141606678

  2. 下载以后吧文件放到 redis-6.0.9/module 目录下面

    • module 需要自己创建,放在别的地方也可以
    • 需要修改权限: chmod 777 rejson.so
  3. 加载配置文件

    • 方法1:vi redis.conf ,然后添加 loadmodule rejson.so文件路径
      image-20230322141926034
    • 方法2在启动命令行loadmodule:redis-server --loadmodule /path/to/module/rejson.so (据说这种方法比较危险,具体哪里危险没去研究)
  4. 重启redis,然后使用 module list 查看是否已经加载 rejson

  5. rejson源码编译

  6. 添加一个json

    • 格式:json.set keyName . 'json字符串'
    • 例子:json.set user1 . '{"name":"张三","age":2}'
    • 备注 点空格 后面表示整个对象替换,点字段名后面表示修改指定字段,设置的时候 . 不能省略,查询的整个的时候可以省略
  7. 查询json

    • 格式:json.get keyName .
    • 例子:json.get user1
    • 后面的 . 可加可不加,都表示获取整个对象
  8. 查询接送对象的部分字段

    • 格式:json.get keyName .字段名字
    • 例子:json.get user1 .age
  9. rejson支持两类语法,ReJSON和 2.0引入的 jsonpath 语法

  10. rejson 语法

    • 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 属性
  11. redispath语法 需要 2.0 以后的版本才支持( 2021-11-17 日发布),上面装的1.0.4不支持
    image-20230322165422868

  12. redis search 需要rejson的支持

  13. java 客户端的使用 redisTemple 暂时还没有这方面的支持(也许是我这个版本没支持),使用原生的客户端,里面啥都有,下面是依赖导入

            <!--jedit原生客户端,这里里面有对 rejson,redsis search  等新语法的支持 -->
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>4.2.0</version>
            </dependency>
    
    
  14. 使用例子,一般来说这些知道这些方法就够了

        /**
         * 默认 使用 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();
        }