荣耀 通用软件开发-C++ 一面
1. 自我介绍
2. 实习工作介绍
3. 项目介绍
4. 这个缓存一致性与热点数据治理项目可以用在哪里
答案:这种组件适合读多写少、热点访问明显、对响应时间敏感的业务场景。典型应用位置包括:
- 配置数据本地缓存
- 商品详情和价格信息缓存
- 用户画像和标签查询缓存
- 推荐系统中的热点召回结果缓存
- 风控规则和字典信息缓存
- 网关中的路由规则缓存
- 业务服务中的热点元数据缓存
这些场景通常都有几个共同特点:
- 某些 key 访问频率远高于平均水平
- 大量请求读的是同一批热点数据
- 每次都访问远端存储成本高
- 对 RT 和吞吐比较敏感
所以本地缓存和热点治理组件在这类系统中很常见。
5. 为什么这个项目会比每次直接查数据库或远端缓存快很多
答案:它快的原因主要来自“把高频读尽量留在进程内处理”,减少跨进程、跨网络、跨存储层访问。
具体来说主要有几个原因:
- 本地缓存命中时,省掉了网络调用和序列化反序列化开销
- 避免数据库或远端缓存成为热点瓶颈
- 热点 key 命中后访问路径更短
- 通过异步刷新避免大量请求阻塞在回源路径上
- 通过热点治理和单飞机制减少并发回源风暴
尤其在热点 key 非常集中的场景下,如果没有本地缓存,可能大量请求都打到远端同一个 key;而有了本地缓存后,大部分请求可以在本进程内直接返回。
当然,这种优化的代价是要处理:
- 一致性问题
- 缓存失效问题
- 内存占用问题
- 热点数据更新问题
6. 简单介绍一下线程
答案:线程是 CPU 调度的基本单位,一个进程可以包含多个线程。同一进程内的线程共享大部分资源,比如:
- 代码段
- 堆
- 全局变量
- 打开的文件描述符
线程私有的部分一般包括:
- 栈
- 寄存器上下文
- 线程局部存储
线程的优势主要在于:
- 创建和切换成本比进程低
- 通信更方便
- 更适合并发执行多个任务
但线程也会带来典型问题:
- 数据竞争
- 锁竞争
- 死锁
- 可见性和同步问题
所以实际开发里线程往往要配合:
- 互斥锁
- 条件变量
- 原子操作
一起使用。
7. 假设有 100 个线程同时访问热点 key,这个缓存组件的优势在哪里
答案:如果有 100 个线程同时访问同一个热点 key,这个组件的优势主要体现在:
- 减少大量重复回源
- 降低数据库或远端缓存压力
- 保持热点请求的低延迟
- 避免线程都阻塞在慢路径上
如果没有治理策略,100 个线程可能同时发现缓存失效,然后一起去访问远端,这就是典型的缓存击穿。而这个组件可以通过一些机制减少问题:
- 本地缓存优先命中
- 针对热点 key 做单飞控制,只允许少量线程回源
- 其他线程等待结果或返回旧值
- 后台异步刷新,避免所有请求都走同步更新路径
这种设计在热点非常集中的业务里很重要,因为瓶颈往往不在 CPU,而在远端依赖和锁竞争。
8. 如果热点 key 失效瞬间有大量请求同时进来,会出现什么问题,怎么处理
答案:如果一个热点 key 刚好失效,而此时有大量请求同时到来,就可能出现:
- 多个线程同时回源
- 数据库或远端缓存被瞬时打爆
- 请求 RT 大幅上升
- 整体系统吞吐下降
- 某些线程长时间阻塞,进一步放大问题
常见处理方式有:
- 单飞机制:同一时刻只允许一个线程回源,其余线程等待或复用结果
- 逻辑过期:数据物理上不立刻删除,而是先返回旧值并异步刷新
- 热点不过期:对超热点 key 采用特殊保活策略
- 多级缓存:本地缓存 + 远端缓存配合
- 限流与降级:回源压力过大时做保护
9. 缓存组件的维护开销一般来自哪些部分
答案:缓存组件虽然能提升性能,但它的维护成本也很明显,主要来自几个方面:
- 缓存数据本身占用的内存
- 元数据维护,比如过期时间、版本号、访问频次
- 热点 key 统计和淘汰策略维护
- 多线程并发读写的同步开销
- 后台刷新任务和失效通知处理
- 监控、日志和调试埋点的附加成本
如果从内存角度看,开销包括:
- key/value 存储
- 哈希桶或索引结构
- 控制字段
- 可能存在的副本或旧版本缓存
如果从 CPU 角度看,开销主要包括:
- 哈希查找
- 淘汰策略计算
- 更新与失效处理
- 热点统计
- 锁或原子操作成本
所以缓存不是“白送的性能”,它本质上是用内存、复杂度和一致性管理,换取吞吐和时延表现。
10. 如果线上发现缓存命中率下降、数据库压力上升,你会怎么排查
答案:我一般会从“缓存本身、业务流量、更新链路、
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.