*Redis TOPK.QUERY 命令
TOPK.QUERY 查询一个或多个元素是否在当前 Top-K 列表中。
*语法
TOPK.QUERY key item [item ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Top-K 结构键名 |
| item | String / Bytes | 是 | 要查询的元素,支持多个 |
*返回值
- Array:对每个查询的元素,返回 1(在 Top-K 列表中)或 0(不在列表中)
*时间复杂度
O(1) 每个元素。
*示例
*查询单个元素
> TOPK.RESERVE mytopk 3 100 5 0.9
OK
> TOPK.ADD mytopk apple banana cherry
1) ""
2) ""
3) ""
> TOPK.QUERY mytopk apple
1) (integer) 1
> TOPK.QUERY mytopk date
1) (integer) 0
*批量查询多个元素
> TOPK.QUERY mytopk apple banana date fig
1) (integer) 1
2) (integer) 1
3) (integer) 0
4) (integer) 0
*热门商品判断
> TOPK.RESERVE hot_products 10 200 7 0.925
OK
> TOPK.ADD hot_products phone laptop tablet phone phone
1) ""
2) ""
3) ""
4) ""
5) ""
> TOPK.QUERY hot_products phone watch
1) (integer) 1
2) (integer) 0
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 缺少 key 或 item | 确保至少传入 key 和一个 item |
| WRONGTYPE | key 不是 Top-K 类型 | 确认 key 由 TOPK.RESERVE 创建 |
| ERR key does not exist | Top-K 结构不存在 | 先用 TOPK.RESERVE 初始化 |
*最佳实践
- 适用场景:快速判断元素是否属于高频项、黑名单/白名单过滤、热点数据缓存判断
- 批量查询多个元素可减少网络往返,提升性能
- 返回 0 仅表示元素不在当前 Top-K 列表中,不代表元素从未出现过
- 可与 TOPK.COUNT 配合使用:QUERY 做快速布尔判断,COUNT 获取详细频率
*FAQ
Q1: TOPK.QUERY 返回 0 表示元素一定没出现过吗? A: 不是。0 只表示元素不在当前的 Top-K 列表中,它可能曾经出现但频率不够高,或被其他高频元素挤出。
Q2: 批量查询时返回数组的顺序和输入一致吗? A: 是的,返回值数组的顺序与输入 item 的顺序一一对应。
Q3: QUERY 和 LIST 怎么配合使用? A: LIST 获取完整 Top-K 元素,适合展示排行榜;QUERY 判断指定元素是否在榜,适合逻辑判断和过滤场景。