杭州元启视界

地址

27双非本 杭州某500人厂 一面(30min)_牛客网

1.什么是跨域问题?

跨域问题就是指前端js请求后端接口时,浏览器会判断当前网页的url(这个是网页自身的url地址)和请求的服务器的url是否同源,如果协议、域名和端口有一个不同,那么浏览器就会判定为跨域请求并拦截。

2.如何解决跨域问题。

我所知道的就两种方式,一种在后端解决,一种在前端解决。

1.配置CORS,也就是在服务器上设置相应的响应头。在java的spring中,可以通过创建WebMvcConfigurer对象,重写它的addCorsMappings方法,配置相应的请求域名、请求方式等内容,然后注册到spring容器中来解决。

2.前端的话可以通过反向代理的方式来解决,就是通过把请求转发给同源的代理服务器,然后由代理服务器代为转发给目标服务器,以绕过浏览器的同源策略检测。

正向代理(Forward Proxy) 反向代理(Reverse Proxy)
作用对象 代表 客户端 访问服务器 代表 服务器 接收客户端请求
客户端是否感知 客户端知道自己在用代理(如VPN)**** 客户端不知道代理存在(以为是真实服务器)
典型用途 翻墙、隐藏客户端IP 负载均衡、缓存、跨域、安全防护

3.Linux中查询当前端口号被占用的命令。

1
2
3
4
5
netstat -tulnp | grep 端口号
# 或(新系统推荐)
ss -tulnp | grep 端口号
# 查看具体进程
lsof -i :端口号

netstat命令

netstat(Network Statistics)用于显示 网络连接、路由表、接口统计 等网络相关信息。

参数 含义
-t (–tcp) 显示 TCP 协议相关的连接
-u (–udp) 显示 UDP 协议相关的连接
-l (–listening) 仅显示监听(LISTEN)状态的端口
-n (–numeric) 禁用域名解析,直接显示 IP 和端口(加快查询速度)
-p (–program) 显示占用端口的进程名和 PID

典型输出

1
2
3
4
Proto Recv-Q Send-Q Local Address    Foreign Address   State       PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
tcp6 0 0 :::22 :::* LISTEN 567/sshd
udp 0 0 0.0.0.0:53 0.0.0.0:* 789/dnsmasq

lsof命令

lsof(List Open Files)列出 系统中被打开的文件(Linux 中一切皆文件,包括网络连接、设备、管道等)。

常用用法

命令 作用
lsof -i :80 查看 80 端口 被哪个进程占用
lsof -i tcp 查看所有 TCP 连接
lsof -u root 查看 root 用户 打开的文件
lsof -c nginx 查看 nginx 进程 打开的文件

4.什么是MVCC?解决了什么问题?MVCC原理?

八股吟唱

5.什么是单例模式?常用的实现方式?每种实现方式的优缺点?

什么是单例模式?

单例模式就是确保一个类只有一个实例,并对外提供获取这个唯一实例的方法。

(1)饿汉式

就是直接在类上创建一个由final修饰的该类的静态变量,直接在类加载阶段就完成初始化。

1
2
3
4
5
6
7
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}

优点:实现简单。而且因为在类加载阶段就完成了初始化,避免了线程安全问题

缺点:如果实例未被使用的情况下,会导致内存浪费。此外,因为不是延迟加载,所以程序启动的速度也会受到影响。

(2)懒汉式

就是给获取实例的方法加上synchronized关键字,在方法内部会判断实例是否为null,如果为null就进行初始化。然后再返回该对象。

1
2
3
4
5
6
7
8
9
10
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}

优点:实现了延迟加载,提升程序启动速度,在实例未被使用的情况下不会浪费内存。

缺点:因为给方法加了synchronized关键字,所以每次获取实例时都需要同步获取,性能较差、效率低。

(3)双重检查锁

特点就是给实例变量加上volatile关键字来保证变量的可见性和避免指令重排序产生的问题,在方法内部会先判断实例是否为null,为null时在调用synchronized获取当前类的Class对象锁,获取到锁之后,再次判断实例变量是否为null。最后返回创建好后的实例变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

优点:实现了延迟加载(节省内存、提升程序的响应速度),还解决了懒汉式方法的实例获取效率低的问题。

缺点:实现比较复杂,需要使用volatile关键字吧。

(4)静态内部类

就是把对象的实例放到静态内部类的静态变量上进行初始化。

1
2
3
4
5
6
7
8
9
public class Singleton {
private Singleton() {}
private static class Holder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return Holder.INSTANCE;
}
}

优点:静态内部类本身就是延迟加载,只有第一次访问时才会加载,根据类的加载过程,它内部的静态变量也只会初始化一次,所以也不存在线程安全问题。实现更加简单。

缺点:无法传参初始化。

记忆方式:有synchronized:懒汉式和双重检查锁。无synchronized:饿汉式和静态内部类实现

6.场景题:让你设计一个在线题库系统你会如何去设计?

需求分析

技术栈选择

既然是在线题库,那肯定要在数据库中存储响应的题目和标准答案,那么为了保证数据的持久性,存储在mysql中肯定更合适,但访问mysql的速度较慢,所以可以在redis中创建题目的缓存。还有就是,既然是题目,那么肯定要有题目搜索功能,这里我觉得可以使用es来实现题目的检索。对于带有图片的题目,可以通过minio来存储对应的图片。

追问,表结构如何设计?

临场发挥吧

7.平常在做项目的时候,发现你的逻辑方法突然不适用当前业务,你会怎么做?

8.项目中的3难点以及你如何思考解决?

9.项目中的压测如何操作的给出具体的数据?