八股基础-JAVA
前言感觉八股背诵的针对性不强,来对简历里面已写的进行一个排查。
专业技能描述掌握 Java 语法,熟悉集合、反射、IO,了解 JUC 并发编程,熟悉 JVM 垃圾回收、内存模型,熟悉线程池原理,掌握常⻅的设计模式。
内容集合
HashMap 的底层实现原理是什么?JDK 1.8 做了哪些重要优化?HashMap 是线程安全的吗?如果不安全,有哪些替代方案?
原理:数组 + 链表/红黑树。通过 key 的 hashCode() 计算哈希值,再通过扰动函数(高 16 位异或低 16 位)和 (n-1) & hash 确定数组下标。哈希冲突时,JDK 1.7采用头插法形成链表,JDK 1.8 采用尾插法。当链表长度超过阈值(默认 8)且数组长度 >= 64 时,链表转化为红黑树(提升查找效率);当红黑树节点数小于阈值(默认 6)时,退化为链表。
JDK 1.8 优化:
数据结构: 引入红黑树,解决长链表查询效率低的问题(O(n) -> O(log n))。
插入方式: 链表由头插法改为尾插法(避免多线程扩容时可能的死循环问题,虽然 HashMap 本身线程不安全) ...
面试经验-拼多多一面
前言比较体现自身能力的一次面试,项目问的比较多,对答如流,但八股问的比较少而且我都不会。
内容自我介绍
学校背景
有较长时间实习经历
通过读文档、源码很快适应工作
合作完成中期交付并上线
工作之余我还参加了一些比赛,考了一些证件
介绍一下项目主要是做什么的
核心目标
主要功能
使用的技术
看到你们有用到 Redis,是怎么集成进去的,用的什么缓存策略
旁路缓存
主要存了一些,没必要持久化的状态变量
功能背景
使用了 String 存了点赞数、Hash 存了直播间状态变量、ZSet 存了直播消息、弹幕、举手等用 timestamp 作为 score
举例子
我看到你说使用了 Session,主要存放的是什么,知道 JWT 吗
因为 JWT 是携带 token,每次访问 API 都要从数据库中拿用户数据,如果分表了就时间比较长,对用户不友好
Session 存放的是用户登录数据,因为我们有个泛在化学习空间
功能背景
需要存放一些要同步的数据
文档光标协同这个是怎么做的
从直播间 Hash 中有一个文档 ID,然后去 Redis 中重新找一下 ZSet
每个用户每输入一次就需要更改 ...
面试模拟-基础知识
面试官: 最后问几个基础原理问题,确认一下你的底层知识:
JUC 并发Q1. ConcurrentHashMap 在 Java 8 中是如何保证线程安全的?
Q2. 它与 synchronized 锁整个 Map 相比优势在哪里?
Q3. putVal 方法大致流程?
JVM 内存Q1. 老年代发生 Full GC 的触发条件可能有哪些?
A1. 年代空间不足(Promotion Failed)或 Metaspace 溢出。
Q2. 如何从 JVM 参数和代码层面尽量避免频繁 Full GC?
Redis 持久化Q1. RDB 和 AOF 持久化方式的主要区别是什么?各自的优缺点?
Q2. 如果同时开启,Redis 重启时如何加载数据?
RocketMQ 存储Q1. RocketMQ 是如何保证消息持久化且能高效读写的?(CommitLog, ConsumeQueue 的设计思想)
MySQL 索引Q1. 有一个查询 SELECT * FROM orders WHERE user_id = 100 AND status = ‘SHIPPED’ ORDER BY create_time ...
面试模拟-架构演进与DDD实践
内容面试官: 你提到主导了直播与互动教室核心服务的架构演进,引入了 DDD 和基于 Docker 的水平伸缩。
DDD 实践与限界上下文划分依据你提到用 DDD 解耦了信令、媒体流、状态同步服务。假设在“举手提问”场景中:
Q1. 信令服务(处理举手请求)、媒体流服务(调整视频流焦点)、状态同步服务(广播举手状态)之间的数据流如何设计?
Q2. 这三个服务的领域模型(实体/值对象)具体包含哪些属性?它们之间的上下文映射(如防腐层)如何实现?
微服务拆分权衡Q1. 媒体流服务若进一步拆分为“视频编解码”和“传输控制”两个微服务,你认为是否合理?请从 CAP 理论(一致性 vs 可用性)和部署成本(资源占用、运维复杂度)角度分析利弊。
水平伸缩与状态管理Q1. 媒体流服务单节点承载用户量提升 5-40 倍,这个提升是如何实现的?主要是 Docker/K8s 带来的,还是架构优化(比如连接复用、协议优化)带来的,或者是两者结合?
Q2. 进行水平伸缩时,如何解决有状态服务(比如 WebSocket 连接、媒体会话状态)的问题?用了什么方案?(如将状态外置到 Redis/数据库?使用 Stic ...
面试模拟-RocketMQ
内容面试官: 你项目中用 RocketMQ 解决协同编辑冲突和保证最终一致性的设计非常关键。
消息模型选择Q1. 你说采用了集群/广播模式适配不同场景。能分别举个具体场景的例子说明为什么选集群模式,为什么选广播模式吗?
A1. 先说一下广播消费场景
广播消费不支持顺序消息,不支持重置消费位点,消费进度由客户端维护。那么我们的场景就限定在了容忍无顺序消费,且所有客户端都需要该消息的情况。
根据已有业务,我们在媒体流同步方面使用了广播消费模式,因为用户连接到的服务器实例是不可预知的,所以对于每一个实例,我们都需要同步直播间所有媒体流信息。而且媒体流信息和顺序无关,只需最终一致性即可。
集群消费支持顺序消息,支持重置消费位点,消费进度由服务端维护。那么我们的场景就限定在了需要顺序消费,且消息只需被一个消费者消费,适用于服务解耦的情况。
根据已有业务,我们在录播与知识图谱关联业务上使用了集群消费模式,录播服务所在服务器接收媒体流服务器录播回调后,保存录播信息到本地。
服务器实例发送录播上传完成的事务半消息,本地使用 TUS 协议进行录播大文件分片上传与断点续传,完成后半消息成为普通消息放入 ...
面试经验-小鹏技术面二面-凉经
前言面的一坨屎,自己项目之外的一问一个不知道,手撕快速幂也忘了。
内容自我介绍
Q. 介绍一下自己
A. 学校背景,实习经历,能力提升
业务内容提问
Q. 项目是什么,你做了什么
Q. 架构演进?
Q. socket.io?
Q. RocketMQ 能做事务吗?
A. 半消息
都没有往深了问,看来是主管之类的。因为完全没有反馈,所以根本看不出来是什么态度。
八股从这里开始崩盘
Q. Mysql 索引使用的什么数据结构
A. B+ 树是一个 n 叉树,数据节点都存在叶子节点中,叶子节点是一个双向循环链表,所以查询范围数据很快
Q. B 树能做吗?
A. 没考虑过。当然是能做的,因为
Q. 那如果我设置了多个 index,只用一个 index 或者几个 index 能查询到数据吗?
A. 可以
Q. 有没有查不到的情况
A. 不知道
流程思想
Q. 微信扫码登录怎么做的?
A. 直接懵了,说的前言不搭后语,提了 JWT 和 Session,乱说一通
Q. 操作流程提示了下
A. 我不太清楚,但是我的项目中有类似的:Session 中存储手机和电脑登陆状态,因为手机已经登陆, ...
面试模拟-Redis
前言感觉自己实习期间的工作没有很好地和现在大厂的技术栈结合起来
所以让 DeepSeek 融合了一个黑马点评进去
针对这份简历,同时让它问了几个面试问题,比较有深度,记录下来
内容面试官: 很好,你提到项目中大量使用了 Redis 进行优化。我们深入聊聊 Redis 这块:
Session 管理优化Q1.你具体是如何设计 Redis 存储 Session 的? 为什么选择这种数据结构(比如 String vs Hash)?
A1. 我在项目中主要是使用的 Hash 结构,如: (userId, userName, role, createdTime, lastAccessedTime, currentDecice...)
因为我们的项目中有需要频繁增删这种无需持久化的数据。对于我们的 SessionKey 命名,是 session:{sessionId},这里的 sessionId 是用 UUid 生成的随机 32 位 ID。对于过期时间,我们设置的是 3600 秒,也就是 1 小时;每次更新我们首先会去更新 lastAccessedTime,然后重新 Expire 一下,也是 36 ...
面试经验-小鹏技术面
前言处女面,可能因为有实习经历所以拷打项目非常多,手撕有惊无险。
内容自我介绍
Q. 介绍一下自己
A. 学校背景,吸取上次经验,先简要介绍实习经历,看看对面反应
介绍过程有持续反应,看来是懂技术懂业务的
业务内容介绍
Q. 我对你的项目还是不太熟悉,先介绍一下背景和过程中遇到的问题刚才介绍太短了,忘记把背景加入进去了,面试官给了一次机会
A. 介绍项目背景,根据要求,做了一个基于知识框架和知识图谱构建的智慧学习平台,通过知识绑定能够串联起来学习过程,通过 LangChain 能够将死知识变成活知识。
A. 首先是 WebRTC,我之前是做 RTMP、RTP 这块的,我们项目中又需要 WebRTC,这里应该补充:所以我快速学习了这方面的知识,我做了架构演进,提升了多少。
A. 然后就是 ShareDB 这块,就像是一块白板,上面储存了许多共享变量,如果大家都想修改它,就会引发冲突;因为我们之前做的是 Socket.io,如果想要加多个节点,就会出现问题。因为 Socket.io 需要 Http 长轮询,我印象中是 200 200 201 三个响应。如果做 LoadBalance,那 ...
LC-day-15-更快更好的回溯
前言在做回溯时,常常遇到需要去重的情况,以及各种各样的条件限制。
万变不离其宗,只需要在回溯的 for 循环中第一行加入判断条件即可。
去重排序去重子集去重
1234567891011121314151617181920212223class Solution { private List<List<Integer>> res = new ArrayList<>(); private LinkedList<Integer> path = new LinkedList<>(); public List<List<Integer>> subsetsWithDup(int[] nums) { // 对其进行排序 Arrays.sort(nums); backtrack(nums, 0); return res; } private void backtrack(int[] nums, int s ...
LC-day-14-回溯与剪枝
前言回溯和动态规划是我最害怕的算法,这次我要直面恐惧
架构
主函数调用回溯函数
不递归传递结果,直接记录到全局变量中
做 - 递归 - 回撤 这个逻辑放到 for 循环中
例子找出所有相加之和为 n 的 k 个数的组合,且满足下列条件:
只使用数字 1 到 9每个数字 最多使用一次返回 所有可能的有效组合的列表 。该列表不能包含相同的组合两次,组合可以以任何顺序返回。
1234567891011121314151617181920212223242526272829303132333435class Solution { // 结果和过程直接放到全局,不用考虑递归时的传递 private List<List<Integer>> res = new ArrayList<>(); private LinkedList<Integer> path = new LinkedList<>(); // 主函数只用调用一次回溯即可 public List<List<Integer> ...