概念
集合
并发编程
IO
stream流:抽象概念表示数据的流动通道,数据从 源(Source)流向 目标(Destination)。IO 输入 / 输出:为了解决计算机与外界数据传输,可用于文件读写操作(读取配置文件、保存用户数据、处理日志等)、网络通信(发送 HTTP 请求、接收服务器响应、实现即时通讯等)、设备交互(读取键盘输入、输出到显示器、控制打印机等)。- 文件读写操作
- 网络通信
Socket
- 设备交互
JVM
Web相关
Sevlet
Tomcat:Tomcat是一个开源的 Servlet 容器(也称为 Web 服务器),用于运行 Java Web 应用程序。jsp:创建 java web 动态网页的一种技术。Sevlet:Sevlet是运行在Web服务器的 java 程序。主要用于处理客户端(如浏览器)的请求并返回响应。- 页面跳转方式
forward转发:服务器内部跳转:请求在服务器端被转发到另一个资源(Servlet、JSP 或静态文件),客户端感知不到中间跳转过程。一次请求:整个过程只产生一个 HTTP 请求,浏览器 URL 保持不变。redirect重定向:客户端跳转:服务器返回一个特殊响应(状态码 302/303),指示浏览器重新发送请求到新的 URL。两次请求:浏览器先请求 A 资源,A 返回重定向指令,浏览器再请求 B 资源,URL 会变为新地址。
- 用户状态管理方式
cookie:客户端存储:服务器发送到用户浏览器并保存在本地的小段数据。跨请求传递:浏览器下次向同一服务器再发起请求时,会自动携带这些数据。session:服务器端存储:为每个用户创建的独立会话空间,存储用户状态。依赖 Cookie 或 URL 重写:通过唯一的session_id标识用户。
filter过滤器:拦截请求与响应:Filter 可以在请求到达 Servlet 之前或响应返回客户端之前,对请求和响应进行拦截和处理。链式处理:多个 Filter 可以组成一个链,依次对请求和响应进行处理。解耦通用逻辑:将与业务无关的通用功能(如编码转换、权限验证)从 Servlet 中分离出来。listener监听器:事件驱动:Listener 用于监听 Web 容器中的特定事件,当事件发生时执行相应的逻辑。无拦截能力:Listener 不拦截请求或响应,仅在事件触发时被动执行。系统级监控:常用于应用初始化、资源管理、会话统计等。
- 页面跳转方式
MyBatis
持久层:将内存中的对象状态保存到数据库或文件系统中,以便长期保存。ORM(对象关系映射):将面向对象的实体类与数据库表建立映射关系,实现对象与数据库记录的相互转换。缓存一级缓存:默认启用。基于SqlSession(会话级缓存),随 SqlSession 关闭而清空。线程安全的,适用于短期、高频次查询。- 首次执行查询时,结果存入
SqlSession的缓存(Map)。 - 同一
SqlSession内执行相同 SQL(相同语句和参数)时,直接从缓存返回结果,无需访问数据库 - 当执行
insert、update、delete操作或手动调用clearCache()时,缓存失效。
- 首次执行查询时,结果存入
二级缓存:需要手动开启。基于Mapper(映射器级缓存)或命名空间,应用启动到应用关闭。跨会话共享(需考虑线程安全),适用于长期、跨会话的数据缓存、全局数据缓存。- 首次执行查询时,结果存入二级缓存(跨
SqlSession共享)。 - 不同
SqlSession执行相同命名空间下的 SQL 时,优先从二级缓存获取。 - 同一命名空间内执行
insert、update、delete操作时,自动刷新缓存。
- 首次执行查询时,结果存入二级缓存(跨
Spring
Bean:IOC控制反转:AOP面向切面编程:
SpringMVC
Interceptor拦截器:用于在请求处理的前后执行特定逻辑。它类似于 Servlet Filter,但提供更精细的控制,可用于权限验证、日志记录、性能监控等场景。
SpringBoot
自动装配:
java基础
== 和 equals() 的区别
为什么重写 equals() 时必须重写 hashCode() 方法
String、StringBuffer、StringBuilder 的区别
泛型擦除
反射
代理
spi
集合
IO
并发编程
JVM
如何判断对象存活?请解释强引用、软引用、弱引用、虚引用
框架
如何对SpringBoot配置文件敏感信息加密?
为什么有些公司禁止使用@Transactional声明式事务?
场景题
如何设计一个订单号生成服务(全局唯一id)
设计要点
改造的twitter 雪花算法
为什么要分库分表
亿级用户热点数据更新如何优化
热点数据是指访问量频率很高、更新频繁的数据。比如并发量很高的某个接口、查询用户信息、优惠券信息等。
热点数据更新带来的问题。
大致出问题方向(微服务架构)
- 应用线程被打挂。
- 应用活跃的线程超过当前配置最大值。新请求进来,应用无法处理从而出现假死现象,基于K8s部署的应用通过请求探活接口,发现没响应后会不断重启应用,导致应用处理接口能力时好时坏。
- 数据库被打挂(优先考虑,80%大概率)。
- 数据库出现大量SQL,而且业务请求量很大,导致大量线程堵塞,CPU很块飙升100%。
- 并发请求量太大,超过数据库承受的最大线程数TPS。CPU飙升100%。
- Redis被打挂。
- redis cpu被打爆。一般可能原因 redis出现热key。
- redis 内存被打爆。一般可能原因 redis key短时间内增长很快超过内存最大值(设计不合理或设置过期时间太长)。
- reids 网络io太大。一般可能原因 redis出现大key。