-
下载rejson插件
地址Releases · RedisJSON/RedisJSON (github.com)1.04版本下面有直接编译号的,别的版本需要手动编译
-
下载以后吧文件放到 redis-6.0.9/module 目录下面
- module 需要自己创建,放在别的地方也可以
- 需要修改权限: chmod 777 rejson.so
-
加载配置文件
- 方法1:vi redis.conf ,然后添加 loadmodule rejson.so文件路径
- 方法2在启动命令行loadmodule:redis-server --loadmodule /path/to/module/rejson.so (据说这种方法比较危险,具体哪里危险没去研究)
- 方法1:vi redis.conf ,然后添加 loadmodule rejson.so文件路径
-
重启redis,然后使用 module list 查看是否已经加载 rejson
-
rejson源码编译
-
添加一个json
- 格式:json.set keyName . 'json字符串'
- 例子:json.set user1 . '{"name":"张三","age":2}'
- 备注 点空格 后面表示整个对象替换,点字段名后面表示修改指定字段,设置的时候 . 不能省略,查询的整个的时候可以省略
-
查询json
- 格式:json.get keyName .
- 例子:json.get user1
- 后面的 . 可加可不加,都表示获取整个对象
-
查询接送对象的部分字段
- 格式:json.get keyName .字段名字
- 例子:json.get user1 .age
-
rejson支持两类语法,ReJSON和 2.0引入的 jsonpath 语法
-
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 属性
-
redispath语法 需要 2.0 以后的版本才支持( 2021-11-17 日发布),上面装的1.0.4不支持
-
redis search 需要rejson的支持
-
java 客户端的使用 redisTemple 暂时还没有这方面的支持(也许是我这个版本没支持),使用原生的客户端,里面啥都有,下面是依赖导入
<!--jedit原生客户端,这里里面有对 rejson,redsis search 等新语法的支持 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>4.2.0</version> </dependency>
-
使用例子,一般来说这些知道这些方法就够了
/** * 默认 使用 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(); }
redis rejson 命令行客户端使用和java客户端使用
发布时间 2023-03-22 21:16:09作者: zhangyukun