10个高并发场景的技术面试问题

1. Redisson锁自动续期机制

Redisson的分布式锁采用"看门狗"(Watchdog)机制实现自动续期。当客户端成功获取锁后,会启动一个后台线程,默认每隔30秒检查业务是否仍在执行。如果锁未被释放且业务仍在进行,看门狗会自动将锁的过期时间重置为初始值(默认30秒),从而避免业务执行时间超过锁有效期导致的意外释放问题。这一机制确保了长任务场景下锁的可靠性。

2. 本地缓存线程安全设计

本地缓存的线程安全实现通常基于以下策略:

采用ConcurrentHashMap作为存储容器,利用分段锁技术降低锁竞争

写操作采用细粒度锁或CAS操作,读操作无锁化提升性能

对于缓存淘汰策略(如LRU),需结合读写锁或乐观锁机制

热点数据考虑使用AtomicReference或ThreadLocal进行优化

3. HashMap扩容过程

HashMap的扩容操作发生在元素数量超过容量×负载因子时:

创建容量为原数组2倍的新数组

遍历旧数组中的每个桶(bucket)

对每个桶中的节点重新计算hash值,确定在新数组中的位置

Java 8+优化:当链表长度>8且数组长度≥64时转换为红黑树

迁移完成后,旧数组被GC回收,新数组开始服务

4. 慢查询处理方法

定位阶段:

开启数据库慢查询日志,设置阈值(如1秒)

使用Explain分析执行计划,关注全表扫描、临时表、文件排序等

优化策略:

优化索引设计:添加缺失索引、删除冗余索引

重构SQL语句:避免SELECT *、优化JOIN顺序

数据表优化:分表分库、归档历史数据

引入缓存层:对热点查询结果进行缓存

5. 拥塞控制与流量控制原理

流量控制(基于接收方能力):

采用滑动窗口机制,接收方通过窗口大小通告自身处理能力

防止发送方发送数据过快导致接收方缓冲区溢出

拥塞控制(基于网络状况):

慢启动:初始拥塞窗口较小,每收到一个ACK窗口加倍

拥塞避免:窗口达到阈值后线性增长

快重传:收到3个重复ACK立即重传丢失包

快恢复:拥塞窗口减半后直接进入拥塞避免阶段

6. QPainter用途与场景

QPainter是Qt框架中的2D绘图工具,核心应用包括:

自定义控件开发:绘制特殊风格的UI组件

数据可视化:绘制图表、曲线图、柱状图等

图像处理:图片滤镜、合成、特效实现

游戏开发:2D游戏场景和角色渲染

工业界面:流程图、监控面板、实时数据展示

7. 红黑树特性及插入流程

五大特性:

每个节点非红即黑

根节点为黑色

叶子节点(NIL)为黑色

红色节点的子节点必须为黑色

从任意节点到其所有叶子节点的路径包含相同数量的黑色节点

插入流程:

按照二叉搜索树规则插入新节点(初始为红色)

若父节点为黑,直接插入完成

若父节点为红,需根据叔节点颜色调整:

叔节点为红:父辈节点变色,向上递归处理

叔节点为黑:通过旋转(左旋/右旋)和变色恢复平衡

8. 服务熔断降级策略

熔断机制:

错误率或响应时间超过阈值时,熔断器打开

后续请求直接快速失败,不再调用下游服务

经过冷却时间后进入半开状态,试探性放行部分请求

降级策略:

返回默认值:展示兜底数据或友好提示

功能简化:关闭非核心功能,保留主流程

缓存降级:返回缓存数据,即使数据可能过时

异步化处理:将非实时操作转为异步任务

9. 跨地域部署一致性解决方案

强一致性方案:

使用分布式共识算法:Raft、Paxos、ZAB

适用金融交易、配置管理等必须强一致场景

代价是跨地域延迟较高,可用性受影响

最终一致性方案:

多活架构结合消息队列异步同步

采用冲突解决策略:时间戳、版本向量、业务规则

