1. BIO vs NIO
- BIO (Blocking IO): 同步阻塞 IO。一个连接对应一个线程。客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。适用连接数目比较小且固定的场景。
- NIO (Non-blocking IO): 同步非阻塞 IO。一个线程处理多个连接。通过 Channel、Buffer、Selector 实现。Selector 可以轮询注册在其上的 Channel,哪个 Channel 有读写事件就处理哪个。适用连接数目多且连接比较短(轻操作)的场景,如聊天室、即时通讯。
2. 深拷贝 vs 浅拷贝
- 浅拷贝: 只复制对象的引用地址,两者指向同一个内存地址。修改其中一个对象的属性,另一个也会受影响。
- 深拷贝: 完全复制整个对象,包括对象中的对象(引用类型)。两者在内存中是独立的,互不影响。
3. Linux 查日志常用命令
tail -f filename:实时追踪日志。grep "ERROR" filename:查找包含 ERROR 的行。grep -C 5 "Exception" filename:查找 Exception,并显示前后 5 行(方便看上下文)。vim filename:如果日志量不大,直接用 vim 打开搜索。
4. 除了看日志,怎么 debug?
- 远程 Debug: 在测试环境启动参数中加入
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005,本地 IDEA 远程连接。 - Arthas(阿尔萨斯): Java 诊断神器。可以在不重启服务的情况下,在线查看方法的入参、出参、执行路径,甚至动态修改日志级别。
- Metrics 监控: 集成 Micrometer 或 Prometheus,查看接口的 QPS、RT(响应时间)曲线,定位性能瓶颈。
5. Docker 常用命令 & 挂载
常用命令:
docker ps,docker logs,docker build,docker run,docker exec -it bash。挂载命令:
bash
编辑
1docker run -d \ 2 -v /宿主机/本地目录:/容器内的目标目录 \ 3 --name my_container my_image注:
-v参数就是用来做目录挂载的,冒号前是宿主机路径,冒号后是容器内路径。
6. MySQL 主从复制原理
- 核心: 基于 binlog(二进制日志)的复制。
- 步骤:
- 主库(Master)将数据变更记录写入 binlog。
- 从库(Slave)的 I/O 线程连接到主库,请求获取 binlog。
- 主库的 binlog dump 线程将 binlog 发送给从库。
- 从库的 I/O 线程将收到的 binlog 写入到本地的 中继日志(relay log)。
- 从库的 SQL 线程读取 relay log,解析成具体的 SQL 语句并执行,从而保持数据一致。
7. 索引建立原则
- 要加索引: 经常作为
WHERE条件的字段、ORDER BY排序的字段、GROUP BY分组的字段、主键、外键、高区分度(如身份证号、订单号)的字段。 - 不要加索引: 数据量很小的表(全表扫描更快)、区分度很低的字段(如性别,只有男/女)、经常进行增删改操作的字段(索引维护成本高)、
LIKE '%abc'这种左模糊查询。
8. DNS A记录 vs CNAME
- A记录: 将域名直接指向一个 IP 地址(如 192.168.1.1)。
- CNAME: 别名解析,将域名指向另一个域名(别名),再由那个域名解析出 IP。常用于 CDN 或云服务商提供的接入。
9. CDN(内容分发网络)
- 原理: 把网站的内容(图片、视频、JS、CSS)缓存到离用户最近的边缘节点服务器上。
- 作用: 用户访问时,通过 DNS 调度,让用户从最近的节点拿数据,而不是回源站。加速访问,减轻源站压力,节省带宽。
💻 算法题
你提到的 LeetCode 题目:
- LC 199. 二叉树的右视图: 使用层序遍历(BFS),每一层只取最右边的那个节点值。
- LC 540. 有序数组中的单一元素: 利用二分查找(Binary Search)。根据 mid 的位置和元素值判断单一元素在左半边还是右半边。
- LC 282. 给表达式添加运算符: 回溯算法(Backtracking),枚举所有可能的操作符组合。
- LC 207. 课程表: 经典的拓扑排序问题,使用 BFS 或 DFS 判断有向图中是否有环。