# Java面试二

> 第二次面试

发布：2026-02-28 | 分类：计算机 | 标签：Java、面试


## 项目相关

这些都是根据我项目问的，仅供参考

### Redis实现请求限流

我项目的思路是使用 Redis 的 list 类型实现一个滑动时间窗口，如果指定的时间窗口内次数超过指定阈值，就会触发

> 具体实践可以参考此[文章](https://blog.csdn.net/wangerrong/article/details/143616206)

### 数据库数据量太大，除了分库分表外还有其他方案吗

当数据库数据量过大时，不会第一时间采用分库分表，而是优先通过索引优化、SQL 优化、缓存热点数据、读写分离以及冷热数据分离等方式降低数据库压力。如果是查询复杂问题，可以引入搜索引擎。如果是写入压力问题，可以通过消息队列削峰。当单表数据量和 QPS 都达到瓶颈时，再考虑分库分表。

## 项目报错排查的经验

一般遵循“先定位现象，再缩小范围，最后验证原因”的思路。

> 具体自己斟酌吧，我也不太会总结

## 缓存穿透、击穿和雪崩

缓存击穿是某个热点 key 过期，大量请求打到数据库；  
缓存雪崩是大量 key 同时过期，导致数据库压力骤增；  
缓存穿透是查询不存在的数据，缓存和数据库都没有，导致每次都访问数据库。

## IOC（控制反转）和AOP（面向切面编程）的基本概念

IoC：即控制反转的意思，它是一种创建和获取对象的技术思想，依赖注入(DI)是实现这种技术的一种方式。传统开发过程中，我们需要通过new关键字来创建对象。使用IoC思想开发方式的话，我们不通过new关键字创建对象，而是通过IoC容器来帮我们实例化对象。通过IoC的方式，可以大大降低对象之间的耦合度。

AOP：是面向切面编程，能够将那些与业务无关，却为业务模块所共同调用的逻辑封装起来，以减少系统的重复代码，降低模块间的耦合度。Spring AOP 就是基于动态代理的，如果要代理的对象，实现了某个接口，那么 Spring AOP 会使用 JDK Proxy，去创建代理对象，而对于没有实现接口的对象，就无法使用 JDK Proxy 去进行代理了，这时候 Spring AOP 会使用 CGLib 生成一个被代理对象的子类来作为代理。

> 由于我这里 AOP 没怎么答出来，只说了拿这个做日志记录，所以被教育了一下下
