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注入,关键在响应拦截统一错误处理
相关推荐
青莲8431 天前
Java并发编程基础与进阶(线程·锁·原子类·通信)
android·前端·面试
YuTaoShao1 天前
【LeetCode 每日一题】1339. 分裂二叉树的最大乘积
算法·leetcode·职场和发展
leoufung1 天前
LeetCode 172. Factorial Trailing Zeroes 题解
算法·leetcode·职场和发展
天才测试猿1 天前
软件测试之bug分析定位技巧
软件测试·python·selenium·测试工具·职场和发展·测试用例·bug
进击的小头1 天前
18_C语言算法面试与进阶:高频算法题实战与学习路线规划
c语言·算法·面试
秋天的一阵风1 天前
🌟 藏在 Vue3 源码里的 “二进制艺术”:位运算如何让代码又快又省内存?
前端·vue.js·面试
CCPC不拿奖不改名1 天前
python基础:python语言的数据结构+面试习题
开发语言·数据结构·python·面试
程序员良辰1 天前
【面试读心术】OJ系统面试深度解析 - 从“一问三不知“到“对答如流“的蜕变
android·面试·职场和发展
程序员小远1 天前
接口自动化测试知识总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试