*Redis TOPK.RESERVE 命令
TOPK.RESERVE 创建一个 Top-K 概率数据结构,用于近似统计高频元素。
*语法
TOPK.RESERVE key k width depth decay
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | Top-K 结构键名 |
| k | Integer | 是 | Top-K 列表中保留的元素数量 |
| width | Integer | 是 | 每个深度层级的计数器数量,控制精度 |
| depth | Integer | 是 | 哈希函数(层级)数量,控制冲突概率 |
| decay | Double | 是 | 衰减因子,范围 0~1,用于计数器老化 |
*返回值
- OK:创建成功
- Error:参数错误、key 已存在或内存不足
*时间复杂度
O(1)
*
*示例
*创建 Top-K 结构
> TOPK.RESERVE mytopk 50 100 5 0.9
OK
*创建用于热门商品统计的 Top-K
> TOPK.RESERVE hot_products 10 200 7 0.925
OK
*创建用于日志分析的 Top-K
> TOPK.RESERVE error_ips 100 1000 10 0.95
OK
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 缺少必要参数 | 确保传入 k、width、depth、decay 四个参数 |
| ERR Top-K item must be greater than 0 | k 小于等于 0 | k 必须为正整数 |
| ERR Top-K width must be greater than 0 | width 小于等于 0 | width 必须为正整数 |
| ERR Top-K depth must be greater than 0 | depth 小于等于 0 | depth 必须为正整数 |
| ERR Top-K decay must be in [0, 1] | decay 超出范围 | decay 必须在 0 到 1 之间 |
| ERR key already exists | 键名已存在 | 使用其他键名,或先 DEL 旧键 |
*最佳实践
- 适用场景:热门查询统计、热门商品排行、异常 IP 发现、日志高频错误分析
- 参数调优:
- k 根据实际需要的 Top 数量设置
- width 越大精度越高,内存消耗也越大(建议 100~1000)
- depth 建议 5~10,深度越大冲突概率越低
- decay 通常设为 0.9~0.99,越小对新数据越敏感
- 内存估算:内存占用与 k × width × depth 成正比
- 生产环境创建前确认 key 不存在,避免覆盖
*FAQ
Q1: Top-K 和 Sorted Set 有什么区别? A: Top-K 是概率数据结构,使用固定内存近似统计高频项,适合海量数据流;Sorted Set 是精确结构,内存随元素增长。
Q2: decay 参数如何影响结果? A: decay 控制计数器衰减速度。值越小,旧数据遗忘越快,对新热点更敏感;值越大,历史数据权重越高,结果更稳定。
Q3: 如何查看 Top-K 的内存占用?
A: 使用 MEMORY USAGE key 查看具体内存消耗,或用 TOPK.INFO key 查看结构参数。