使用分布式事务方案:TCC、Saga、可靠消息

混合方案:

关键数据强一致,非关键数据最终一致

本地读优化,跨地域写同步

10. 前端代码编写与Ajax接口调用

Ajax调用最佳实践:

javascript 复制代码
// 1. 封装统一请求函数
const apiClient = axios.create({
  baseURL: process.env.API_BASE,
  timeout: 10000,
  headers: { 'Content-Type': 'application/json' }
});

// 2. 请求拦截器(Token注入)
apiClient.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) config.headers.Authorization = `Bearer ${token}`;
  return config;
});

// 3. 响应拦截器(统一错误处理)
apiClient.interceptors.response.use(
  response => response.data,
  error => {
    if (error.response?.status === 401) {
      // Token过期处理
      router.push('/login');
    }
    return Promise.reject(error);
  }
);

// 4. 请求加载状态管理
const useApi = (url, options) => {
  const [loading, setLoading] = useState(false);
  const [data, setData] = useState(null);
  
  const fetchData = useCallback(async () => {
    setLoading(true);
    try {
      const result = await apiClient(url, options);
      setData(result);
    } finally {
      setLoading(false);
    }
  }, [url, options]);
  
  return { loading, data, refetch: fetchData };
};

关键注意事项:

跨域问题:配置CORS或使用代理

请求防抖:避免频繁触发相同请求

错误重试:对网络错误实现指数退避重试

安全防护:CSRF Token、XSS防护、输入验证

序号 主题 核心要点
1 Redisson锁自动续期机制 基于"看门狗"(Watchdog)机制,默认每30秒检测业务进度,未完成则重置锁过期时间
2 本地缓存线程安全设计 使用ConcurrentHashMap存储,写操作加锁,考虑分段锁降低竞争
3 HashMap扩容过程 元素超阈值时创建2倍新数组,遍历旧桶重新计算hash分配节点
4 慢查询处理方法 通过慢日志定位,优化索引/SQL/表结构,拆分大查询或引入缓存
5 拥塞控制与流量控制原理 流量控制靠滑动窗口管理接收能力,拥塞控制用慢启动/拥塞避免/快重传/快恢复四阶段
6 QPainter用途与场景 Qt绘图工具,用于自定义控件、数据可视化、游戏渲染等场景
7 红黑树特性及插入流程 特性:根黑叶黑、红节点子必黑、路径黑节点数相同;插入需处理叔节点颜色并旋转
8 服务熔断降级策略 熔断在错误率超标时切断请求,降级通过缓存/默认值/功能开关保障基础服务
9 跨地域部署一致性解决方案 用Raft/Paxos协议保证强一致,或多活架构配合消息队列做最终一致
10 前端代码编写与Ajax接口调用 Ajax调用需处理跨域、加载状态、Token注入,关键在响应拦截统一错误处理
相关推荐
三川69811 小时前
面试题目记录
面试·职场和发展
程序员杰哥11 小时前
性能测试详解
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·性能测试
让我上个超影吧11 小时前
【力扣76】最小覆盖子串
算法·leetcode·职场和发展
想进个大厂13 小时前
代码随想录day29 贪心03
算法·leetcode·职场和发展
闻哥14 小时前
从 AJAX 到浏览器渲染:前端底层原理与性能指标全解析
java·前端·spring boot·ajax·okhttp·面试
丁一郎学编程15 小时前
面试的面经
面试
阿蒙Amon15 小时前
C#每日面试题-Task和Thread的区别
java·面试·c#
橘颂TA16 小时前
【剑斩OFFER】算法的暴力美学——力扣 1020 题:飞地的数量
数据结构·c++·算法·leetcode·职场和发展·结构与算法
蒹葭玉树17 小时前
【C++上岸】C++常见面试题目--网络篇(第二十六期)
网络·c++·面试
码农水水18 小时前
米哈游Java面试被问:Shenandoah GC的Brooks Pointer实现机制
java·开发语言·jvm·spring boot·redis·安全·面试