什么是IOC

spring  的控制反转 传统应用程序是用户对程序的管理,IOC就是把程序交给Spring管理

在Spring框架中,IoC容器通过依赖注入(Dependency Injection)来实现控制反转。依赖注入是指容器在创建对象时,将其依赖的其他对象(或者说依赖项)自动注入到对象中,而不是由对象自己去创建或者查找依赖的对象。这种方式使得对象之间的耦合度降低,提高了代码的灵活性、可测试性和可维护性。

IOC的实现原理

通过把应用注册为bean 在spring里bean是最基础的单元

Bean容器和依赖注入。

Bean容器:Bean容器是Spring框架中负责管理和维护对象(也称为Bean)的容器。Bean容器负责创建、装配和管理Bean对象,并在需要时将它们提供给应用程序。Spring容器提供了多种不同类型的容器,包括ApplicationContext和BeanFactory等。这些容器通过配置文件(如XML配置文件)、注解或者Java配置类来描述Bean之间的依赖关系和创建方式。

依赖注入:依赖注入是IoC的一种实现方式,它通过将对象依赖的其他对象注入到目标对象中来解决对象之间的依赖关系。Spring框架支持三种主要的依赖注入方式:构造函数注入、Setter方法注入和字段注入(通过@Autowired注解)。在这些方式中,Spring容器负责实例化对象,并将依赖的其他对象自动注入到目标对象中。

什么是AOP

aop是切面,在程序运行过程 通过反射机制 对莫个程序进行添加通知等功能



AOP(Aspect-Oriented Programming,面向切面编程)是一种软件设计范式,它通过将横切关注点(cross-cutting concerns)从核心业务逻辑中分离出来,以模块化地实现这些关注点。横切关注点指的是对应用程序多个部分共同存在的功能,例如日志记录、安全性、事务管理等。

在AOP中,切面(Aspect)是用于横切关注点的模块化单元。切面包含了一组通知(Advice),通知定义了在何时、何地以及如何将横切关注点应用到目标对象的功能中。通知可以在目标对象的方法执行前、执行后、执行过程中等时机进行拦截和处理。AOP框架在运行时将切面织入到应用程序的相应连接点(join point)上,以实现横切关注点的功能。

AOP的主要优点包括:

解耦关注点和核心业务逻辑:将横切关注点与核心业务逻辑分离,使得业务逻辑更加清晰,易于维护和修改。

提高代码重用性:通过将横切关注点模块化,可以在多个应用程序模块中重用,减少了代码重复。

集中化管理:通过切面集中管理横切关注点,可以更容易地管理和维护这些关注点,例如统一管理日志记录、安全检查等功能。

提高系统的可维护性和可扩展性:通过AOP可以更容易地对系统进行功能增加、修改和维护,而不需要修改核心业务逻辑。

Spring框架是一个支持AOP的Java框架,它提供了丰富的AOP功能,包括声明式AOP和编程式AOP。在Spring中,可以使用AspectJ语法或者基于注解的方式来定义切面和通知,从而实现AOP功能

AOP的实现原理

通过反射机制
通过切面和代理模式
切面 通知和切点  对目标切点进行通知 有--前置、后置、环绕、返回、异常
代理模式 通过反射机制对某个程序代理,一个新的代理对象


实现原理主要涉及两个核心概念:切面(Aspect)和代理模式(Proxy Pattern)。

切面(Aspect):

切面是横切关注点的模块化单元,它包含了一组通知(Advice)以及切点(Pointcut)的定义。
通知定义了在何时、何地以及如何将横切关注点应用到目标对象的功能中,包括前置通知(Before Advice)、后置通知(After Advice)、返回通知(After Returning Advice)、异常通知(After Throwing Advice)和环绕通知(Around Advice)等。
切点定义了横切关注点应用的具体位置或者条件,通常使用表达式或者匹配模式来描述。
代理模式(Proxy Pattern):

AOP的实现通常依赖于代理模式,通过在运行时动态地创建代理对象来实现横切关注点的织入。
在基于接口的代理中,AOP框架会为目标对象生成一个代理对象,该代理对象实现了与目标对象相同的接口,并在代理对象的方法中调用相应的通知。
在基于类的代理中,AOP框架会为目标对象生成一个子类,并覆盖目标对象中的方法,以调用相应的通知。
AOP的实现步骤通常包括以下几个阶段:

