Skip to content

1. BIO vs NIO

  • BIO (Blocking IO): 同步阻塞 IO。一个连接对应一个线程。客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销。适用连接数目比较小且固定的场景。
  • NIO (Non-blocking IO): 同步非阻塞 IO。一个线程处理多个连接。通过 ChannelBufferSelector 实现。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 psdocker logsdocker builddocker rundocker exec -it bash

  • 挂载命令:

    bash

    编辑

    1docker run -d \
    2  -v /宿主机/本地目录:/容器内的目标目录 \
    3  --name my_container my_image

    注:-v 参数就是用来做目录挂载的,冒号前是宿主机路径,冒号后是容器内路径。

6. MySQL 主从复制原理

  • 核心: 基于 binlog(二进制日志)的复制。
  • 步骤:
    1. 主库(Master)将数据变更记录写入 binlog
    2. 从库(Slave)的 I/O 线程连接到主库,请求获取 binlog。
    3. 主库的 binlog dump 线程将 binlog 发送给从库。
    4. 从库的 I/O 线程将收到的 binlog 写入到本地的 中继日志(relay log)
    5. 从库的 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 判断有向图中是否有环。