两张虚拟表都对应 redis 的 list 数据结构, 元素按插入顺序排列, 允许重复, 区别只在结果形态:
| 虚拟表 | 形态 | value 类型 | limit 限制 | 适用场景 |
|---|---|---|---|---|
| redis_list | 一行一个 key(聚合) | string[] 数组 | key 数 | key 多, 每 key 元素少 |
| redis_list_member | 一行一个元素(展开) | string 标量 | 元素行数(跨 key) | key 少, 元素多 |
-- 聚合: 一行一个 key, value 为全部元素数组
select * from redis_list where key in ('queue:1', 'queue:2')
-- 展开: 一行一个元素, 带位置 idx
select * from redis_list_member where key = 'queue:1' limit 100
LRANGE queue:1 0 -1
聚合形态取整个 list; 展开形态按剩余配额分批 LRANGE, 不会一次性拉取超大 list.
redis_list(聚合):
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | redis key |
| value | string[] | list 全部元素, key 不存在时为空数组 |
redis_list_member(展开):
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | redis key |
| idx | int | 元素位置(从 0 开始, 每个 key 独立计数) |
| value | string | list 元素, key 不存在时无行 |
| 指标 | 获取方式 | 说明 |
|---|---|---|
| 全部元素(聚合) | redis_list where key = 'l1' |
按顺序的元素列表 |
| 全部元素(展开) | redis_list_member where key = 'l1' |
每个元素一行, 可直接 where/join, 并带 idx |
| 元素长度 | 聚合取 value size / 展开对行 count | 等于 LLEN |
| type | redis_scan | 恒为 list |
| ttl | redis_scan | key 的过期时间 |
-- 聚合: 查整个 list
select * from redis_list where key = 'queue:1'
-- 聚合: 批量查, limit 限制 key 数
select * from redis_list where key in ('queue:1', 'queue:2') limit 10
-- 展开: 每个元素一行
select * from redis_list_member where key = 'queue:1'
-- 展开: limit 限制元素行数
select * from redis_list_member where key = 'queue:1' limit 100
-- 展开: limit 跨 key 累计, 第一个 key 取完接着取第二个, 新 key 的 idx 从 0 重新计数
select * from redis_list_member where key in ('queue:1', 'queue:2') limit 150
key = 与 key in, 不支持 and 组合.相关文档: redis_set / redis-dao / dynamicSourceWrite
redis_info 把 redis INFO 命令返回的服务器运行信息解析成可查询的表, 可用于监控版本、内存、连接数、命中率等运行指标.
select * from redis_info
select * from redis_info where "group" = 'memory'
select * from redis_info where key = 'redis_version'
INFO
工具把 INFO 的每一行 key:value 解析为一条记录, 并用 # Group 行填充 group 字段.
| 字段 | 类型 | 说明 |
|---|---|---|
| group | string | 信息分组: server/clients/memory/persistence/stats/replication/cpu/keyspace 等 |
| key | string | 指标名, 如 redis_version / used_memory |
| value | string | 指标值(统一以字符串返回) |
| 分组 | 指标 | 含义 |
|---|---|---|
| server | redis_version | redis 版本 |
| clients | connected_clients | 当前连接数 |
| memory | used_memory | 已用内存(字节) |
| memory | used_memory_human | 人类可读的内存占用 |
| memory | maxmemory | 内存上限 |
| stats | total_connections_received | 累计接收连接数 |
| stats | keyspace_hits / keyspace_misses | 命中/未命中次数, 可算命中率 |
| keyspace | db0 下的 keys / expires | 各库 key 总数与过期数 |
命中率可由 keyspace_hits / (keyspace_hits + keyspace_misses) 计算.
-- 看版本
select * from redis_info where key = 'redis_version'
-- 看内存相关
select * from redis_info where "group" = 'memory'
-- 看连接数
select * from redis_info where key = 'connected_clients'
-- 分页(默认按 skip/limit)
select * from redis_info limit 20
"group" = 'memory'.相关文档: redis-dao
redis_hash 对应 redis 的 hash 数据结构, 一个大 key 下有多个 field(小 key), 每个 field 各存一个值.
-- 查整个 hash(所有 field)
select * from redis_hash where key = 'h1'
-- 查单个 field, 用 大key.小key
select * from redis_hash where key = 'h1.f1'
HGETALL h1
HGET h1 f1
| 字段 | 类型 | 说明 |
|---|---|---|
| key1 | string | redis 大 key |
| key2 | string | redis 小 key(field) |
| value | string | field 对应的值 |
查整个 hash 时, 每个 field 返回一行; 查单个 field 时只返回一行.
| 指标 | 获取方式 | 说明 |
|---|---|---|
| 每个 field 值 | where key = 'h1' |
全量 field |
| 单个 field 值 | where key = 'h1.f1' |
指定 field |
| field 数量 | 对结果行 count | hash 中 field 的个数 |
| type | redis_scan | 恒为 hash |
| ttl | redis_scan | 整个 key 的过期时间 |
-- 查整个 hash
select * from redis_hash where key = 'user:1'
-- 查单个 field
select * from redis_hash where key = 'user:1.name'
-- 批量查多个 key
select * from redis_hash where key in ('h1', 'h2.f1')
key = 与 key in, 不支持 and 组合.大key.小key 指定, 不支持 field 名本身含点号的场景(会按第一个点号拆分).相关文档: redis-dao / dynamicSourceWrite
某些场景下,需要把当前查询的结果,临时写入到未提前定义的或者随时变更的数据库.
本工具提供了 dynamicSourceQuery 的反向操作, 无需建虚拟表可直接向临时数据源写入数据.
目前写入侧实现了 redis 数据源, 支持 string / hash / set / list / zset 五种结构.
sybn sql 支持在子查询(如 @last、@table、from (select ...))的右括号后追加 where / order by / limit 子句,对子查询的结果集进行过滤、排序、分页。
这种后置子句无需把子查询包装成额外的 select,语法更简洁。
-- 后置 where
... from (select ...) where 条件
-- 后置 order by
... from (select ...) order by 字段 [asc|desc]
-- 后置 limit
... from (select ...) limit N
-- 组合使用
... from (select ...) where 条件 order by 字段 [asc|desc] limit N
后置子句支持 mybatis 参数替换(
${param}/#{param})。
-- 后置 where + order by + limit 组合
select * from (
select 'tab1' as t
union select 'tab2' as t
union select 'tab3' as t
) where t != 'tab1' order by t desc limit 1;
-- 结果:[{t:'tab3'}]
-- 后置 order by + limit
select * from (
select 'tab1' as t union select 'tab2' as t union select 'tab3' as t
) order by t desc limit 1;
-- 结果:[{t:'tab3'}]
-- 后置 limit
select * from (
select 'tab1' as t union select 'tab2' as t union select 'tab3' as t
) limit 1;
-- 结果:[{t:'tab1'}]
-- 支持 mybatis 变量替换
select * from (
select 'tab1' as t union select 'tab2' as t union select 'tab3' as t
) where t != ${val} order by t desc limit 1;
-- 当 val='tab1' 时,结果:[{t:'tab3'}]
select * from (...)。return 用于在多语句流水线中提前返回结果并终止后续执行,类似编程语言中的 return 语句。
适用场景:
select ...; select ...; return [N | select 语句]
return:返回堆栈中最底层(最早)的结果。return N:返回堆栈中从底数第 N 个结果(0-based)。
return 0:返回第 0 个(最早)。return 1:返回第 1 个。return -1:返回最后一个(最新)。return -2:返回倒数第二个。return select ...:执行并返回指定的 select 语句。return (select ...):同上,括号包裹。-- return 不带参数:返回最早的 select 1
select 1;
select 2;
return;
-- 结果:1
-- return 0:返回第 0 个(最早)
select 1;
select 2;
return 0;
-- 结果:1
-- return 1:返回第 1 个
select 1;
select 2;
return 1;
-- 结果:2
-- return -1:返回最后一个(最新)
select 1;
select 2;
return -1;
-- 结果:2
-- return -2:返回倒数第二个
select 1;
select 2;
return -2;
-- 结果:1
-- return select:执行并返回指定的 select
select 1;
select 2;
return select 3 as r;
-- 结果:3
-- 在子查询中使用 return
select 9 from (
select 1;
select 2;
return select 3 as r
);
-- 结果:3
return 会立即终止当前流水线的后续语句。return 的索引是 0-based,负数表示从末尾倒数。return 可以出现在子查询中,只终止当前子查询的执行。