定义切面和通知:开发人员定义切面和通知,包括通知的类型(前置、后置、返回、异常、环绕)以及切点的位置或者条件。

创建代理对象:在运行时,AOP框架根据切面和通知的定义,动态地创建代理对象,代理对象会织入通知的功能。

目标对象方法调用:当应用程序调用目标对象的方法时,实际上调用的是代理对象的方法,代理对象会根据切面和通知的定义,在适当的时机调用相应的通知。

通知执行:通知在切点位置或者满足切点条件时执行,执行前置通知、后置通知、返回通知、异常通知和环绕通知等。

Spring框架是一个支持AOP的Java框架,在Spring中,可以通过AspectJ语法或者基于注解的方式定义切面和通知,并且Spring框架会在运行时动态地创建代理对象,实现横切关注点的织入。

JDK动态代理怎么实现的 ||还有gldb代理

JDK动态代理是Java提供的一种动态代理机制,它允许在运行时动态地创建代理对象,而无需预先定义代理类。JDK动态代理是基于接口的代理,它要求目标对象必须实现至少一个接口。

实现JDK动态代理的关键是使用了Java.lang.reflect包中的Proxy和InvocationHandler接口。

创建代理对象:首先,需要定义一个实现InvocationHandler接口的代理处理器类。该处理器类负责在代理对象的方法被调用时进行处理。代理处理器类通常包含一个目标对象的引用,以便在处理代理方法时调用目标对象的方法。

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class MyInvocationHandler implements InvocationHandler {
    private Object target; // 目标对象的引用

    public MyInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 在代理方法调用前执行其他逻辑
        System.out.println("Before method: " + method.getName());

        // 调用目标对象的方法
        Object result = method.invoke(target, args);

        // 在代理方法调用后执行其他逻辑
        System.out.println("After method: " + method.getName());

        return result;
    }
}
获取代理对象:接下来,使用Proxy类的静态方法newProxyInstance()来动态创建代理对象。该方法接受三个参数:类加载器(ClassLoader)、目标对象实现的接口(interfaces)、以及代理处理器对象(InvocationHandler)。

import java.lang.reflect.Proxy;

public class Main {
    public static void main(String[] args) {
        // 创建目标对象
        RealSubject realSubject = new RealSubject();

        // 创建代理处理器对象
        MyInvocationHandler handler = new MyInvocationHandler(realSubject);

        // 创建代理对象
        Subject proxySubject = (Subject) Proxy.newProxyInstance(
            RealSubject.class.getClassLoader(),  // 类加载器
            RealSubject.class.getInterfaces(),   // 接口列表
            handler);                            // 代理处理器

        // 调用代理对象的方法
        proxySubject.request();
    }
}
在运行时,当调用代理对象的方法时,代理处理器的invoke()方法会被调用,并在其中执行额外的逻辑。然后,代理处理器会调用目标对象的相应方法,完成实际的业务逻辑。

springmvc的工作原理

servelt 
m mode
v view
c contrller

用户发出请求 打到链接  链接通过disptchsevelt 解析链接信息 通过拦截器 执行对应的hander操作 之后是否放行,一责任链执行对应的业务,返回处理信息 经过视图解析器 解析信息 进行渲染 返回页面

客户端发起请求:当客户端(通常是浏览器)发送 HTTP 请求到 Web 服务器时,请求被接收并传递给 Spring MVC 前端控制器(DispatcherServlet)。
DispatcherServlet 处理请求:DispatcherServlet 是 Spring MVC 的核心,它接收所有的客户端请求并将请求分发给相应的处理器(Handler)。
HandlerMapping 映射处理器:DispatcherServlet 通过 HandlerMapping(处理器映射器)找到适当的处理器来处理请求。HandlerMapping 将请求的 URL 映射到处理器的执行链(HandlerExecutionChain)上。
处理器执行链:处理器执行链包含了一个或多个处理器(Handler)以及处理器相关的拦截器(Interceptor)。拦截器允许开发者在请求处理前后进行自定义的处理。处理器执行链会按照拦截器的顺序依次调用拦截器的预处理方法,然后调用处理器的处理方法。
处理器执行:处理器执行方法会根据请求的内容(通常是 URL)执行相应的业务逻辑,并返回一个 ModelAndView 对象,该对象包含了响应的数据以及要转发或重定向的视图名。
ViewResolver 解析视图:DispatcherServlet 通过 ViewResolver(视图解析器)将逻辑视图名解析为真正的视图对象。视图对象负责渲染数据以生成最终的 HTTP 响应。
渲染视图:视图对象根据 ModelAndView 中的数据渲染视图,生成最终的 HTTP 响应内容。
返回响应:最终的 HTTP 响应由 DispatcherServlet 返回给客户端,请求处理完成。



