两张虚拟表都对应 redis 的 set 数据结构, 元素无序且不重复, 区别只在结果形态:
| 虚拟表 | 形态 | value 类型 | limit 限制 | 适用场景 |
|---|---|---|---|---|
| redis_set | 一行一个 key(聚合) | string[] 数组 | key 数 | key 多, 每 key 成员少 |
| redis_set_member | 一行一个成员(展开) | string 标量 | 成员行数(跨 key) | key 少, 成员多 |
等效 DQL
- 虚拟表 SQL
-- 聚合: 一行一个 key, value 为成员数组
select * from redis_set where key in ('tags:1', 'tags:2')
-- 展开: 一行一个成员
select * from redis_set_member where key = 'tags:1' limit 100
- 等效 redis 原生命令
SRANDMEMBER tags:1 10000
注意: 查询侧底层用的是 SRANDMEMBER(随机取), 而不是 SMEMBERS. 当 set 元素个数不超过请求数量时返回全部成员, 二者等价; 超大 set 为随机采样, 不保证取全.
返回字段
redis_set(聚合):
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | redis key |
| value | string[] | set 成员, key 不存在时为空数组 |
redis_set_member(展开):
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | redis key |
| value | string | set 成员, key 不存在时无行 |
可查指标
| 指标 | 获取方式 | 说明 |
|---|---|---|
| 成员列表(聚合) | redis_set where key = 's1' |
一行拿到全部成员数组 |
| 成员列表(展开) | redis_set_member where key = 's1' |
每个成员一行, 可直接 where/join |
| 成员数量 | 聚合取 value size / 展开对行 count | 元素不超过 1 万时等于 SCARD |
| type | redis_scan | 恒为 set |
| ttl | redis_scan | key 的过期时间 |
查询示例
-- 聚合: 查成员数组
select * from redis_set where key = 'tags:1'
-- 聚合: 批量查, limit 限制 key 数
select * from redis_set where key in ('tags:1', 'tags:2') limit 10
-- 展开: 每个成员一行
select * from redis_set_member where key = 'tags:1'
-- 展开: limit 限制成员行数
select * from redis_set_member where key = 'tags:1' limit 100
-- 展开: limit 跨 key 累计, 第一个 key 取完接着取第二个
select * from redis_set_member where key in ('tags:1', 'tags:2') limit 150
限制
- 只支持
key =与key in, 不支持 and 组合. - 默认上限 10000(聚合为 key 数, 展开为成员行数); 超大 set 为随机采样, 不保证取全.
- 不支持 group by / order by(请在外层 SQL 中完成).
- key 不是 set 类型时返回”数据类型错误”.
相关文档: redis_list / redis_zset / redis-dao / dynamicSourceWrite