*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 判断指定元素是否在榜,适合逻辑判断和过滤场景。