Files
autumn-recruitment/03.Redis/strategies/HeavyKeeper热点探测算法_test.md
T

151 lines
7.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: [test/review, redis, heavykeeper, hot-key-detection, top-k, count-min-sketch]
create time: 2026-08-09 12:00
---
# HeavyKeeper热点探测算法_测试题
## 概述
本测试覆盖 HeavyKeeper 作为在线 Top-K 热点检测算法的核心原理,包括 Fading Count 概率衰减、双计数器结构、最小堆淘汰机制及与其他方案的对比。共 10 道题:6 道选择题、3 道填空题、1 道简答题。
---
## 一、选择题(6道,由浅入深)
> **难度阶梯**: Q1-Q2 基础概念 → Q3-Q4 核心原理 → Q5-Q6 深入应用/边界场景
### Q1(基础)— 考察定义层面
HeavyKeeper 是一个什么样的算法?
A. 离线批量排序算法,需要对全量数据排序后取 Top-K
B. 在线流式计数算法,以 O(K) 空间复杂度实时维护访问量最高的 K 个 key
C. 基于规则的热点阈值告警系统
D. 用于 Redis 集群分片的负载均衡算法
### Q2(基础)— 考察行为判断
HeavyKeeper 的 Fading Count 衰减公式为:`new_count = old_count * (1 - alpha) + alpha`。当 alpha 取值较大(接近 1)时,会发生什么?
A. 计数器衰减极慢,能长期记住热点
B. 计数器衰减快,对突发热点更敏感但不稳定
C. 计数器不再衰减,变成固定计数
D. 计数器变成负数
### Q3(进阶)— 考察核心原理
HeavyKeeper 采用双计数器结构(Main Counter + Error Counter),与 Count-Min Sketch 相比的关键优势是什么?
A. HeavyKeeper 使用了更多的 hash 函数
B. Error Counter 可以估计碰撞干扰并从 Main Counter 中减去,大幅降低误报率
C. HeavyKeeper 不需要最小堆来维护 Top-K
D. Error Counter 比 Main Counter 有更高的精度
### Q4(进阶)— 考察对比辨析
在空间复杂度方面,HeavyKeeper 的典型配置是 m=4, K=1000(每个计数器 uint32,4 bytes),总空间约为:
A. 4KB
B. 16KB
C. 64KB
D. 256KB
### Q5(深入)— 考察场景推理
在一个高并发的电商秒杀场景中,HeavyKeeper 部署在每个应用服务端实例上监控各 SKU 的访问热度。当发现某个 SKU 进入 Top-K 时,自动触发的优化措施是:
A. 将该 SKU 的所有请求转发到单一的 Redis 节点处理
B. 触发本地缓存预热或多实例分片隔离
C. 暂停对该 SKU 的所有写操作
D. 将所有请求排队等待统一处理
### Q6(深入)— 考察源码级别细节
HeavyKeeper 的 estimateFrequency 方法在查询某个 key 的真实频率时,是如何利用两个计数器表的?
A. 取 m 个表中 Main Counter 的最大值加上 Error Counter 的最小值
B. 取 m 个表中 Main Counter 的最小值减去 Error Counter 的最大值
C. 取 m 个表中 Error Counter 的最小值减去 Main Counter 的最大值
D. 对所有 m 个表的两个计数器求和取平均
---
## 二、填空题(3道)
### F1 — 填空
HeavyKeeper 内部维护一个大小为 K 的 ______ 来保留当前访问量最高的 K 个 key。只有新元素的估计频率大于堆顶时才有机会进入 Top-K。
> **提示**: 堆的顶部是最小还是最大的元素?
### F2 — 填空
HeavyKeeper 的空间复杂度为 O(m × K),其中 m 是计数表的行数(hash 函数数,通常取 ______ ~ 8),K 是要维护的 Top-K 大小。
> **提示**: m 的典型下限值是多少?
### F3 — 填空
生产环境中 HeavyKeeper 的 alpha 参数一般取 ______ ~ 0.05,alpha 越大衰减越快、响应突发热点但不稳定;alpha 小则衰减慢、能记住长期热点但对突发反应迟钝。
> **提示**: 回顾文档中的调优经验。
---
## 三、简答题(1道)
### S1
一个视频网站的 CDN 调度系统需要实时监控全球边缘节点的资源访问热度。需求如下:
- 每秒约有 1 亿次访问请求
- 需要找出 Top-1000 的热度内容
- 需要能快速感知新冒出的热点(应对突发事件如热门视频发布)
- 不能承受过高的内存开销
请设计一个基于 HeavyKeeper 的热点检测方案,说明:
1. 部署架构(在哪里部署 HeavyKeeper 实例?)
2. Alpha 参数的选择依据
3. 为什么选择 HeavyKeeper 而非 Count-Min Sketch?
> **答题框架提示**:
1. 部署位置和聚合策略
2. Alpha 参数对突发敏感度的影响
3. HeavyKeeper vs CMS 的核心差异
---
## 参考答案与解析
### 选择题答案
| 题号 | 正确答案 | 解析 |
|------|---------|------|
| Q1 | B | HeavyKeeper 是美团开源的在线 Top-K 热点检测算法,能够在 O(K) 空间复杂度的前提下以极低计算开销实时维护访问量最高的 K 个 key。它具有抗误报、自适应衰减的能力。A 错误——它是流式在线算法而非离线批处理。 |
| Q2 | B | alpha 越大衰减越快,对突发热点更敏感但也更不稳定。alpha 小则衰减慢能记住长期热点但对突发反应迟钝。这是一个需要权衡的参数。 |
| Q3 | B | HeavyKeeper 的双计数器结构中,Error Counter 专门用来估计其他冲突 key 可能造成的虚假抬高值。真实频率 ≈ Main Counter 最小值 - Error Counter 最大值。这是相比 CMS 的关键改进——CMS 没有误差补偿,所有 collision 都被计入。 |
| Q4 | B | m=4, K=1000 → 4 × 1000 = 4000 个计数器 × 4 bytes = 16KB。极其紧凑!这也是 HeavyKeeper 工程落地的最大优势之一。 |
| Q5 | B | 发现热点 SKU 后自动触发本地缓存预热(L1)或多实例分片隔离,让不同用户的请求打散到多个 Redis 实例,避免单个实例被打垮。 |
| Q6 | B | estimateFrequency 的核心:取 m 个表中 Main Counter 的最小值(与 CMS 一致),减去 Error Counter 的最大值(HeavyKeeper 的独有贡献),得到估计的真实频率。如果结果小于 0 则返回 0。 |
### 填空题答案
| 题号 | 答案 | 解析 |
|------|------|------|
| F1 | 最小堆(min-heap) | 最小堆的堆顶是当前 Top-K 中最小的元素。新元素只有大于堆顶时才可能进入 Top-K,否则忽略。弹出堆顶插入新元素维持堆大小不变。 |
| F2 | 4 | m 是计数表行数(hash 函数数),通常取 4~8。更多行能提高精度但增加内存和计算开销。典型配置 K=1000, m=4 仅需 16KB。 |
| F3 | 0.01 | 生产环境中 alpha 一般取 0.01~0.05,根据业务流量特征实验确定。大 alpha 对突发敏感但容易抖动,小 alpha 稳定但对突发反应迟钝。 |
### 简答题参考答案
S1:**参考答案要点**:
1. 部署架构:在每个应用服务端实例上部署 HeavyKeeper 实例统计 local key 的 QPS,然后定期(如每秒)将所有实例的局部 Top-K 合并到全局 Top-K。或者在网关层统一部署一个 HeavyKeeper 收集所有流量的完整视图(更精确但单点压力大)。
2. Alpha 参数选择:取 0.03~0.05 偏大值。原因:视频网站热点可能突然爆发(如新剧上线),需要快速感知突发热点。较小的 alpha 虽然稳定但响应延迟偏高。
3. HeavyKeeper vs CMS 的核心差异:CMS 只有上界没有下界,所有 collision 都被计入 Main Counter 导致误报率高;HeavyKeeper 通过 Error Counter 减去估计的碰撞干扰,大幅降低误报率。此外 HeavyKeeper 原生支持 Top-K(通过最小堆),而 CMS 需要外部维护。
**评分标准**:答出任意 2 个要点即可得满分;完全正确需覆盖部署架构、alpha 选择依据和算法对比三个维度。
## 关联笔记
- [[03.Redis/strategies/多级缓存架构设计]]
- [[03.Redis/strategies/缓存穿透击穿雪崩解决方案]]
- [[03.Redis/core/集群与哨兵机制]]