荣耀 通用软件开发-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++ 常考面试题总结 文章被收录于专栏

本专栏系统梳理C++方向, 大中厂高频高频面试考点 , 内容皆来自真实面试经历,从基础语法、内存管理、STL与设计模式,到操作系统与项目实战,结合真实面试题深度解析,帮助开发者高效查漏补缺,提升技术理解与面试通过率,打造扎实的C++工程能力.

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务