image-20231129151539848

mybatis #分和$的区别?

一个是预处理  一个是占位符

mybatis动态sql标签

<where>
<if>
<for>
if:根据条件判断是否包含某段 SQL 语句。
xml
Copy code
<select id="selectUserByCondition" parameterType="map" resultType="User">
    SELECT * FROM users
    <where>
        <if test="username != null">
            AND username = #{username}
        </if>
        <if test="age != null">
            AND age = #{age}
        </if>
    </where>
</select>
choose、when、otherwise:类似于 Java 中的 switch 语句,根据条件选择执行其中一个分支。
xml
Copy code
<select id="selectUserByCondition" parameterType="map" resultType="User">
    SELECT * FROM users
    <where>
        <choose>
            <when test="username != null">
                AND username = #{username}
            </when>
            <when test="age != null">
                AND age = #{age}
            </when>
            <otherwise>
                AND status = 'active'
            </otherwise>
        </choose>
    </where>
</select>
trim、set、where:用于去除 SQL 语句中的多余空格或者条件。
xml
Copy code
<update id="updateUser" parameterType="User">
    UPDATE users
    <set>
        <if test="username != null">username = #{username},</if>
        <if test="password != null">password = #{password},</if>
    </set>
    WHERE id = #{id}
</update>
foreach:用于循环遍历集合中的元素生成对应的 SQL 语句片段。
xml
Copy code
<select id="selectUsersByIds" parameterType="List" resultType="User">
    SELECT * FROM users
    WHERE id IN
    <foreach item="id" collection="ids" open="(" separator="," close=")">
        #{id}
    </foreach>
</select>
这些动态 SQL 标签可以让我们根据不同的条件动态地构建 SQL 语句,从而提高了 SQL 的灵活性和可维护性。

mybatis的延迟加载

springboot自动装配原理

@SpringBootApplication这个注解里面有@EnableAutoConfiguration

说到自动装配先说springboot的stater的自定义 
有三个模块 分别是 stater模块 业务模块 自动配置模块
对于自定义的stater的定义需要几个注解是  
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication
@EnableConfigurationProperties(HelloWorldProperties.class)
主要依靠是自动配置模块 在这个模块里面资源文件有个META_INFO里面有个配置文件 记录自动配置的
然后通过ImportSelector

当spring导入这些stater  在spring启动就会根据这些配置文件的自动装配

实现线程的方式

继承Thread类
实现Runnable接口
线程池

说一下锁

锁 有乐观锁 悲观锁
乐观锁 就是自认为安全不用加锁  有cas 自旋锁
悲观锁就是 加锁
锁有sy... 可重入锁  非公平锁  java的关键字 jvm 就是在加锁时候失去资源时候再次获取资源不用去。。 因为非重入锁所以 只有在出现异常和执行完才释放锁
lock 不可重入锁 通过方法更改是否公平锁  其中lock是JUC的接口  使用起来比较方便,通过lock unlock进行枷锁和释放锁




1. **乐观锁(Optimistic Locking)**:乐观锁的基本思想是,认为并发访问的冲突不会频繁发生,因此不需要使用锁来保护共享资源,而是在更新数据时不加锁,而是在提交时检查是否有其他线程同时修改了数据,如果有则进行相应的处理,比如回滚事务或者重试。乐观锁的常见实现方式包括版本号机制和 CAS(Compare and Swap)操作。

2. **悲观锁(Pessimistic Locking)**:悲观锁的基本思想是,认为并发访问的冲突会频繁发生,因此在访问共享资源之前先加锁,确保同一时刻只有一个线程能够访问共享资源。悲观锁常见的实现方式包括 synchronized 关键字和 ReentrantLock 类。

3. **可重入锁(Reentrant Lock)**:可重入锁允许同一个线程多次获取同一把锁而不会造成死锁。Java 中的 ReentrantLock 就是可重入锁的一个典型实现,它允许线程在持有锁的情况下再次获取同一把锁而不被阻塞。

