redis_zset 对应 redis 的 zset(有序集合)数据结构, 每个 member 关联一个 score, 结果按 score 升序, 每个成员一行.
select * from redis_zset where key = 'z1'
ZRANGE z1 0 9999 WITHSCORES
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | redis key |
| value | string | zset 成员(member), key 不存在时无行 |
| score | double | 成员对应的分数(按 score 升序) |
| 指标 | 获取方式 | 说明 |
|---|---|---|
| member 列表 | where key = 'z1' |
按 score 升序, 带分数 |
| member 数量 | 对结果行 count | 等于 ZCARD |
| 单个 score | 结果中的 score 列 | 指定 member 的分值 |
| type | redis_scan | 恒为 zset |
| ttl | redis_scan | key 的过期时间 |
-- 查全部 member(默认上限 10000)
select * from redis_zset where key = 'rank:1'
-- limit 限制成员行数
select * from redis_zset where key = 'rank:1' limit 100
-- 批量查
select * from redis_zset where key in ('rank:1', 'rank:2')
key = 与 key in, 不支持 and 组合.相关文档: redis_set / redis-dao / dynamicSourceWrite
redis_string 是 redis 五种虚拟表之一, 对应 redis 的 string 数据结构, 用于读写单个 key-value.
select * from redis_string where key = 'k1'
select * from redis_string where key in ('k1', 'k2')
GET k1
MGET k1 k2
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | redis key |
| value | string | key 对应的值, key 不存在时为 null |
| 指标 | 获取方式 | 说明 |
|---|---|---|
| value | where key = 'k' |
字符串值 |
| type | redis_scan | 恒为 string |
| ttl | redis_scan | -1 永久, -2 不存在, 正数为剩余秒数 |
| exists | key 命中即存在 | 是否存在该 key |
-- 查单个
select * from redis_string where key = 'user:1'
-- 批量查
select * from redis_string where key in ('user:1', 'user:2')
-- 只取值(投影)
select value from redis_string where key = 'user:1'
key = 与 key in, 不支持 and 组合.相关文档: redis-dao / dynamicSourceWrite
两张虚拟表都对应 redis 的 set 数据结构, 元素无序且不重复, 区别只在结果形态:
| 虚拟表 | 形态 | value 类型 | limit 限制 | 适用场景 |
|---|---|---|---|---|
| redis_set | 一行一个 key(聚合) | string[] 数组 | key 数 | key 多, 每 key 成员少 |
| redis_set_member | 一行一个成员(展开) | string 标量 | 成员行数(跨 key) | key 少, 成员多 |
-- 聚合: 一行一个 key, value 为成员数组
select * from redis_set where key in ('tags:1', 'tags:2')
-- 展开: 一行一个成员
select * from redis_set_member where key = 'tags:1' limit 100
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 组合.相关文档: redis_list / redis_zset / redis-dao / dynamicSourceWrite
redis_scan 用于按通配符搜索 redis 中的 key, 底层基于 SCAN 游标, 不会阻塞 redis.
redis_scan 与 redis_scan_type 同源: 前者按需返回 type / ttl(select 中写了才查), 后者固定返回这两列.
-- 只取 key
select * from redis_scan where key = 'user:*' limit 100
-- 顺带取类型和过期时间(按需, 写哪列查哪列)
select key, type, ttl from redis_scan where key = 'user:*' limit 20
-- 等价写法: redis_scan_type 固定返回 key, type, ttl
select * from redis_scan_type where key = 'user:*' limit 20
即 redis_scan_type 等价于 select key, type, ttl from redis_scan.
SCAN 0 MATCH user:* COUNT 100
TYPE <匹配到的 key>
TTL <匹配到的 key>
只有 select 中包含 type / ttl(或使用 redis_scan_type)时, 才会对每个 key 额外执行 TYPE / TTL.
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | 匹配到的 key |
| type | string | 数据类型: string/hash/list/set/zset; 按需返回 |
| ttl | long | -1 永久, -2 不存在, 正数为剩余秒数; 按需返回 |
精确 key(不含 * / ?)直接走 TYPE + TTL, 不触发全库扫描; key 不存在时该行被跳过.
| 指标 | 获取方式 | 说明 |
|---|---|---|
| 匹配的 key | where key = 'user:*' |
支持 * / ? 通配符 |
| key 的类型 | select key, type ... |
判断该用哪张虚拟表读写 |
| key 的过期时间 | select key, ttl ... |
-1 永久, -2 不存在 |
| 各类型分布 | 按 type 分组 | 统计每种数据结构各有多少 key |
| 即将过期数量 | 按 ttl 区间过滤 | ttl 为正数的 key 数量 |
| 匹配数量 | 对结果行 count | 受 limit 限制 |
-- 搜索 key
select * from redis_scan where key = 'user:*' limit 100
-- 分页
select * from redis_scan where key = 'user:*' skip 100 limit 100
-- 顺带取类型和过期时间
select key, type, ttl from redis_scan where key = 'user:*' limit 20
-- 精确 key 查类型(不扫全库)
select * from redis_scan_type where key = 'k1'
-- 批量看类型
select * from redis_scan_type where key in ('k1', 'k2')
* / ? 为通配符; 不带 type/ttl 时默认 limit 100, 带 type/ttl(scan_type)时默认 limit 20.相关文档: redis_randomkey / redis-dao
redis_randomkey 用于从 redis 中随机取出 key, 底层基于 RANDOMKEY 命令, 适用于抽样查看数据.
select * from redis_randomkey limit 20
RANDOMKEY
limit 指定调用多少次 RANDOMKEY.
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | 随机得到的 key |
| 指标 | 获取方式 | 说明 |
|---|---|---|
| 随机 key | limit N | 随机抽样, 不保证不重复 |
| 样本数量 | 对结果行 count | 等于 limit(库非空时) |
-- 随机取 20 个 key
select * from redis_randomkey limit 20
相关文档: redis_scan / redis-dao
redis_randomkey_type 在 redis_randomkey 的基础上, 对随机取出的 key 额外返回数据类型和过期时间, 适合随机抽样排查.
select * from redis_randomkey_type limit 20
RANDOMKEY
TYPE <随机到的 key>
TTL <随机到的 key>
| 字段 | 类型 | 说明 |
|---|---|---|
| key | string | 随机得到的 key |
| type | string | 数据类型: string/hash/list/set/zset |
| ttl | long | -1 永久, -2 不存在, 正数为剩余秒数 |
| 指标 | 获取方式 | 说明 |
|---|---|---|
| 随机 key 类型 | type 列 | 抽样判断库内类型分布 |
| 过期时间 | ttl 列 | 抽样看是否有 key 即将过期 |
| 样本数量 | 对结果行 count | 等于 limit(库非空时) |
-- 随机取 20 个 key 及其类型
select * from redis_randomkey_type limit 20
相关文档: redis_randomkey / redis_scan / redis-dao