- 下载rejson插件
地址Releases · RedisJSON/RedisJSON (github.com)1.04版本下面有直接编译号的,别的版本需要手动编译,第一次发布时间在2017年11月,也就是redis 4 发布以后,所以只有redis 4 以后才能支持 rejson - 下载以后吧文件放到 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 (据说这种方法比较危险,具体哪里危险没去研究)
- 重启redis,然后使用 module list 查看是否已经加载 rejson
- 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
- 添加一个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.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 属性
- jsonPath语法 需要 2.0 以后的版本才支持( 2021-11-17 日发布),上面装的1.0.4不支持
- 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] #查看数组的指定下标的元素
- 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 的元素 |
- 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();
}