4. **非公平锁(Non-fair Lock)**:非公平锁是指在多个线程竞争锁时,不考虑线程等待时间,直接尝试获取锁,不保证获取锁的顺序与线程请求锁的顺序一致。相对应的,公平锁会按照线程请求锁的顺序进行获取。

5. **关于 Java 的关键字和 JVM 加锁的优化**:在 Java 中,关键字 `synchronized` 可以用来实现内置锁,它在底层实现时会利用 JVM 的相关机制来进行加锁和解锁操作。Java 的关键字 `synchronized` 是可重入锁的一种实现,并且在释放锁时会考虑到异常情况,确保在出现异常时也能够正确释放锁。

6. **Lock 接口**:`java.util.concurrent.locks.Lock` 是 Java 并发包中提供的一个接口,它提供了比 `synchronized` 更灵活的锁机制。通过 `Lock` 接口的实现类,比如 `ReentrantLock`,可以更精细地控制锁的获取和释放过程,包括是否公平获取锁、是否可中断等。相对于 `synchronized`,`Lock` 接口的使用更加灵活,但也需要手动释放锁,以避免出现死锁等问题。

总的来说,锁是多线程编程中非常重要的一部分,了解不同类型的锁以及其使用场景和特点,能够帮助我们编写出更加健壮和高效的多线程程序。

synchronized使用

可以添加在类和方法上  还有代码块
添加在类上 实现只有一个线程访问
在方法上在一顶并发上实现数据的一直
在代码块 对代码块

是否用过自定义线程池

自定义线程池??

import java.util.concurrent.*;

public class CustomThreadPool {
    public static void main(String[] args) {
        // 创建自定义线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2, // 核心线程数
            5, // 最大线程数
            10, // 空闲线程存活时间
            TimeUnit.SECONDS, // 存活时间单位
            new LinkedBlockingQueue<>(10) // 阻塞队列
        );

        // 提交任务给线程池执行
        for (int i = 0; i < 10; i++) {
            executor.execute(new Task(i));
        }

