*Redis CMS.QUERY 命令
CMS.QUERY 返回 Count-Min Sketch 中一个或多个 item 的计数值。
*语法
CMS.QUERY key item [item ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Sketch 的键名 |
| item | String | 是 | 要查询计数的 item,支持多个 |
*返回值
- Array of Integers:返回数组,每个元素对应一个 item 的计数值(min-count)
- Error:参数错误、键不存在,或键类型错误
*时间复杂度
O(n),其中 n 是 item 的数量
*示例
*查询单个 item
> CMS.INITBYDIM test 2000 5
OK
> CMS.INCRBY test foo 10
1) (integer) 10
> CMS.QUERY test foo
1) (integer) 10
*批量查询多个 item
> CMS.INCRBY test foo 10 bar 42 baz 7
1) (integer) 10
2) (integer) 42
3) (integer) 7
> CMS.QUERY test foo bar baz
1) (integer) 10
2) (integer) 42
3) (integer) 7
*查询不存在的 item
> CMS.QUERY test notexist
1) (integer) 0
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 未提供 item | 至少提供一个要查询的 item |
| ERR key does not exist | key 不存在 | 先用 CMS.INITBYDIM 或 CMS.INITBYPROB 初始化 |
| WRONGTYPE | key 不是 CMS 类型 | 确认 key 正确,或重新初始化 |
*最佳实践
- 批量查询优于多次单条查询,减少网络往返
- 查询结果是近似值,可能略高于真实计数(Count-Min Sketch 的特性)
- 高频 item 的误差通常较小,低频 item 的相对误差可能较大
- 适合用于高频计数统计、热门内容分析、流量分析等场景
*FAQ
Q1: 查询结果准确吗? A: 查询结果是近似值,可能略高于真实计数,但不会低于真实计数。这是 Count-Min Sketch 算法的固有特性。
Q2: 查询不存在的 item 返回什么? A: 返回 0。由于 CMS 算法特性,不会返回负值。
Q3: CMS.QUERY 和 CMS.INCRBY 返回的计数一致吗? A: 是的,两者都返回 min-count(对应计数器中的最小值)。INCRBY 返回的是更新后的计数,QUERY 返回的是当前计数。