Java面试二
项目相关
这些都是根据我项目问的,仅供参考
Redis实现请求限流
我项目的思路是使用 Redis 的 list 类型实现一个滑动时间窗口,如果指定的时间窗口内次数超过指定阈值,就会触发
具体实践可以参考此文章
数据库数据量太大,除了分库分表外还有其他方案吗
当数据库数据量过大时,不会第一时间采用分库分表,而是优先通过索引优化、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 没怎么答出来,只说了拿这个做日志记录,所以被教育了一下下

