github: https://github.com/RedisJSON/RedisJSON
website: https://oss.redis.com/redisjson/
社区:https://university.redis.com/#courses
RedisJSON是什么
RedisJSON是一个Redis模块,它实现了JSON数据交换标准ECMA-404,作为原生数据类型。它允许从Redis中存储、更新和获取JSON值.
特点
完全支持JSON标准
使用类似JSONPath的语法,用于在文档中选择元素
文档以二进制数据的形式存储在树结构中,允许快速访问子元素
所有JSON值类型都是原子操作
使用RediSearch时,支持二级索引
方式1:
redis-server --loadmodule /usr/lib/redis/module/rejson.so
方式2(推荐):
在redis.conf中,添加一下内容:
loadmodule /usr/lib/redis/module/rejson.so
3.2,docker安装
运行
docker run -d -p 6379:6379 --name redis-redisjson -v /redisjson/data:/data redislabs/rejson:latest
进入容器
docker exec -it redis-redisjson bash
连接
redis-cli.exe -h 127.0.0.1 -p 6379
RedisJSON API命令
命令和子命令的名称是大写的,例如JSON.SET 和INDENT
强制参数用尖括号括起来,例如
可选参数用方括号括起来,例如[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.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]
清空容器的值或将数字重置为0(要使用新版本,旧版本,标量值不变)
已经清空的会忽略,返回清空的值的数
JSON.CLEAR key [path]
JSON.SET doc $ '{"obj":{"a":1, "b":2}, "arr":[1,2,3], "str": "foo", "bool": true, "int": 42, "float": 3.14}'
清空,返回4,因为str,bool不会清空
JSON.CLEAR doc $.*
清空所有的,返回1
JSON.CLEAR doc
查询
JSON.GET doc $
删除指定的key的值,返回删除的数量
JSON.FORGET 等同于 json.del
json.set doc .str
以redis序列化协议形式返回json
JSON.RESP key [path]
序列化是转化规则:
JSON Null映射到Bulk string reply
JSON false和true值映射到Simple string reply
JSON Numbers根据类型映射到[]
JSON字符串映射到Bulk string reply
JSON数组表示为[][后面跟着数组的元素
JSON对象表示为[]。
存储一个bool值,通过toggle来切换
redis> JSON.SET doc .bool
(integer) 0
redis> JSON.GET doc .bool
(integer) 1
redis> JSON.GET doc $
"[{"bool":true}]"
字符串
#添加
127.0.0.1:6379> JSON.SET foo . '"bar"'
OK
#查询
127.0.0.1:6379> JSON.GET foo
"\"bar\""
#类型
127.0.0.1:6379> JSON.TYPE foo
"string"
#字符串长度
127.0.0.1:6379> JSON.STRLEN foo
(integer) 3
#字符串追加
127.0.0.1:6379> json.strappend foo . '"lish"'
(integer) 7
127.0.0.1:6379> json.get foo
"\"barlish\""
数字
#添加num
127.0.0.1:6379> json.set num . 0
OK
#num加1
127.0.0.1:6379> json.numincrby num . 1
"1"
#num加2.5
127.0.0.1:6379> json.numincrby num . 2.5
"3.5"
#num减0.5
127.0.0.1:6379> json.numincrby num . -0.5
"3"
#num乘10
127.0.0.1:6379> json.nummultby num . 10
"30"
127.0.0.1:6379> json.get num
"30.0"
json数据
#添加json字符串
127.0.0.1:6379> JSON.SET user . '{"name":"lcj","age":23}'
OK
#查询
127.0.0.1:6379> JSON.GET user
"{\"name\":\"lcj\",\"age\":23}"
#数据类型
127.0.0.1:6379> JSON.TYPE user
"object"
#数据元素个数
127.0.0.1:6379> json.objlen user
(integer) 2
#所有的key
127.0.0.1:6379> json.objkeys user
1) "name"
2) "age"
数组
#添加空数组
127.0.0.1:6379> json.set arr . []
OK
#追加数据
127.0.0.1:6379> json.arrappend arr . true
(integer) 1
127.0.0.1:6379> json.arrappend arr . '{"answer":42}'
(integer) 2
127.0.0.1:6379> json.arrappend arr . null
(integer) 3
#查询
127.0.0.1:6379> json.get arr
"[true,{\"answer\":42},null]"
#查询数组某个元素
127.0.0.1:6379> json.get arr [1].answer
"42"
#删除最后一个元素
127.0.0.1:6379> json.del arr [-1]
(integer) 1
#指定位置插入数据
127.0.0.1:6379> json.arrinsert arr . 0 -2 -1
(integer) 4
127.0.0.1:6379> json.get arr
"[-2,-1,true,{\"answer\":42}]"
#删除元素,只保留指定范围的元素
127.0.0.1:6379> json.arrtrim arr . 2 3
(integer) 1
#获取数据并删除
127.0.0.1:6379> json.arrpop arr
"true"
127.0.0.1:6379> json.arrpop arr
(nil)
maven依赖
<dependency>
<groupId>com.redislabs</groupId>
<artifactId>jrejson</artifactId>
<version>1.4.0</version>
</dependency>
github地址
https://github.com/RedisJSON/JRedisJSON
java代码
import cn.hutool.core.lang.Console;
import com.redislabs.modules.rejson.JReJSON;
import com.redislabs.modules.rejson.Path;
import org.junit.jupiter.api.Test;
/**
* <p>
* RedisJson测试类
* </p>
*
* @author: liuchangjun
* @since: 2021/12/22 15:50
*/
public class RedisJsonTest {
@Test
public void test(){
// 获取连接
JReJSON client = new JReJSON("127.0.0.1", 6379);
// 添加字符串(路径为根路径)并返回
client.set("name","lcj", Path.ROOT_PATH);
String name = client.get("name");
Console.log("字符串name:{}",name);
name = client.get("name", String.class, Path.of("."));
Console.log("字符串name:{}",name);
name = client.get("name", String.class, Path.ROOT_PATH);
Console.log("字符串name:{}",name);
}
}
RedisJSON的数据的值最少占用24字节(64位机器上)
使用json.debug memory key计算大小
字符串最少占用24字节
127.0.0.1:6379> json.set str . '""'
OK
127.0.0.1:6379> json.debug memory str
(integer) 24
数组最少占用24个字节
127.0.0.1:6379> json.set arr . []
OK
127.0.0.1:6379> json.debug memory arr
(integer) 24
json对象最少占用72个字节
127.0.0.1:6379> json.set obj . {}
OK
127.0.0.1:6379> json.debug memory obj
(integer) 72
RedisJSON目前支持两种查询语法:JSONPath语法和RedisJSON第一个版本的路径语法。
RedisJSON根据路径查询的第一个字符决定使用哪种语法。如果查询以字符$开头,则使用JSONPath语法。否则,它默认为路径语法。
JSONPath:
RedisJSON 2.0引入了JSONPath支持。
JSONPath查询可以解析JSON文档中的多个位置。在这种情况下,JSON命令将操作每个可能的位置。这是对遗留查询的重大改进,早期查询只在第一条路径上运行。
注意,在使用JSONPath时,命令响应的结构通常不同。
新语法支持括号表示法,允许在键名中使用特殊字符,如冒号“:”或空格。
Legacy Path syntax (RedisJSON v1):
RedisJSON的第一个版本有以下实现。RedisJSON v2仍然支持它。
路径总是从JSON值的根开始。根由字符(.)表示。对于引用根的子级的路径,可以选择在路径前面加上根前缀。
要访问数组元素,请将其索引括在一对方括号内。索引是基于0的,0是数组的第一个元素。可以使用负偏移来访问从数组末端开始的元素。-1是数组中的最后一个元素
json key的规则:
必须以字符,
,
开
头可以包含字符
,
数字
,
,_开头 可以包含字符,数字,
,开头可以包含字符,数字,,_
大小写敏感
JSON value规则:
JSON值是指任何有效值。既可以是JSON数组,也可以是JSON对象。JSON标量是一个JSON数字,一个JSON字符串,或一个常量(JSON False, JSON True,或JSON Null)
官网:https://developer.redis.com/howtos/moviesdatabase/getting-started
除了存储JSON文档,还可以使用RediSearch模块进行索引,使用全文搜索功能。要使用此功能,必须安装两个模块:RedisJSON和RediSearch。
Redis 6.x or later
RedisJSON 2.0 or later
RediSearch 2.2 or later
语法
FT.CREATE {index_name} ON JSON SCHEMA {json_path} AS {attribute} {type}
模式映射
在创建索引时,需要将 JSON 元素映射到SCHEMA字段,如下所示:
字符串为TEXT, TAG, 或GEO.
数字作为NUMERIC。
布尔值作为TAG.
JSON数组,字符串数组为TAG或TEXT。
数字数组为NUMERIC或VECTOR。
地理坐标数组为GEO.
null此类数组中的值将被忽略。
您不能索引 JSON 对象。而是将单个元素索引为单独的属性。
null值被忽略。
例子
FT.CREATE userIdx ON JSON SCHEMA $.user.name AS name TEXT $.user.tag AS country TAG
一旦创建索引,任何预先存在的JSON文档或任何新的JSON文档(添加或修改)都会自动索引。索引是同步的
JSON.SET myDoc $ '{"user":{"name":"John Smith","tag":"foo,bar","hp":1000, "dmg":150}}'
搜索名字含有John的用户
127.0.0.1:6379> FT.SEARCH userIdx '@name:(John)'
1) (integer) 1
2) "myDoc"
3) 1) "$"
2) "{\"user\":{\"name\":\"John Smith\",\"tag\":\"foo,bar\",\"hp\":1000,\"dmg\":150}}"
默认FT.SEARCH返回整个文档
返回指定的字段
FT.SEARCH userIdx '@name:(John)' RETURN 1 name
使用json路径表达式
127.0.0.1:6379> FT.SEARCH userIdx '@name:(John)' RETURN 1 $.user.hp
1) (integer) 1
2) "myDoc"
3) 1) "$.user.hp"
2) "1000"
返回属性别名 ==》RETURN 3 表示后边可以加三个字段
127.0.0.1:6379> FT.SEARCH userIdx '@name:(John)' RETURN 3 $.user.hp AS hitpoints
1) (integer) 1
2) "myDoc"
3) 1) "hitpoints"
2) "1000"
高亮
只要使用文本类型对任何属性进行索引,就可以高亮显示该属性。
127.0.0.1:6379> FT.SEARCH userIdx '@name:(John)' RETURN 1 name HIGHLIGHT FIELDS 1 name TAGS '<b>' '</b>'
1) (integer) 1
2) "myDoc"
3) 1) "name"
2) "<b>John</b> Smith"
聚合是一个强大的功能。使用它生成统计信息或构建方面查询。LOAD参数接受JSON路径表达式。管道中可以使用任何值(即使没有索引)。
FT.AGGREGATE userIdx * LOAD 6 $.user.hp AS hp $.user.dmg AS dmg APPLY '@hp-@dmg' AS points
1) (integer) 1
2) 1) "hp"
2) "1000"
3) "dmg"
4) "150"
5) "points"
6) "850"
1,无法为JSON对象或JSON数组进行索引。
要索引,JSONPath表达式必须返回单个标量值(字符串或数字)。如果JSONPath表达式返回一个对象或数组,它将被忽略。
创建索引
FT.CREATE orgIdx ON JSON SCHEMA $.address[0] AS a1 TEXT $.address[1] AS a2 TEXT
#添加文档
JSON.SET org:1 $ '{"name": "Headquarters","address": ["Suite 250","Mountain View"],"cp": "CA 94040"}'
#搜索
FT.SEARCH orgIdx "suite 250"
FT.SEARCH orgIdx "Mountain"
2,将json字符串和数字索引为 TEXT 和NUMERIC
只能将JSON字符串索引为文本、标记或地理位置
只能将JSON数字索引为数字
JSON布尔值只能作为TAG索引
忽略NULL
3,TAG上不支持排序
127.0.0.1:6379> FT.CREATE orgIdx2 ON JSON SCHEMA $.cp[0] AS cp TAG SORTABLE
(error) On JSON, cannot set tag field to sortable - cp
4.json操作
json操作:https://redis.io/commands/json.arrappend/ / https://developer.redis.com/howtos/redisjson/redisjson-cheatsheet
1.将值追加json到数组中path的最后一个元素之后:
JSON.ARRAPPEND 键 [路径] 值 [值 ...]
2.在数组中搜索标量 JSON 值的第一次出现:
JSON.ARRINDEX 关键路径值 [开始 [停止]]
3.在(向右移动)之前将json值插入数组pathindex:
JSON.ARRINSERT 键路径索引值 [value ...]
4.报告 JSON 数组的长度为pathinkey:
JSON.ARRLEN 键 [路径]
5.从数组的索引中删除并返回一个元素
JSON.ARRPOP 键 [路径 [索引]]
6.修剪数组,使其仅包含指定的包含范围的元素
JSON.ARRTRIM 关键路径开始停止
7.清除容器值(数组/对象)并将数值设置为0
JSON.CLEAR 键 [路径]
8.删除一个值
JSON.DEL 键 [路径] / JSON.FORGET 键 [路径]
9.path以 JSON 序列化形式返回值
JSON.GET 键 [INDENT 缩进] [NEWLINE 换行符] [SPACE 空格] [路径[路径...]]
10.path从多个key参数返回值
JSON.MGET key [key ...] 路径
11.增加存储在的数字path值number
JSON.NUMINCRBY 键路径值
12.返回引用的对象中的键path
JSON.OBJKEYS 键 [路径]
13.path在in处报告 JSON 对象中的键数key
JSON.OBJLEN 键 [路径]
14.key以Redis 序列化协议规范形式返回 JSON->获取有关文档的所有 RESP 详细信息
JSON.RESP 密钥 [路径]
15. 将 JSON 值设置为pathinkey
JSON.SET 键路径值 [NX | XX]
16.将值附加json-string到字符串path
JSON.STRAPPEND 键 [路径] 值
17.报告 JSON 字符串的长度为pathinkey
JSON.STRLEN 键 [路径]
18.切换存储在的布尔值path(修改Boolean值)
JSON.TOGGLE 键路径
19.报告 JSON 值的类型path
JSON.TYPE 键 [路径]
20.以字节为单位报告值的内存使用情况
JSON.DEBUG 内存键 [路径]
5.索引操作
模式映射
在创建索引时,需要将 JSON 元素映射到SCHEMA字段,如下所示:
字符串为TEXT, TAG, 或GEO.
数字作为NUMERIC。
布尔值作为TAG.
JSON数组,字符串数组为TAG或TEXT。
数字数组为NUMERIC或VECTOR。
地理坐标数组为GEO.
null此类数组中的值将被忽略。
您不能索引 JSON 对象。而是将单个元素索引为单独的属性。
null值被忽略。
字段类型有:
TEXT允许针对此属性中的值进行全文搜索查询。
TAG允许针对此属性中的值进行精确匹配查询,例如类别或主键。
NUMERIC允许针对此属性中的值进行数字范围查询。
GEO允许针对此属性中的值进行地理范围查询。属性的值必须是包含经度(第一个)和以逗号分隔的纬度的字符串。
VECTOR允许对该属性中的值进行矢量相似性查询。
ft 操作:
1.返回所有现有索引的列表。
FT._LIST --》_命令中的前缀表示,这是一个临时命令。
2.为索引添加别名
FT.ALIASADD 别名索引
127.0.0.1:6379> FT.ALIASADD alias idx
3.从索引中删除别名
FT.ALIASDEL 别名
127.0.0.1:6379> FT.ALIASDEL alias
4.为索引添加别名。如果别名已经与另一个索引相关联,FT.ALIASUPDATE 会删除别名与先前索引的关联。
FT.ALIASUPDATE 别名索引
127.0.0.1:6379> FT.ALIASUPDATE alias idx
5.向索引添加新属性。将属性添加到索引会导致任何未来的文档更新在索引和重新索引现有文档时使用新属性。
FT.ALTER {index} [SKIPINITIALSCAN] SCHEMA ADD {attribute} {options} ...
127.0.0.1:6379> FT.ALTER idx SCHEMA ADD id2 NUMERIC SORTABLE
6.检索配置选项
FT.CONFIG GET 选项
127.0.0.1:6379> FT.CONFIG GET *
7.描述配置选项
FT.CONFIG SET 选项值
127.0.0.1:6379> FT.CONFIG SET TIMEOUT 42
8.创建具有给定规范的索引
FT.CREATE index
[ON HASH | JSON]
[PREFIX count prefix [prefix ...]]
[FILTER {filter}]
[LANGUAGE default_lang]
[LANGUAGE_FIELD lang_attribute]
[SCORE default_score]
[SCORE_FIELD score_attribute]
[PAYLOAD_FIELD payload_attribute]
[MAXTEXTFIELDS]
[TEMPORARY seconds]
[NOOFFSETS]
[NOHL]
[NOFIELDS]
[NOFREQS]
[STOPWORDS count [stopword ...]]
[SKIPINITIALSCAN]
SCHEMA field_name [AS alias] TEXT | TAG | NUMERIC | GEO | VECTOR [ SORTABLE [UNF]]
[NOINDEX] [ field_name [AS alias] TEXT | TAG | NUMERIC | GEO | VECTOR [ SORTABLE [UNF]] [NOINDEX] ...]
1)hash类型
127.0.0.1:6379> FT.CREATE idx ON HASH PREFIX 1 blog:post: SCHEMA title TEXT SORTABLE published_at NUMERIC SORTABLE category TAG SORTABLE
2)json类型
127.0.0.1:6379> FT.CREATE g-authors-idx ON HASH PREFIX 1 author:details FILTER 'startswith(@name, "G")' SCHEMA name TEXT
9.删除游标
FT.CURSOR DEL 索引 cursor_id
redis> FT.CURSOR DEL idx 342459320
10.从现有游标读取下一个结果
FT.CURSOR READ 索引 cursor_id [COUNT read_size]
127.0.0.1:6379> FT.CURSOR READ idx 342459320 COUNT 50
11.向词典中添加术语
FT.DICTADD 字典术语 [术语 ...]
127.0.0.1:6379> FT.DICTADD dict foo bar "hello world"
12.从字典中删除术语
FT.DICTDEL 字典术语[术语...]
127.0.0.1:6379> FT.DICTDEL dict foo bar "hello world"
13.转储给定字典中的所有术语
FT.DICTDUMP 字典
127.0.0.1:6379> FT.DICTDUMP dict
13.删除索引
FT.DROPINDEX指数 [DD]
127.0.0.1:6379> FT.DROPINDEX idx DD
14.返回复杂查询的执行计划
FT.EXPLAIN 索引查询 [DIALECT方言]
127.0.0.1:6379> FT.EXPLAIN rd "(foo bar)|(hello world) @date:[100 200]|@date:[500 +inf]"
15.返回复杂查询的执行计划,但格式化后更易于阅读,无需使用redis-cli --raw
FT.EXPLAINCLI 索引查询 [DIALECT方言]
127.0.0.1:6379> FT.EXPLAINCLI rd "(foo bar)|(hello world) @date:[100 200]|@date:[500 +inf]"
16.返回索引的信息和统计信息
FT.INFO指数
127.0.0.1:6379> FT.INFO idx
17.执行FT.SEARCH或FT.AGGREGATE命令并收集性能信息
FT.PROFILE索引搜索 | AGGREGATE [LIMITED] QUERY 查询
127.0.0.1:6379> FT.PROFILE idx SEARCH QUERY "hello world"
18.使用文本查询搜索索引,返回文档或仅返回 id
FT.SEARCH index query
[NOCONTENT]
[VERBATIM] [NOSTOPWORDS]
[WITHSCORES]
[WITHPAYLOADS]
[WITHSORTKEYS]
[ FILTER numeric_field min max [ FILTER numeric_field min max ...]]
[ GEOFILTER geo_field lon lat radius m | km | mi | ft [ GEOFILTER geo_field lon lat radius m | km | mi | ft ...]]
[ INKEYS count key [key ...]] [ INFIELDS count field [field ...]]
[ RETURN count identifier [AS property] [ identifier [AS property] ...]]
[ SUMMARIZE [ FIELDS count field [field ...]] [FRAGS num] [LEN fragsize] [SEPARATOR separator]]
[ HIGHLIGHT [ FIELDS count field [field ...]] [ TAGS open close]]
[SLOP slop]
[TIMEOUT timeout]
[INORDER]
[LANGUAGE language]
[EXPANDER expander]
[SCORER scorer]
[EXPLAINSCORE]
[PAYLOAD payload]
[ SORTBY sortby [ ASC | DESC]]
[ LIMIT offset num]
[ PARAMS nargs name value [ name value ...]]
[DIALECT dialect]
127.0.0.1:6379> FT.SEARCH idx * RETURN 2 arr val
19.对查询执行拼写更正,返回拼写错误的建议
FT.SPELLCHECK index query
[DISTANCE distance]
[TERMS INCLUDE | EXCLUDE dictionary [terms [terms ...]]]
[DIALECT dialect]
127.0.0.1:6379> FT.SPELLCHECK idx held DISTANCE 2
20.转储同义词组的内容
FT.SYNDUMP指数
127.0.0.1:6379> FT.SYNDUMP idx
21.更新同义词组
FT.SYNUPDATE 索引 synonym_group_id
[SKIPINITIALSCAN] 术语 [术语 ...]
127.0.0.1:6379> FT.SYNUPDATE idx synonym hello hi shalom
22.返回在 Tag 字段中索引的一组不同的值
FT.TAGVALS 索引字段名
127.0.0.1:6379> FT.TAGVALS idx myTag
23.FT.AGGREGATE --》对索引运行搜索查询,并对结果执行聚合转换,从中提取统计信息等
FT.AGGREGATE index query
[VERBATIM]
[ LOAD count field [field ...]]
[TIMEOUT timeout]
[LOAD *]
[ GROUPBY nargs property [property ...] [ REDUCE function nargs arg [arg ...] [AS name] [ REDUCE function nargs arg [arg ...] [AS name] ...]]
[ GROUPBY nargs property [property ...] [ REDUCE function nargs arg [arg ...] [AS name] [ REDUCE function nargs arg [arg ...] [AS name] ...]] ...]]
[ SORTBY nargs [ property ASC | DESC [ property ASC | DESC ...]] [MAX num]]
[ APPLY expression AS name [ APPLY expression AS name ...]]
[ LIMIT offset num]
[FILTER filter]
[ WITHCURSOR [COUNT read_size] [MAXIDLE idle_time]]
[ PARAMS nargs name value [ name value ...]]
[DIALECT dialect]
必需的参数
index_name
是对其执行查询的索引。
query
是检索文档的基本过滤查询。它遵循与搜索查询完全相同的语法,包括过滤器、联合、非、可选等。
可选参数
VERBATIM
如果设置,则不会尝试使用词干提取来扩展查询,而是逐字搜索查询词。
LOAD {nargs} {identifier} AS {property} …
从源文档加载文档属性。
identifier是哈希和 JSON 的属性名称或 JSON 的 JSON 路径表达式。
property是结果中使用的可选名称。如果未提供,则identifier使用。应该避免这种情况。
如果*用作nargs,则加载文档中的所有属性。
聚合所需的属性应存储为SORTABLE,它们可用于聚合管道且延迟非常低。LOAD会大大损害聚合查询的性能,因为每个处理过的记录都需要执行与 Redis 键相同的操作HMGET,当对数百万个键执行时,这相当于很长的处理时间。
GROUPBY {nargs} {property}
根据一个或多个属性对管道中的结果进行分组。每个组应该至少有一个reducer,一个处理组条目的函数,或者对它们进行计数,或者执行多个聚合操作(见下文)。
REDUCE {func} {nargs} {arg} … [AS {name}]
使用缩减函数将每个组中的匹配结果缩减为单个记录。例如,COUNT统计组中的记录数。reducer 可以使用AS {name}可选参数拥有自己的属性名称。如果未给出名称,则生成的名称将是 reduce 函数的名称和组属性。例如,如果名称不是COUNT_DISTINCT由 property赋予的@foo,则生成的名称将为count_distinct(@foo)。
SORTBY {nargs} {property} {ASC|DESC} [MAX {num}]
SORTBY使用属性列表对管道进行排序,直到 点。
默认情况下,排序是升序的,但可以为每个属性添加ASCor 。DESC
nargs是排序参数的个数,包括ASC和DESC,例如SORTBY 4 @foo ASC @bar DESC.
MAX用于优化排序,仅对 n 个最大的元素进行排序。虽然它没有连接到LIMIT,但您通常只需要SORTBY … MAX进行常见查询。
所需的属性SORTBY应存储为SORTABLE以非常低的延迟可用。
APPLY {expr} AS {name}
对一个或多个属性应用一对一转换,并将结果作为新属性存储在管道中,或者使用此转换替换任何属性。
expr是可用于对数值属性执行算术运算的表达式,或可根据属性类型(见下文)应用于属性的函数,或它们的任意组合。例如,APPLY "sqrt(@foo)/log(@bar) + 5" AS baz为管道中的每条记录动态计算此表达式,并将结果存储为一个名为 的新属性,baz它可以被管道中的其他APPLY// SORTBY/操作引用。GROUPBYREDUCE
LIMIT {offset} {num}
限制结果数以仅返回num从索引offset(从零开始)开始的结果。SORTBY … MAX如果您只对限制排序操作的输出感兴趣,那么使用它会更有效率。如果某个键在查询期间过期,则load对该键值的尝试将返回一个空数组。
但是,limit 可用于限制不排序的结果,或用于分页由 确定的 n 个最大结果SORTBY MAX。例如,获取前 100 个结果中的 50-100 个结果最有效地表示为SORTBY 1 @foo MAX 100 LIMIT 50 50. 从管道中删除MAXfrom结果对所有记录进行排序,然后对结果 50-100 进行分页。SORTBY
FILTER {expr}
使用与每个结果中的值相关的谓词表达式过滤结果。它们在查询后应用并与管道的当前状态相关。
WITHCURSOR {COUNT} {read_size} [MAXIDLE {idle_time}]
使用比 . 更快的替代方法扫描部分结果LIMIT。有关详细信息,请参阅游标 API 。
TIMEOUT {milliseconds}
如果设置,则覆盖模块的超时参数。
PARAMS {nargs} {name} {value}
定义一个或多个值参数。每个参数都有一个名称和一个值。
query您可以通过 a引用参数$,后跟参数名称,例如,$user。搜索查询中对参数名称的每个此类引用都将替换为相应的参数值。例如,对于参数定义PARAMS 4 lon 29.69465 lat 34.95126,表达式@loc:[$lon $lat 10 km]计算为@loc:[29.69465 34.95126 10 km]。您不能在不允许具体值的查询字符串中引用参数,例如在字段名称中,例如@loc. 要使用PARAMS,设置DIALECT为2或大于2。
DIALECT {dialect_version}
选择执行查询的方言版本。如果未指定,查询将在模块初始加载期间或通过FT.CONFIG SET命令设置的默认方言版本下执行。
返回
FT.AGGREGATE 返回一个数组回复,其中每一行都是一个数组回复,代表一个聚合结果。位置处的整数回复1不代表有效值。
例子:
127.0.0.1:6379> JSON.SET doc:1 $ '[{"arr": [1, 2, 3]}, {"val": "hello"}, {"val": "world"}]'
127.0.0.1:6379> FT.CREATE idx ON JSON PREFIX 1 doc: SCHEMA $..arr AS arr NUMERIC $..val AS val TEXT
127.0.0.1:6379> FT.AGGREGATE idx * LOAD 2 arr val
127.0.0.1:6379> FT.AGGREGATE idx * LOAD 2 arr val DIALECT 3
格式:
FT.AGGREGATE
{index_name:string}
{query_string:string}
[VERBATIM]
[LOAD {nargs:integer} {property:string} ...]
[GROUPBY
{nargs:integer} {property:string} ...
REDUCE
{FUNC:string}
{nargs:integer} {arg:string} ...
[AS {name:string}]
...
] ...
[SORTBY
{nargs:integer} {string} ...
[MAX {num:integer}] ...
] ...
[APPLY
{EXPR:string}
AS {name:string}
] ...
[FILTER {EXPR:string}] ...
[LIMIT {offset:integer} {num:integer} ] ...
[PARAMS {nargs} {name} {value} ... ]
1.Another Redis DeskTop Manager
https://github.com/qishibo/AnotherRedisDesktopManager/releases(github)
https://gitee.com/qishibo/AnotherRedisDesktopManager/releases(gitee)
是一个开源项目,提供了以可视化的方式管理 Redis 的功能,可供免费下载安装,也可以在此基础上进行二次开发,主要特点有:
支持 Windows 平台和 MacOS 平台
支持查询 Key、查看单个 Key、Redis 运行状态
支持 String、List、Hash、Set、Zset 类型的可视化添加、修改与删除
使用简单,可以设置深色模式和浅色模式
安装包小,属于轻量级小工具