腾讯云智后台开发面试核心问题详解
1. 什么是 CAP?
CAP 理论是分布式系统的核心,指系统在 一致性、可用性 和 分区容忍性 中只能三选二:
- 一致性:所有节点数据一致。
- 可用性:每个请求都能返回结果(即使是失败结果)。
- 分区容忍性:系统能够容忍网络分区故障。
实际项目中,往往根据需求在 CAP 中进行权衡。例如,Redis 偏重于 AP,而 MySQL 偏重于 CP。
2. MySQL 事务隔离级别
MySQL 提供 4 种事务隔离级别,由低到高分别是:
- 读未提交:事务可以读取未提交数据,存在脏读。
- 读已提交:只能读取其他事务已提交的数据,防止脏读。
- 可重复读(默认级别):同一事务中多次查询结果一致,解决不可重复读问题。
- 串行化:最高级别,事务完全串行执行,避免一切并发问题。
实际项目中,可重复读 是 MySQL 的默认隔离级别,适合大多数场景。
3. 多路复用实现(select、poll、epoll)
- 多路复用定义:是 I/O 模型的一种,允许一个线程同时管理多个网络连接。
- 实现方式:
- select:最早的多路复用方法,效率较低,需要遍历文件描述符。
- poll:与 select 类似,但支持动态数量的文件描述符。
- epoll:事件驱动方式,通过回调通知,效率更高,是现代高并发服务的首选。
多路复用通常用于高并发场景,例如 Nginx 的核心网络模块。
4. Redis 的数据结构
Redis 是一款高性能的内存数据库,支持以下五种主要数据结构:
- String:字符串类型,最基础的数据结构。
- List:链表,支持队列和栈操作。
- Hash:哈希表,常用于存储对象。
- Set:无序集合,支持交集、并集等操作。
- Sorted Set:有序集合,按分数排序。
此外还有 Bitmap(位图)、HyperLogLog(基数统计)、Geo(地理位置)等特殊数据结构,满足不同场景需求。
5. Docker 和虚拟机的区别
- Docker 是一种基于容器的轻量化虚拟化技术,共享宿主机内核,启动速度快,占用资源少。
- 虚拟机 是完整的操作系统虚拟化,隔离性更强,但资源消耗大,启动较慢。
Docker 更适合微服务架构,特别是在 CI/CD(持续集成/持续部署)场景中大幅提升效率。
6. 什么是死锁,怎么排查,怎么避免?
- 定义:两个线程互相等待对方持有的资源,导致程序永久阻塞。
- 排查方法:
- 使用 jconsole 查看线程状态。
- 用 jstack 打印线程堆栈。
- 避免策略:
- 遵循资源获取的固定顺序。
- 设置锁的超时时间,避免无限等待。
- 应用银行家算法进行资源分配判断。
死锁问题常见于多线程编程中,合理设计锁机制是避免死锁的关键。
7. Redis 持久化方式
Redis 提供两种持久化方式:
- RDB(Redis Database Snapshot):定时保存内存快照到磁盘,适合定期备份。
- AOF(Append Only File):记录每次写操作日志,可以通过追加方式恢复数据,持久性更强。
项目中可以结合使用 RDB 和 AOF,例如 RDB 定期快照备份,AOF 提供实时数据恢复。
8. Synchronized 和 Lock 的区别
- Synchronized:JVM 层实现,通过 Monitor 锁机制(偏向锁、轻量级锁等)优化,语法简单,但功能较少。
- Lock:JDK 层实现,基于 AQS(AbstractQueuedSynchronizer)框架,支持更丰富的功能,例如可中断锁、超时加锁、读写锁。
实际开发中,Synchronized 用于简单场景,Lock 用于复杂并发逻辑。
9. 什么是缓存三剑客?
缓存问题是高并发项目的核心难题,分为:
- 缓存穿透:查询的数据不存在,直接打到数据库。
- 缓存击穿:热点数据过期,大量请求瞬间打到数据库。
- 缓存雪崩:大量缓存同时过期。
Redis 是解决缓存问题的核心工具。
10. Spring 核心功能 IOC 和 AOP
- IOC(控制反转):由 Spring 容器管理对象的生命周期,解耦组件之间的依赖关系。
- 项目应用:通过
@Autowired
注解注入 Service、DAO。
- AOP(面向切面编程):将日志、事务等公共逻辑抽离,减少重复代码。
- 项目应用:使用 AOP 实现日志记录、权限校验等。
11. 什么是 MQ,项目中如何使用?
- 消息队列(MQ) 是一种异步解耦的工具。
- 项目应用场景:
- 日志收集:用 Kafka 汇总用户行为日志。
- 服务解耦:订单系统通过 RabbitMQ 通知库存系统。
MQ 是现代分布式架构的重要组成部分,能显著提升系统性能。
12. TCP 和 UDP 的区别
- TCP 是面向连接的协议,传输可靠,适合文件传输、Web 请求。
- UDP 是无连接协议,传输不可靠,但速度快,适合视频直播、游戏等场景。
13. @Transactional 的失效场景和事务传播方式
- 事务失效场景:
- 方法为
private
或当前类内部调用。 - 没有被代理(如未通过 Spring 容器调用)。
- 事务传播方式:
- REQUIRED:默认方式,支持当前事务。
- REQUIRES_NEW:创建新事务,挂起当前事务。
14. 什么是 Spring 的循环依赖?
- 定义:如 A 依赖 B,B 又依赖 A,形成循环依赖。
- 解决方式:
- 单例模式:通过三级缓存(early singleton)提前暴露对象引用。
- 原型模式:无法解决,抛出异常。
15. 什么是 SYN 洪流攻击,如何预防?
- 定义:攻击者发送大量伪造的 SYN 包,占用服务器资源。
- 预防方法:
- 启用 SYN Cookies,不立即分配资源。
- 限制半连接队列长度。
- 使用防火墙过滤恶意流量。