        // 关闭线程池
        executor.shutdown();
    }

    static class Task implements Runnable {
        private final int taskId;

        public Task(int taskId) {
            this.taskId = taskId;
        }

        @Override
        public void run() {
            System.out.println("Task " + taskId + " is running on " + Thread.currentThread().getName());
            try {
                // 模拟任务执行耗时
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}




public ThreadPoolExecutor(
    int corePoolSize,
    int maximumPoolSize,
    long keepAliveTime,
    TimeUnit unit,
    BlockingQueue<Runnable> workQueue,
    ThreadFactory threadFactory,
    RejectedExecutionHandler handler)
    
几个核心参数的作用:
 corePoolSize: 线程池核心线程数最大值
 maximumPoolSize: 线程池最大线程数大小
 keepAliveTime: 线程池中非核心线程空闲✁存活时间大小
 unit: 线程空闲存活时间单位
 workQueue: 存放任务✁阻塞队列
 threadFactory: 用于设置创✁线程✁工厂,可以给创✁✁线程设置有意义✁名字,可方便排查问题。
 handler: 线城池✁饱和策略事件,主要有四种类型。
    
 四种饱和拒绝策略
 AbortPolicy(抛出一个异常,默认✁) 
 DiscardPolicy(直接丢弃任务) 
 DiscardOldestPolicy(丢弃队列里最老✁任务,将当前这个任务继续提交给线程池)
 CallerRunsPolicy(交给线程池调用所在✁线程进行处理)

线程池的核心参数

几个核心参数的作用:
 corePoolSize: 线程池核心线程数最大值
 maximumPoolSize: 线程池最大线程数大小
 keepAliveTime: 线程池中非核心线程空闲✁存活时间大小
 unit: 线程空闲存活时间单位
 workQueue: 存放任务✁阻塞队列
 threadFactory: 用于设置创✁线程✁工厂,可以给创✁✁线程设置有意义✁名字,可方便排查问题。
 handler: 线城池✁饱和策略事件,主要有四种类型。

jvm内存结构

堆 方法区     jvm栈  程序计数器  本地方法栈
堆  程序的对象存放地方
方法区  即老年代 类信息 常量 静态变量
jvm栈 在程序的局部变量 方法出口
程序 在运行方法什么加1  对于归零的 GC

运行时常量池放在什么地方

在 Java 虚拟机(JVM)中,运行时常量池(Runtime Constant Pool)是方法区(Method Area)的一部分

堆中存放什么

new的对象  对象实例

说一下垃圾回收算法

垃圾回收有 
 标记清除法
 复制清除法
 标记整理
 分代清除

说一下集合和map

集合 Collect 最大的集合接口  
旗下是抽象接口 LISt set queue  其下是各个抽象接口
list 有 vector  linklist ArrayList
set  hashset treeset

map不属于Collect 其下十七抽象接口  有实例hashmap treemap hashtable

哪些可以重复,哪些不能重复

List 和 Queue 允许重复元素,因为它们是有序集合,可以通过索引或者队列的方式访问元素。
而 Set 和 Map 不允许重复元素,因为它们要保证元素的唯一性

ArrayList和LinkedList的区别?

ArrayList是以动态数组  在获取数据效率很高 在插入删除很慢
LinkedList是以双向链表  相反

ArrayList怎么扩容的

ArrayList 有所谓的扩容因子  在容量到0.75时候触发扩容 根据扩容因子

hashmap的数据结构

底层是以 数组加链表
数组加红黑树

什么是哈希冲突

当不同的key在经过hashcode计算相同的地址

哈希冲突指的是当两个不同的键经过哈希函数计算得到相同的哈希值,从而映射到了数组的同一个位置上。在 HashMap 中,当发生哈希冲突时,会采用链地址法(Separate Chaining)或者红黑树来解决冲突。链地址法是将具有相同哈希值的键值对存储在同一个桶中的链表或者红黑树中,以链表或者红黑树的形式存储冲突的键值对。

异常机制

throw new 一个异常
发生数据异常


### 异常类(Exception Class):

Java 中的异常都是通过类来表示的,这些类都继承自 Throwable 类。主要分为两种类型:

1. **受检异常(Checked Exception)**:受检异常是指在编译时由编译器强制要求捕获或声明的异常,必须在代码中显式处理,否则会导致编译错误。常见的受检异常包括 IOException、SQLException 等。

2. **非受检异常(Unchecked Exception)**:非受检异常是指在编译时不会被检查的异常,通常是程序运行时发生的错误或者不可预知的异常情况,不要求在代码中显式处理。常见的非受检异常包括 NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException 等。

### 异常处理(Exception Handling):

异常处理是指在程序中捕获、处理和抛出异常的过程。Java 中的异常处理通过 try-catch-finally 结构来实现。通常的异常处理流程如下:

1. **try 块**:用于包含可能发生异常的代码块。

2. **catch 块**:用于捕获 try 块中抛出的异常,并进行相应的处理。可以有多个 catch 块来捕获不同类型的异常。

3. **finally 块**:无论是否发生异常,finally 块中的代码都会被执行,通常用于释放资源等清理工作。

### 异常抛出(Exception Throwing):

在程序中,当发生异常情况时,可以使用 throw 关键字来手动抛出异常。throw 关键字后面跟着一个异常对象,表示要抛出的异常类型。通常情况下,抛出的异常对象应该是某个异常类的实例。

### 异常链(Exception Chaining):

异常链是指在捕获到一个异常后,如果不想处理这个异常,可以将其包装成另外一个异常再次抛出,这样可以在不同的层次传播异常,并保留原始异常的信息。

### 自定义异常(Custom Exception):

除了使用 Java 提供的异常类,还可以自定义异常类来表示特定的异常情况。自定义异常类通常需要继承自 Exception 类或其子类,并可以添加自定义的属性和方法。

Java 的异常机制为程序员提供了一种有效地处理程序中出现的异常情况的方式,能够提高程序的健壮性和可靠性。

异常的处理方法

try catch环绕
throws 关键字上抛出

throw new null...

常见的异常类型

空指针异常
类转换异常
io异常

数组下标越界异常
非法参数异常
非法状态异常
文件找不到异常
算数异常


项目中什么时候该抛出异常,什么时候该捕获异常

抛出异常:
错误的输入参数:当方法接收到不合法或不正确的输入参数时,应该抛出 IllegalArgumentException 异常。
不可恢复的错误:当发生不可恢复的错误,导致程序无法继续执行时,应该抛出适当的异常,如 NullPointerException、ArrayIndexOutOfBoundsException、IOException 等。
业务逻辑异常:当业务逻辑出现异常或违反约定时,应该抛出自定义的业务异常,以便上层调用者能够识别并处理这些异常情况。
资源释放失败:当资源(如文件、数据库连接、网络连接等)无法正确释放时,应该抛出异常,以避免资源泄漏。

捕获异常:
异常处理:在可能发生异常的代码块中捕获异常,并进行适当的处理,以确保程序的正常运行或提供合适的错误提示给用户。
异常传递:在适当的时候捕获异常并进行处理,然后根据实际情况决定是否继续抛出异常,或者将异常转化为其他异常再抛出。
资源释放:在使用资源的代码块中捕获异常,并在 finally 块中确保资源的正确释放,以避免资源泄漏。


在事务 如果需要事务继续 不会滚需要捕获异常

一个对象如何实现序列化的

对象实现接口 Se...  不需要实现方法

通过file输入输出流  搭配Object的输入输出流 处理对象序列化

项目中有sql优化的经验吗

有  添加索引
索引  聚簇索引 非聚簇索引
聚簇索引就是主键  没有主键就第一个字段  为一约束的
非聚簇  不是主键
索引  索引覆盖   回表
如果索引有所查询的数据  
不是 再次根据主键查询所有信息 就是回表

mysql的优化

数据库建立索引的原则

非聚簇索引 查询字段较多的  
聚簇索引  主键或唯一约束字段

mysql的索引类型

B-Tree 索引:B-Tree(平衡树)索引是 MySQL 中最常见的索引类型,它适用于等值查询、范围查询和排序操作。B-Tree 索引适用于大多数查询场景,包括单列索引和组合索引。

哈希索引:哈希索引适用于等值查询,但不适合范围查询和排序操作。在 MySQL 中,哈希索引只适用于 MEMORY 存储引擎,并且只能创建在 CHAR、VARCHAR、BINARY 和 VARBINARY 数据类型上。

全文索引:全文索引用于全文搜索操作,允许在文本字段上执行全文搜索。MySQL 的全文索引基于 MyISAM 存储引擎,并且只能创建在 TEXT、CHAR 和 VARCHAR 数据类型上。

空间索引:空间索引用于在空间数据类型上执行空间查询。MySQL 支持的空间数据类型包括 GEOMETRY、POINT、LINESTRING、POLYGON 等,可以使用空间索引加速空间查询操作。

组合索引:组合索引是指将多个列组合在一起创建的索引,用于支持多列查询。组合索引适用于多列的等值查询、范围查询和排序操作,可以提高查询的性能。

什么是聚簇索引,什么是非聚簇索引

非聚簇索引 
聚簇索引  主键或唯一约束字段

mysql默认的存储引擎是什么

Innodb

innodb支持行锁吗

支持 表锁 行锁 

innodb的行锁怎么实现的

什么是数据库悲观锁,什么是乐观锁

什么情况下使用悲观锁,什么情况下使用乐观锁

如何解决死锁

死锁的条件破坏 
循环等待
请求与保持
非剥夺条件
互斥条件

资源重组合理安排

redis在项目中的应用

做缓存 
zset可以做实时排行榜
做单点登录 存储session
拦截器可以作防抖和流量控制

如何解决缓存击穿、缓存穿透、缓存雪崩

缓存穿透  请求大量非需要字段  直接穿透redis访问数据库   设置拦截器对请求字段过滤 空值字段 布隆过滤器
缓存击穿  热点数据的key过期   合理设置过期时间以及key续命
缓存雪崩  大量的热点数据key 过期    限流熔断  或者热点数据不过期

linux常用命令查看进程、解压缩文件等

ps -aux
ps -ef
tar -zxf
tar -zcf

JavaScript获取id

打印日志命令

log.info()

用过svn和git吗,git常用命令

git init
git add .
git commit -m ""
git branch -m main
git remote orgin ...
git push
git clone

nodeJs了解吗,使用过吗

设计模式使用过工厂和单例还用过哪个

什么是单例模式

单例模式的实现方法

饿汉式和懒汉式的区别

eazyexcel怎么使用

tomcat的bin目录下的命令

tomcat的配置文件的作用,conf目录下的

线上项目报错信息在哪查看

JavalO操作有哪些注意事项? 面试官提示,多线程方面?

线上Java项目报错信息在哪查看,异常抛出在哪

Java异常体系,在项目什么时候该抛出异常什么时候该捕获异常

刚学java菜鸡,永劫无间蚀月,王者荣耀王者,金铲铲小铂金,第五人格菜鸡,原神开服玩家,星穹铁道菜鸡,崩坏的菜鸡,闪耀暖暖,和平精英,LOL,CSGO,以及三A大作收集者等等。。。