面经收集
杭州元启视界
地址
1.什么是跨域问题?
跨域问题就是指前端js请求后端接口时,浏览器会判断当前网页的url(这个是网页自身的url地址)和请求的服务器的url是否同源,如果协议、域名和端口有一个不同,那么浏览器就会判定为跨域请求并拦截。
2.如何解决跨域问题。
我所知道的就两种方式,一种在后端解决,一种在前端解决。
1.配置CORS,也就是在服务器上设置相应的响应头。在java的spring中,可以通过创建WebMvcConfigurer对象,重写它的addCorsMappings方法,配置相应的请求域名、请求方式等内容,然后注册到spring容器中来解决。
2.前端的话可以通过反向代理的方式来解决,就是通过把请求转发给同源的代理服务器,然后由代理服务器代为转发给目标服务器,以绕过浏览器的同源策略检测。
正向代理(Forward Proxy) | 反向代理(Reverse Proxy) | |
---|---|---|
作用对象 | 代表 客户端 访问服务器 | 代表 服务器 接收客户端请求 |
客户端是否感知 | 客户端知道自己在用代理(如VPN)**** | 客户端不知道代理存在(以为是真实服务器) |
典型用途 | 翻墙、隐藏客户端IP | 负载均衡、缓存、跨域、安全防护 |
3.Linux中查询当前端口号被占用的命令。
1 | netstat -tulnp | grep 端口号 |
netstat命令
netstat
(Network Statistics)用于显示 网络连接、路由表、接口统计 等网络相关信息。
参数 | 含义 |
---|---|
-t (–tcp) |
显示 TCP 协议相关的连接 |
-u (–udp) |
显示 UDP 协议相关的连接 |
-l (–listening) |
仅显示监听(LISTEN)状态的端口 |
-n (–numeric) |
禁用域名解析,直接显示 IP 和端口(加快查询速度) |
-p (–program) |
显示占用端口的进程名和 PID |
典型输出
1 | Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name |
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 | public class Singleton { |
优点:实现简单。而且因为在类加载阶段就完成了初始化,避免了线程安全问题。
缺点:如果实例未被使用的情况下,会导致内存浪费。此外,因为不是延迟加载,所以程序启动的速度也会受到影响。
(2)懒汉式
就是给获取实例的方法加上synchronized关键字,在方法内部会判断实例是否为null,如果为null就进行初始化。然后再返回该对象。
1 | public class Singleton { |
优点:实现了延迟加载,提升程序启动速度,在实例未被使用的情况下不会浪费内存。
缺点:因为给方法加了synchronized关键字,所以每次获取实例时都需要同步获取,性能较差、效率低。
(3)双重检查锁
特点就是给实例变量加上volatile关键字来保证变量的可见性和避免指令重排序产生的问题,在方法内部会先判断实例是否为null,为null时在调用synchronized获取当前类的Class对象锁,获取到锁之后,再次判断实例变量是否为null。最后返回创建好后的实例变量。
1 | public class Singleton { |
优点:实现了延迟加载(节省内存、提升程序的响应速度),还解决了懒汉式方法的实例获取效率低的问题。
缺点:实现比较复杂,需要使用volatile关键字吧。
(4)静态内部类
就是把对象的实例放到静态内部类的静态变量上进行初始化。
1 | public class Singleton { |
优点:静态内部类本身就是延迟加载,只有第一次访问时才会加载,根据类的加载过程,它内部的静态变量也只会初始化一次,所以也不存在线程安全问题。实现更加简单。
缺点:无法传参初始化。
记忆方式:有synchronized:懒汉式和双重检查锁。无synchronized:饿汉式和静态内部类实现
6.场景题:让你设计一个在线题库系统你会如何去设计?
需求分析
技术栈选择
既然是在线题库,那肯定要在数据库中存储响应的题目和标准答案,那么为了保证数据的持久性,存储在mysql中肯定更合适,但访问mysql的速度较慢,所以可以在redis中创建题目的缓存。还有就是,既然是题目,那么肯定要有题目搜索功能,这里我觉得可以使用es来实现题目的检索。对于带有图片的题目,可以通过minio来存储对应的图片。
追问,表结构如何设计?
临场发挥吧