Files
cs-note/hzh/TEST/简历 QA 100.md
T

945 lines
32 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
tags: ["测试", "选择题", "面试", "Go", "Java", "Redis", "MySQL", "系统架构"]
create time: 2026-06-07 14:30
---
# 简历技术选择题 100 题
## 概述
基于个人简历中涉及的技术栈(Go、Java、Redis、MySQL、React、Docker/CI/CD、并发模型、缓存策略等)生成的 100 道选择题,每题附答案与解析,用于自测与技术复盘。
## 正文
### 一、Go 语言核心(第 1-13 题)
**Q1. Go 中 goroutine 与操作系统的线程有什么区别?**
A) goroutine 是用户态线程,由 Go runtime 调度
B) goroutine 是内核线程,由操作系统调度
C) goroutine 和线程完全等价
D) goroutine 只能在 main 函数中运行
> [!summary]- Q1 答案与解析
> **答案:A** — goroutine 是 Go runtime 管理的用户态轻量级协程,初始栈仅 2KB,可动态伸缩。
**Q2. Go 的 channel 在关闭后发送数据会发生什么?**
A) 静默丢弃
B) panic: send on closed channel
C) 返回 nil
D) 阻塞等待
> [!summary]- Q2 答案与解析
> **答案:B** — 向已关闭的 channel 发送数据会触发 panic。
**Q3. sync.WaitGroup 的 Add、Done、Wait 方法调用顺序正确的是?**
A) Wait() → Add() → Done()
B) Add() → 启动 goroutine 调用 Done() → Wait()
C) Done() → Add() → Wait()
D) 任意顺序均可
> [!summary]- Q3 答案与解析
> **答案:B** — Add() 必须在 Wait() 之前调用,且 Add(n) 中的 n 应大于 0。
**Q4. Go Context 的主要用途是什么?**
A) 管理内存分配
B) 传递取消信号、截止时间与请求作用域值
C) 实现 HTTP 路由
D) 替代 struct field
> [!summary]- Q4 答案与解析
> **答案:B** — Context 用于控制 goroutine 生命周期(取消/超时)和传递跨 API 边界的请求级数据。
**Q5. Go 的 GC(垃圾回收)使用的是什么算法?**
A) 引用计数
B) Mark-Sweep
C) Mark-Compact
D) 三色标记 + 混合写屏障(Concurrent Mark & Sweep)
> [!summary]- Q5 答案与解析
> **答案:D** — Go 采用并发三色标记清除算法,配合混洗写屏障保证性能。
**Q6. 在 Go 中,make([]int, 0, 10) 创建的切片其 len 和 cap 分别为?**
A) len=0, cap=10
B) len=10, cap=10
C) len=0, cap=0
D) len=10, cap=0
> [!summary]- Q6 答案与解析
> **答案:A** — make 第三个参数为容量,长度默认为第一个参数。
**Q7. Go 的 select 语句在没有 case 可选时会怎样?**
A) 返回 nil
B) 编译报错
C) 永久阻塞
D) panic
> [!summary]- Q7 答案与解析
> **答案:C** — 没有 default case 的 select 在所有 channel 不可操作时永久阻塞。
**Q8. go 的 defer 语句执行时机是什么?**
A) 函数结束时按声明顺序执行
B) 函数结束时逆序(LIFO)执行
C) goroutine 退出时执行
D) return 之后立即执行
> [!summary]- Q8 答案与解析
> **答案:B** — defer 压入栈,函数返回时以 LIFO 顺序弹出执行。
**Q9. Go 接口类型的底层结构包括几个部分?**
A) 1 个:指向数据的指针
B) 2 个:类型信息和数据指针
C) 3 个:类型、数据、虚表
D) 4 个
> [!summary]- Q9 答案与解析
> **答案:B** — 接口由 iface 组成:type(类型信息)和 data(数据指针)。
**Q10. Go 的 reflect.TypeOf 返回的是什么?**
A) 变量的运行时值
B) 变量编译时的静态类型
C) 变量的动态类型信息(interface{} 的具体类型)
D) 变量的内存地址
> [!summary]- Q10 答案与解析
> **答案:C** — TypeOf 在运行时获取 interface{} 所持有值的实际类型。
**Q11. Go 的 race detector 通过什么实现?**
A) 静态分析编译器标志
B) -race 编译标志,在源码级别插入探测代码
C) 运行时 GC 监控
D) pprof profile
> [!summary]- Q11 答案与解析
> **答案:B** — go build -race 会在源码级别插入读写探测代码来检测数据竞争。
**Q12. Go 的 map 在并发读写时会怎样?**
A) 自动加锁
B) panic: concurrent map reads and writes
C) 只读安全,只写不安全
D) 取决于 Go 版本
> [!summary]- Q12 答案与解析
> **答案:B** — 原生 map 不是并发安全的,需用 sync.Map 或加 mutex。
**Q13. Go 标准库中 net/http 默认是否有连接池?**
A) 没有,每次请求新建 TCP 连接
B) 有,Transport 内置 Keep-Alive 连接复用
C) 需要手动配置才能启用
D) 仅在 HTTP/2 下才有
> [!summary]- Q13 答案与解析
> **答案:B** — http.Transport 默认支持 HTTP Keep-Alive 连接复用。
### 二、Go Web 开发 & Gin/GORM(第 14-23 题)
**Q14. Gin 框架中 Middleware 的执行顺序是怎样的?**
A) 随机
B) 注册顺序,先注册先执行、后返回
C) 先注册的后执行
D) 只在出错时执行
> [!summary]- Q14 答案与解析
> **答案:B** — Gin 中间件按注册顺序依次执行,类似洋葱模型。
**Q15. GORM 中 Preload 和 Joins 的区别是?**
A) 无区别,都是 N+1 查询
B) Preload 用额外 SELECT 加载关联,Joins 用 SQL JOIN
C) Preload 只能用于一对多关系
D) Joins 总是比 Preload 快
> [!summary]- Q15 答案与解析
> **答案:B** — Preload 执行两次查询(主表 + 关联表),Joins 合并为一次 LEFT JOIN。
**Q16. Gin 中 c.ShouldBindJSON() 失败时会怎样?**
A) 返回 nil
B) 自动调用 c.AbortWithError() 返回 400
C) 忽略错误继续执行
D) panic
> [!summary]- Q16 答案与解析
> **答案:B** — 绑定失败会自动返回 400 Bad Request 并终止后续 handler 执行。
**Q17. GORM 的 First() 和 Take() 的区别是?**
A) First() 按主键排序,Take() 随机取一条
B) First() 必须 WHERE id=...,Take() 无条件取第一条
C) 两者完全一样
D) Take() 返回多条记录
> [!summary]- Q17 答案与解析
> **答案:A** — First() 隐含 Order("primary_key"),Take() 不做排序直接 LIMIT 1。
**Q18. Gin 中使用 c.Query() 和 c.Param() 分别对应什么 URL 元素?**
A) Query → path param, Param → query string
B) Query → query string, Param → path parameter
C) 两者都从 body 读取
D) Query → header, Param → query string
> [!summary]- Q18 答案与解析
> **答案:B** — Query 解析 URL ?key=value,Param 解析 :param 路径参数。
**Q19. GORM AutoMigrate 的功能是什么?**
A) 迁移数据库版本号
B) 自动创建/alter 表结构以匹配 struct tag
C) 备份数据库数据
D) 加密字段
> [!summary]- Q19 答案与解析
> **答案:B** — AutoMigrate 根据 struct 定义自动建表或调整列(不删列)。
**Q20. Gin 中 ResponseWriter 的 Flush() 方法实现什么功能?**
A) 刷新 buffer,支持 Server-Sent Events
B) 关闭连接
C) 重置 header
D) 打印日志
> [!summary]- Q20 答案与解析
> **答案:A** — 实现 SSE (Server-Sent Events) 推送。
**Q21. GORM 中 scope.Searchable() 的作用是什么?**
A) 条件链式搜索查询
B) 全文搜索引擎集成
C) 删除记录
D) 事务管理
> [!summary]- Q21 答案与解析
> **答案:A** — Searchable 简化链式条件查询构建。
**Q22. Gin 中 c.Bind() 和 c.ShouldBind() 的差异是?**
A) c.Bind() 出错时 panic,c.ShouldBind() 返回 error
B) c.ShouldBind() 出错时 panic
C) 两者相同
D) c.Bind() 更快
> [!summary]- Q22 答案与解析
> **答案:A** — Bind 内部若出错会 abort+panic(被 recover 捕获返回 400),ShouldBind 显式返回 error。
**Q23. Gin Router 的 LoadHTMLGlob() 和 LoadHTMLFiles() 有何区别?**
A) Glob 加载目录所有模板,Files 加载指定文件列表
B) Glob 只能加载 HTML,Files 可以加载任何文件
C) 无实质区别
D) Files 支持通配符
> [!summary]- Q23 答案与解析
> **答案:A** — Glob 接受路径模式(如 "templates/*"),Files 需逐个指定文件名。
### 三、Go 高级特性 & RabbitMQ(第 24-30 题)
**Q24. Go 的 pool(协程池)主要解决的问题是?**
A) 减少 goroutine 频繁创建销毁开销
B) 避免死锁
C) 代替 channel
D) 提升 GC 速度
> [!summary]- Q24 答案与解析
> **答案:A** — 协程池复用 goroutine 避免大量短命协程的创建/销毁成本,尤其对 IO 密集型任务有价值。
**Q25. RabbitMQ 中 Exchange 的类型不包括?**
A) direct
B) topic
C) random
D) headers
> [!summary]- Q25 答案与解析
> **答案:C** — RabbitMQ 四种 Exchange:direct、topic、headers、fanout。
**Q26. RabbitMQ 消息持久化需要哪三个步骤?**
A) Queue durable + Message persistent + Confirm
B) Queue auto-delete + Message transient
C) 仅需 Queue durable
D) 只需 Message delivery_mode=2
> [!summary]- Q26 答案与解析
> **答案:A** — 队列需 declare_durable=true,消息 delivery_mode=2,且开启 publisher confirm。
**Q27. Go 中 context.WithTimeout 和 context.WithDeadline 的区别是?**
A) 无区别,完全等价
B) WithTimeout = Now + duration,WithDeadline = 绝对时间戳
C) WithDeadline 只能用于 HTTP
D) WithTimeout 不支持 cancel
> [!summary]- Q27 答案与解析
> **答案:B** — 一个是相对时长,一个是绝对 Time。
**Q28. RabbitMQ 中 Consumer Ack 的目的是?**
A) 告诉 Broker 消息已处理成功,可从队列移除
B) 增加消息延迟
C) 触发重试
D) 改变消息优先级
> [!summary]- Q28 答案与解析
> **答案:A** — Ack 确认消费成功;Nack 可重新入队或丢弃。
**Q29. Go 泛型中 type constraint 使用 interface 而不是 class,原因是?**
A) Go 没有 class
B) Go 的 interface 支持结构化子类型(隐式满足)
C) class 太复杂
D) 语法限制
> [!summary]- Q29 答案与解析
> **答案:B** — Go interface 是 duck-typing,任何实现了对应方法的类型自动满足约束。
**Q30. Go 的 unsafe.Pointer 能做什么?**
A) 绕过类型安全进行内存操作
B) 替代 malloc
C) 创建新 thread
D) 优化 GC
> [!summary]- Q30 答案与解析
> **答案:A** — unsafe 包允许直接操作内存(转换、偏移、指针算术),但会破坏类型安全。
### 四、Java 语言核心(第 31-42 题)
**Q31. Java 中 HashMap 的默认负载因子和初始容量是?**
A) 0.5, 8
B) 0.75, 16
C) 0.75, 8
D) 0.8, 16
> [!summary]- Q31 答案与解析
> **答案:B** — load factor 0.75,initial capacity 16。
**Q32. Java ConcurrentHashMap 在 JDK 8+ 使用什么结构?**
A) 单纯链表
B) Array + LinkedList
C) Array + LinkedList + Red-Black Tree(树化阈值 8)
D) Hash Table
> [!summary]- Q32 答案与解析
> **答案:C** — 桶内链表节点数 ≥8 且数组长度 ≥64 时转为红黑树,降低查找复杂度。
**Q33. Java synchronized 和 ReentrantLock 的核心区别是?**
A) synchronized 是 JVM 层面,ReentrantLock 是 API 层面
B) 两者完全等价
C) ReentrantLock 不能中断等待
D) synchronized 支持 condition
> [!summary]- Q33 答案与解析
> **答案:A** — synchronized 由 JVM 内置实现,ReentrantLock 是 java.util.concurrent 层面的显式锁。
**Q34. Java Callable 和 Runnable 的区别是?**
A) Callable 可返回值并能抛出 checked exception
B) Runnable 更快
C) Callable 不能异步执行
D) Runnable 是 Java 8 引入
> [!summary]- Q34 答案与解析
> **答案:A** — Callable<V>.call() 返回 V 并可 throw Exception,Runnable.run() 无返回值。
**Q35. Java Spring Bean 的作用域不包括?**
A) singleton
B) prototype
C) request
D) coroutine
> [!summary]- Q35 答案与解析
> **答案:D** — Spring 五大作用域:singleton、prototype、request、session、application。
**Q36. Spring 中 @Autowired 默认是按什么注入?**
A) 按 name
B) 按 type(byType)
C) 按 constructor
D) 按 index
> [!summary]- Q36 答案与解析
> **答案:B** — 默认按 byType 匹配;同名多个 bean 时才按 byName。
**Q37. MyBatis 中 #{ } 和 ${ } 的区别是?**
A) #{} 是预编译占位符防 SQL 注入,${} 是直接字符串拼接
B) 两者完全一样
C) ${} 更安全
D) #{} 只用于字符串
> [!summary]- Q37 答案与解析
> **答案:A** — #{ } 使用 PreparedStatement 的参数绑定,${ } 是原始文本替换。
**Q38. Java 中 volatile 关键字保证哪些属性?**
A) 可见性 + 原子性
B) 可见性 + 有序性,不保证原子性
C) 只有原子性
D) 没有保证
> [!summary]- Q38 答案与解析
> **答案:B** — volatile 保证可见性和禁止指令重排,但不保证复合操作的原子性。
**Q39. Java 线程池中 corePoolSize 和 maximumPoolSize 的关系是?**
A) corePoolSize ≤ maximumPoolSize
B) 可以任意大小
C) 必须相等
D) core > max
> [!summary]- Q39 答案与解析
> **答案:A** — 核心线程数不能超过最大线程数。
**Q40. Java 8 Stream 中 flatMap() 和 map() 的区别是?**
A) flatMap 将嵌套集合展平为一层,map 是一对一转换
B) 两者完全一样
C) flatMap 更慢
D) map 可以展平
> [!summary]- Q40 答案与解析
> **答案:A** — map(Stream<T>) 得到 Stream<Stream<T>>,flatMap 直接将 Stream<T> 展平为一个 Stream<T>。
**Q41. Java Optional.ofNullable(null) 的行为是?**
A) 返回 Optional.empty()
B) 返回 null
C) panic
D) NullPointerException
> [!summary]- Q41 答案与解析
> **答案:A** — Optional.ofNullable 允许 null 值,null 时返回 empty();Optional.of(null) 才会抛 NPE。
**Q42. Java Spring 中 @Controller 和 @RestController 的区别是?**
A) @RestController = @Controller + @ResponseBody
B) 完全一样
C) @Controller 不能返回 JSON
D) @RestController 不能做视图渲染
> [!summary]- Q42 答案与解析
> **答案:A** — @RestController 在每个方法上隐式添加 @ResponseBody,直接写响应体而非视图名。
### 五、Spring Boot & MyBatis-Plus(第 43-49 题)
**Q43. Spring Boot Starter 的作用是?**
A) 自动化配置依赖组合
B) 编译加速
C) 单元测试框架
D) 部署工具
> [!summary]- Q43 答案与解析
> **答案:A** — Starter 通过 spring.factories 或 AutoConfiguration 自动装配相关配置类。
**Q44. MyBatis-Plus 中 IService 和 BaseMapper 的区别是?**
A) IService 提供 CRUD 通用方法,BaseMapper 只做单表 Mapper 操作
B) 无区别
C) BaseService 包含 BaseMapper
D) BaseMapper 是 MyBatis 原生的
> [!summary]- Q44 答案与解析
> **答案:A** — IService<T> 封装了常用的增删改查、分页等方法,BaseMapper<T> 是对应实体表的 Mapper 接口。
**Q45. Spring Boot 的自动装配原理核心注解是?**
A) @EnableAutoConfiguration
B) @ComponentScan
C) @Configuration
D) @Import
> [!summary]- Q45 答案与解析
> **答案:A** — @EnableAutoConfiguration 通过 @Import(AutoConfigurationImportSelector.class) 加载 META-INF/spring.factories 中配置的自动装配类。
**Q46. MyBatis-Plus 的 @TableId(type = IdType.AUTO) 含义是?**
A) 主键由数据库自增
B) 使用雪花算法
C) UUID
D) 雪花+本地 Snowflake
> [!summary]- Q46 答案与解析
> **答案:A** — AUTO 依赖数据库自增序列;ASSIGN_ID 才是雪花算法。
**Q47. Spring Cloud Gateway 与传统 Zuul 1.x 的区别是?**
A) Gateway 基于 Reactor 非阻塞,Zuul 1.x 是 Servlet 阻塞式
B) 无区别
C) Zuul 更快
D) Gateway 不支持负载均衡
> [!summary]- Q47 答案与解析
> **答案:A** — Spring Cloud Gateway 基于 Spring WebFlux (Netty),非阻塞响应式模型。
**Q48. MyBatis 一级缓存和二级缓存的区别是?**
A) 一级是 SqlSession 级别,二级是 Namespace/Mapper 级别
B) 一级是全局的
C) 二级默认开启
D) 一级可跨 Session
> [!summary]- Q48 答案与解析
> **答案:A** — 一级缓存默认开启且无法关闭;二级缓存需手动配置 enableCache=true,跨同 namespace 的 Session 共享。
**Q49. Spring Boot Actuator 主要用于?**
A) 监控和管理应用(健康检查、指标暴露等)
B) 热修复代码
C) 前端打包
D) 自动生成 UI
> [!summary]- Q49 答案与解析
> **答案:A** — 提供 /actuator/health、/metrics、/info 等端点供外部监控系统采集。
### 六、Redis(第 50-62 题)
**Q50. Redis 的 RDB 和 AOF 两种持久化方式的比较中,正确的是?**
A) RDB 基于快照,恢复快但可能丢数据;AOF 逐条记录追加,更安全但文件更大
B) AOF 基于快照
C) RDB 实时性更好
D) AOF 不可能丢数据
> [!summary]- Q50 答案与解析
> **答案:A** — RDB 定期 fork 子进程写快照;AOF 每条写入命令追加到 .aof 文件。
**Q51. Redis 哨兵模式的自动故障转移流程是?**
A) Master fail → Sentinel 投票选 New Master → 提升 Slave → 通知 clients
B) Master fail → 直接切换
C) Master fail → Slave 自动提升(无需投票)
D) 需要人工介入
> [!summary]- Q51 答案与解析
> **答案:A** — 哨兵通过 is-master-down-by-addr 探测失败,quorum 确认后 election 选出 new master。
**Q52. Redis 的持久化策略 appendfsync 三种模式安全性从高到低排列是?**
A) always > everysec > no
B) no > everysec > always
C) everysec > always > no
D) always = everysec
> [!summary]- Q52 答案与解析
> **答案:A** — always 每条 fsync(最安全,性能最低);everysec 每秒 fsync(折中);no 交由 OS 决定。
**Q53. Redis Set 数据类型不支持的操作是?**
A) union
B) intersection
C) difference
D) range by index(范围索引查询)
> [!summary]- Q53 答案与解析
> **答案:D** — Set 是无序的哈希集合,不支持按位置索引;List 才支持 LRANGE。
**Q54. Redis 发布订阅模式中,客户端断线后会怎样?**
A) 收不到断线期间发布的消息
B) 断线重连后可收到历史消息
C) 自动 rejoin 上次 channel
D) Redis 会自动缓存消息
> [!summary]- Q54 答案与解析
> **答案:A** — Pub/Sub 是 fire-and-forget,不持久化消息;需要持久化可用 Redis Streams。
**Q55. Redis Pipeline 的优势是?**
A) 减少 RTT(往返延迟),批量命令一次网络往返
B) 增加数据一致性
C) 替代事务
D) 提高单个命令吞吐量
> [!summary]- Q55 答案与解析
> **答案:A** — 管道将多个命令打包在一次网络往返中,显著降低网络开销。
**Q56. Redis Cluster 分片是基于?**
A) 哈希槽(Hash Slot),共 16384 个
B) 按 key 字母排序
C) 随机分配
D) 按 value 大小
> [!summary]- Q56 答案与解析
> **答案:A** — CRC16(key) % 16384 定位 slot,每个 slot 映射到一个主节点。
**Q57. Redis 的 Keyspace Notification 功能可以用于?**
A) 监听 key 过期事件,触发业务逻辑
B) 替代 pub/sub
C) 替代 Lua
D) 压缩内存
> [!summary]- Q57 答案与解析
> **答案:A** — 可通过 CONFIG SET notify-keyspace-events KEA 开启 key 过期通知。
**Q58. Redis 的 HGETALL 在高版本优化后的行为是?**
A) 不再一次性全部返回,需改用 HSCAN 避免阻塞
B) 变得更慢了
C) 改为异步输出
D) 返回压缩格式
> [!summary]- Q58 答案与解析
> **答案:A** — HGETALL 对小 hash 仍一次性返回,大 hash 推荐使用 HSCAN 游标迭代。
**Q59. Redis 的 ZSET(Sorted Set)分数相同时如何排序?**
A) 按 member 字典序
B) 随机
C) 插入顺序
D) 按 value 大小
> [!summary]- Q59 答案与解析
> **答案:A** — 分数相同情况下,Redis 按 member 字符串的字典序排序。
**Q60. Redis 中 DEL 命令删除一个不存在的 key 会怎样?**
A) 返回 false / 0(无效操作)
B) panic
C) 阻塞
D) 自动重建 key
> [!summary]- Q60 答案与解析
> **答案:A** — DEL key 对于不存在 key 返回整数 0。
**Q61. Redis 的 Maxmemory-policy 设置 allkeys-lru 的含义是?**
A) 所有 key 遵循 LRU 淘汰策略
B) 仅 expired keys
C) 永不淘汰
D) 随机淘汰
> [!summary]- Q61 答案与解析
> **答案:A** — 对所有 key 近似 LRU 淘汰,直到内存低于 maxmemory。
**Q62. Redis String 类型的 max size 是多少?**
A) 512 MB
B) 1 GB
C) 256 MB
D) 1 TB
> [!summary]- Q62 答案与解析
> **答案:B** — Redis String 最大 512MB(Redis 6.0+ 之前),理论上可达 1GB。
### 七、MySQL(第 63-74 题)
**Q63. MySQL InnoDB 默认的隔离级别是?**
A) READ COMMITTED
B) REPEATABLE READ
C) READ UNCOMMITTED
D) SERIALIZABLE
> [!summary]- Q63 答案与解析
> **答案:B** — 默认 RR(Repeatable Read),通过 MVCC + Next-Key Lock 防止幻读。
**Q64. MySQL 的 B+ 树索引相比 B 树的优势是?**
A) 范围查询更高效,所有数据都在叶子节点
B) 查询更快
C) 存储空间更小
D) 不支持前缀索引
> [!summary]- Q64 答案与解析
> **答案:A** — B+ 树的非叶子节点只存 key,叶子节点通过链表串联,适合范围扫描。
**Q65. MySQL 中 EXPLAIN 的 type 字段值 best→worst 排列正确的是?**
A) system > const > eq_ref > ref > range > index > ALL
B) ALL > index > range > ref > eq_ref > const > system
C) const > system > ref > range > index > ALL > eq_ref
D) 无固定顺序
> [!summary]- Q65 答案与解析
> **答案:A** — 从左到右扫描效率递减,system/const 最优,ALL 是全表扫描最差。
**Q66. MySQL 的 MVCC 通过什么实现?**
A) Undo Log + Read View
B) Redo Log
C) Binlog
D) Buffer Pool
> [!summary]- Q66 答案与解析
> **答案:A** — 每行隐藏 rollback pointer 指向 undo log 版本链,当前事务通过 read view 决定可见性。
**Q67. MySQL 的 binlog 三种格式 ROW/STATEMENT/MIXED 中,哪种记录最多数据量但最安全?**
A) ROW 格式,记录每一行的变更前后值
B) STATEMENT,记录原始 SQL
C) MIXED
D) 都一样
> [!summary]- Q67 答案与解析
> **答案:A** — ROW 格式记录每行变更前后的完整值,精确可还原且不受 SQL 语义影响。
**Q68. MySQL 中唯一索引和普通索引在存储上的差异是?**
A) 唯一索引强制要求列值不重复
B) 普通索引更快
C) 唯一索引不能用 Covering Index
D) 无差异
> [!summary]- Q68 答案与解析
> **答案:A** — 唯一索引维护唯一约束,插入重复 key 时抛 Duplicate Key Error。
**Q69. MySQL 联合索引 (a, b, c) 可以用到索引的最长连续前缀是?**
A) (a), (a,b), (a,b,c)
B) (b), (c)
C) (a, c)
D) (b, c)
> [!summary]- Q69 答案与解析
> **答案:A** — 最左前缀原则:必须从左边第一个列开始连续匹配。
**Q70. MySQL 中 DELETE 和 TRUNCATE 的区别是?**
A) DELETE 逐行删除可回滚,TRUNCATE 释放页面不可回滚
B) 无区别
C) TRUNCATE 更慢
D) DELETE 不能带 WHERE
> [!summary]- Q70 答案与解析
> **答案:A** — DELETE 是 DML 语句走事务日志;TRUNCATE 是 DDL 直接重置表空间。
**Q71. MySQL 的事务 ACID 中,Atomicity 由什么保证?**
A) Undo Log
B) Redo Log
C) Buffer Pool
D) Binlog
> [!summary]- Q71 答案与解析
> **答案:A** — Undo Log 记录事务修改前的旧值,支持回滚以实现原子性。
**Q72. MySQL 缓冲池(Buffer Pool)命中率接近 100% 意味着?**
A) 几乎都在内存中访问,磁盘 IO 极少
B) 物理内存不足
C) 磁盘性能差
D) 查询效率低
> [!summary]- Q72 答案与解析
> **答案:A** — 高命中率说明绝大部分数据已在内存中,减少磁盘 I/O。
**Q73. MySQL 中 GROUP BY 默认会对结果集进行什么操作?**
A) 排序
B) 过滤
C) 更新
D) 分片
> [!summary]- Q73 答案与解析
> **答案:A** — 未开启 ONLY_FULL_GROUP_BY 时,GROUP BY 隐式 ORDER BY,会产生 extra filesort。
**Q74. MySQL 中 PRIMARY KEY 和 UNIQUE KEY 能否共存?**
A) 能,一个表可以有多个 UNIQUE 但只有一个 PRIMARY KEY
B) 不能,二选一
C) 可以互为别名
D) PRIMARY KEY 也是 UNIQUE KEY 的一种
> [!summary]- Q74 答案与解析
> **答案:A** — 一张表可有多个 UNIQUE 索引,但只能有一个 PRIMARY KEY(NOT NULL + 聚簇索引)。
### 八、高并发设计 & 缓存策略(第 75-84 题)
**Q75. Write-Behind 缓存策略的特点是什么?**
A) 先写缓存再异步落库,提升写入吞吐
B) 先落库再写缓存
C) 同步写双写
D) 只写不存
> [!summary]- Q75 答案与解析
> **答案:A** — 写入先命中缓存层即刻返回,后台定时批量刷盘,牺牲强一致性换取高性能。
**Q76. 二级缓存的设计目的通常是?**
A) 热点数据在本地减少远程调用,冷数据不落 L1 减少污染
B) 替代单级缓存
C) 加快 GC
D) 减少 CPU 消耗
> [!summary]- Q76 答案与解析
> **答案:A** — L1 本地缓存存极热点数据(零网络开销),L2 远端缓存作为后备,兼顾速度与资源消耗。
**Q77. HeavyKeeper 算法主要用于解决什么问题?**
A) Top-K 热点 Key 探测
B) 数据加密
C) 网络拥塞控制
D) 分布式事务
> [!summary]- Q77 答案与解析
> **答案:A** — HeavyKeeper 通过最小堆 + 概率衰减机制,自适应流量变化持续追踪高频热点。
**Q78. 令牌桶限流相比漏桶的区别在于?**
A) 令牌桶允许突发流量,漏桶是匀速输出
B) 令牌桶更简单
C) 漏桶不允许峰值
D) 两者完全一样
> [!summary]- Q78 答案与解析
> **答案:A** — 令牌桶积累令牌允许短时间内突发消费;漏桶以固定速率出水,不突发。
**Q79. 点赞系统中 Lua 脚本保证原子性的目的是?**
A) 原子地读取-判断-递增,防止并发冲突
B) 减少网络 IO
C) 替代 Redis
D) 持久化
> [!summary]- Q79 答案与解析
> **答案:A** — Lua 脚本在 Redis 中串行执行,确保 incr + TTL 逻辑不被中间状态打断。
**Q80. 补偿任务的目的是?**
A) 兜底修复因异常导致的数据不一致(如未落库记录)
B) 加速写入
C) 替代定时任务
D) 清除过期数据
> [!summary]- Q80 答案与解析
> **答案:A** — 定时批量写回可能失败或遗漏,补偿任务定期对账补齐丢失数据。
**Q81. Redis 中利用字符串常量池作为锁对象的好处是?**
A) 同用户串行执行,不同用户并行,减少不必要的互斥
B) 节省内存
C) 加快 GC
D) 替代数据库锁
> [!summary]- Q81 答案与解析
> **答案:A** — 以 user_id 为粒度实现细粒度并行,避免一把大锁导致的瓶颈。
**Q82. Redis 时间片分桶暂存增量的好处是?**
A) 将分散的单次请求聚合为批处理请求
B) 减少 Redis 压力
C) 替代 MQ
D) 实现秒级 TPS
> [!summary]- Q82 答案与解析
> **答案:A** — 在 10s 窗口内攒一批后再统一落库,减少 DB 写入次数。
**Q83. Caffeine 本地缓存相比 Guava Cache 的优势之一是?**
A) W-TinyLFU 淘汰算法更接近 LRU 但更轻量
B) 支持远程复制
C) 更大内存上限
D) 内置集群功能
> [!summary]- Q83 答案与解析
> **答案:A** — Caffeine 采用 W-TinyLFU(滑动窗口 Tiny-Filter LFU),命中率接近 LRU 但代价更低。
**Q84. Redis 的 watch 命令实现了什么功能?**
A) 乐观锁——监视 key 并在 multi/exec 时校验是否被修改
B) 悲观锁
C) 分区
D) 复制
> [!summary]- Q84 答案与解析
> **答案:A** — WATCH key… 后 MULTI,EXEC 时如果 key 被他人改动则整个事务失败。
### 九、Docker & CI/CD(第 85-90 题)
**Q85. Docker 多阶段构建的主要优势是?**
A) 最终镜像体积更小(只保留产物不含构建工具)
B) 自动部署
C) 更快的网络
D) 取代 K8s
> [!summary]- Q85 答案与解析
> **答案:A** — 在不同 stage 中分别完成编译和打包,拷贝产物到新镜像,剔除编译环境。
**Q86. Dockerfile 中 RUN、CMD、ENTRYPOINT 的区别是?**
A) RUN 构建时执行,CMD 和 ENTRYPOINT 运行时执行(CMD 可被 docker run 覆盖)
B) 三者完全相同
C) CMD 在构建时执行
D) ENTRYPOINT 可以被覆盖
> [!summary]- Q86 答案与解析
> **答案:A** — RUN 在镜像构建阶段执行;ENTRYPOINT 为主命令不易变,CMD 是默认参数可覆盖。
**Q87. GitHub Actions 中 workflow_dispatch 触发器用于?**
A) 手动触发工作流
B) Git push 自动触发
C) PR 合并后触发
D) cron 定时触发
> [!summary]- Q87 答案与解析
> **答案:A** — 通过 UI 点击手动触发,常用于测试或紧急发布。
**Q88. CI/CD 流水线中 Lint 检查的阶段通常在?**
A) 代码提交后、单元测试前
B) 部署之后
C) 构建镜像之后
D) 不需要这个环节
> [!summary]- Q88 答案与解析
> **答案:A** — Lint 是最快发现规范问题的步骤,放在测试和构建之前以减少无效流水线运行。
**Q89. Docker Compose 中 depends_on 的作用局限性是?**
A) 仅表示服务间依赖顺序,不等待容器内进程就绪
B) 自动重启失败的容器
C) 管理环境变量
D) 自动拉取镜像
> [!summary]- Q89 答案与解析
> **答案:A** — depends_on 只保证启动顺序,需要配合 healthcheck 或 wait-for-it 脚本才能确保服务可用。
**Q90. Lark(飞书)OpenAPI 回调 Webhook 常用于?**
A) 接收事件通知(如审批、机器人消息)
B) 发送邮件
C) 构建 Docker 镜像
D) 监控 CPU
> [!summary]- Q90 答案与解析
> **答案:A** — 飞书 webhook 可将审批、聊天等事件实时推送到业务服务端。
### 十、微服务 & 架构(第 91-96 题)
**Q91. 微服务架构中最核心的挑战之一是?**
A) 分布式一致性/跨服务通信
B) 代码编写难度
C) 内存占用
D) CPU 使用率
> [!summary]- Q91 答案与解析
> **答案:A** — 服务间调用带来延迟、幂等、Saga/TCC 事务一致性等难题。
**Q92. gRPC 默认使用的序列化协议是?**
A) Protobuf
B) JSON
C) XML
D) MessagePack
> [!summary]- Q92 答案与解析
> **答案:A** — Protobuf 二进制编码,体积小、解析快,优于 JSON。
**Q93. gRPC 和 RESTful API 的比较中不正确的是?**
A) gRPC 基于 HTTP/2,RESTful 通常 HTTP/1.1
B) gRPC 契约驱动,适合强 typed 场景
C) gRPC 不适合跨语言
D) RESTful 更易被浏览器调试
> [!summary]- Q93 答案与解析
> **答案:C** — gRPC 跨语言能力强(官方 SDK 支持 Go/Java/Python/Node…),Protobuf 天然多语言。
**Q94. SaaS 多租户架构中常见的数据隔离方案有几种?**
A) 三种:独立数据库、独立 Schema、共享 Schema 加 tenant_id
B) 一种:共享表
C) 五种
D) 两种
> [!summary]- Q94 答案与解析
> **答案:A** — Level 1 独立库(最强隔离)、Level 2 独立 Schema、Level 3 共用表 tenant_id 列。
**Q95. RBAC(Role-Based Access Control)的核心实体有哪些?**
A) User–Role–Permission
B) User–Department
C) Project–Team
D) Tenant–Service
> [!summary]- Q95 答案与解析
> **答案:A** — 用户绑定角色,角色赋予权限,通过角色间接授权。
**Q96. 树状组织架构在 SaaS 平台中通常需要支持的操作是?**
A) 增删改查子节点 + 移动节点到不同父节点
B) 仅查询
C) 只支持扁平化
D) 不需要支持树
> [!summary]- Q96 答案与解析
> **答案:A** — 树状组织需要灵活维护层级关系,常见实现用 adjacency list 或 materialized path。
### 十一、AI & RAG(第 97-100 题)
**Q97. RAG(Retrieval-Augmented Generation)的核心思想是?**
A) 从外部知识库检索相关信息,再让 LLM 基于这些资料生成回答
B) 训练更大的模型
C) 替换 Transformer 架构
D) 直接微调全模型
> [!summary]- Q97 答案与解析
> **答案:A** — RAG 将检索与生成解耦,避免全量微调,实时更新知识库成本低。
**Q98. Eino Agent Graph 编排 Prompt 优化→素材生成→质量校验→格式适配管线,本质上是?**
A) DAG 有向无环图工作流,保证节点按拓扑顺序执行
B) 简单的 for-loop
C) 随机采样
D) 并行随机组合
> [!summary]- Q98 答案与解析
> **答案:A** — DAG 确保依赖关系正确:只有前置节点完成才可进入下一阶段。
**Q99. Reflect 自省机制在 AI Agent 中的作用是?**
A) 让 Agent 自我评估输出质量,不达标时自动回注提示词修正
B) 加密数据
C) 加速推理
D) 替代向量数据库
> [!summary]- Q99 答案与解析
> **答案:A** — Self-reflection 使 Agent 形成闭环:生成→评判→修正→再生成,逐步提升质量。
**Q100. 构建组件漏洞知识图谱的典型流程是?**
A) 抽取组件三元组(组件-漏洞-CVE)→ 存入图数据库 → 关联风险传播路径
B) 写入 MySQL
C) 纯 NLP 模型生成
D) 人工标注
> [!summary]- Q100 答案与解析
> **答案:A** — 知识图谱用图结构表达实体关系,利于漏洞影响面分析与传播链路追踪。
## 关联笔记
- [[hzh/GO/Go 语言基础.md]]
- [[hzh/GO/并发模型.md]]
- [[hzh/Java/Spring 系列.md]]
- [[hzh/Redis/Redis 核心概念.md]]
- [[hzh/MySQL/MySQL 索引与事务.md]]
- [[hzh/项目经验/Gen2D 游戏素材生成.md]]
- [[hzh/项目经验/ThumbUP 高并发点赞系统.md]]