服务端开发值Java备战秋招面试4
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了服务端开发值Java备战秋招面试4相关的知识,希望对你有一定的参考价值。
今天继续开始学习,Java之路还很长,路漫漫其修远兮,一步一个脚印子才行,大家一起加油吧。还是老样子,今天继续八股文和算法题!
目录
1.mongodb和mysql,redis的区别?
MySQL是传统的关系型数据库,支持事务管理,持久化存储,存放在磁盘里面,检索的话,会涉及到一定的 IO,海量数据处理时效率变慢。
mongodb是非关系型数据库属于文档数据库,不支持事务,它将热数据存储在内存中,使得热数据的读写变得很快。它适用于数据不是特别重要(例如通知,推送这些),数据表结构变化较为频繁,数据量特别大,数据的并发性特别高,数据结构比较特别(例如地图的位置坐标)。
redis内存数据库,也是非关系型数据库,数据保存在内存中,速度快,支持数据持久化,支持AOF和RDB两种持久化方式,有丰富的数据类型。Redis数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的LRU算法删除数据。
2.drop和delete、truncate的区别?
drop、truncate、delete它们的用法是不同的
drop(丢弃数据): drop table 表名 ,直接将表都删除掉,在删除表的时候使用。
truncate (清空数据) : truncate table 表名 ,只删除表中的数据,再插入数据的时候自增长id又从1开始,在清空表中数据的时候使用。
delete(删除数据) : delete from 表名 where 列名=值,删除某一列的数据,如果不加 where 子句和truncate table 表名作用类似。
truncate 和不带 where 子句的 delete、以及 drop 都会删除表内的数据,但是 truncate 和 delete 只删除数据不删除表的结构(定义),执行drop语句,此表的结构也会删除,也就是执行 drop 之后对应的表不复存在。
它们属于不同的数据库语言
truncate和drop 属于DDL(数据定义语言)语句,操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。而 delete 语句是DML (数据库操作语言)语句,这个操作会放到 rollback segement 中,事务提交之后才生效。
它们的执行速度不同
drop>truncate>delete
3.redis支持的数据结构及应用场景?
常见的5种类型:字符串,列表,哈希,集合,有序集合。
字符串(String):缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。计数器:当遇到需求,在规定时间,用户的访问量不能超过规定次数的时候就可以用redis中的计数器来实现了
哈希(hash):Hash是一个Mapmap,Value值本身又是一种键值对结构,所有hash的命令都是h开头的常用的命令有: hget 、hset 、hdel、hgetall等 。购物车:以用户id为key,商品id为field,商品数量为value,恰好构成购物车的3个要素。
列表(List) 说白了就是链表(redis 使用双端链表实现的 List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。常用的命令有:lpush、rpush、lpop、rpop、lrange等。timeline:例如微博的时间轴,有人发布微博,用lpush加入时间轴,展示新的列表信息。
集合(set):集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中 1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。1.标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。2.点赞,或点踩,收藏等,可以放到set中实现.
有序集合(zset):有序集合和集合有着必然的联系,它和set一样是不可重复的,区别在于多了score值,用来代表排序的权重。也就是当你需要一个有序的,不可重复的集合列表时,就可以考虑使用这种数据类型。排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
4.url输入之后的全过程?
1.浏览器解析域名得到服务器ip地址;
2.TCP三次握手建立客户端和服务器的连接;
3.客户端发送HTTP请求获取服务器端的静态资源;
4.服务器发送HTTP响应报文给客户端,客户端获取到页面静态资源;
5.TCP四次挥手关闭客户端和服务器的连接;
6.浏览器解析文档资源并渲染页面。
5.HTTP状态码?
1:服务端收到请求,需要请求者执行操作;2.操作被成功接收并处理;3.重定向 ;4.客户端错误;5.服务器端错误。
下面是常见的 HTTP 状态码:
- 200 - 请求成功
- 301 - 资源(网页等)被永久转移到其它URL
- 404 - 请求的资源(网页等)不存在
- 500 - 内部服务器错误
6.get和post的区别?
POST和GET都是HTTP请求的基本方法。最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
1)GET请求在浏览器刷新或者回退的时候是无害的。POST的话数据会被重新提交。
2)GET可以存在缓存中。POST不行.
3)GET 编码格式只能用ASCII码,POST没有限制.
4)可见性 参数在URL用户可以看见,POST的参数在REQUSET BODY中不会被用户看见.GET相对不安全 POST相对安全些
5)GET请求在URL中传送的参数是有长度限制的,而POST么有。
6)GET 和POST在请求的时候:
6-1 GET 是将数据中的hearder 和 data 一起发送给服务端,返回200code
6-2 POST 是先将hearder发给服务器返回100continue,再发送data给到服务器,返回200
6-3 GET 就发送了一个TCP数据包给服务器而POST发送了两次TCP数据包给服务器
7.算法题:树的层次遍历?
题目链接:求二叉树的层序遍历_牛客题霸_牛客网
思路1:借助两个辅助辅助队列实现,如下:
import java.util.*;
/*
* public class TreeNode
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
*
*/
public class Solution
/**
*
* @param root TreeNode类
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root)
// write code here
if(root == null)
return new ArrayList<>() ;
Queue<TreeNode> queue = new LinkedList<>() ;
Queue<TreeNode> queue1 = new LinkedList<>() ;
queue.offer(root) ;
ArrayList<ArrayList<Integer>> res = new ArrayList<>() ;
ArrayList<Integer> list = new ArrayList<>() ;
while(!queue.isEmpty() || !queue1.isEmpty())
while(!queue.isEmpty())
TreeNode node = queue.poll() ;
list.add(node.val) ;
if(node.left != null)
queue1.offer(node.left) ;
if(node.right != null)
queue1.offer(node.right) ;
if(!list.isEmpty())
res.add(list) ;
list = new ArrayList<>() ;
while(!queue1.isEmpty())
TreeNode node = queue1.poll() ;
list.add(node.val) ;
if(node.left != null)
queue.offer(node.left) ;
if(node.right != null)
queue.offer(node.right) ;
if(!list.isEmpty())
res.add(list) ;
list = new ArrayList<>() ;
return res ;
思路2:使用一个辅助队列也能实现,如下:
import java.util.*;
/*
* public class TreeNode
* int val = 0;
* TreeNode left = null;
* TreeNode right = null;
*
*/
public class Solution
/**
*
* @param root TreeNode类
* @return int整型ArrayList<ArrayList<>>
*/
public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root)
// write code here
ArrayList<ArrayList<Integer>> arraylist = new ArrayList<>() ;
if(root == null)
return arraylist ;
Queue<TreeNode> queue = new LinkedList<>() ;
queue.offer(root) ;
while(!queue.isEmpty())
int size = queue.size() ;
ArrayList<Integer> list = new ArrayList<>() ;
for(int i=0; i<size; i++)
TreeNode node = queue.poll() ;
list.add(node.val) ;
if(node.left != null)
queue.offer(node.left) ;
if(node.right != null)
queue.offer(node.right) ;
arraylist.add(list) ;
return arraylist ;
8.mysql主键和索引的区别?
数据库有两种查询方式,一个全表扫描,条件匹配。一个是索引,索引可以提高查询的速度。主键用于唯一标识表中某一行的属性或属性组,而索引用于快速寻找具有特定值的记录.数据库管理系统对于主键自动生成唯一索引,主键一定是唯一性索引,唯一性索引并不一定就是主键。一个表中可以有多个候选索引,但只能有一个主键,主键列不允许空值,而索引列允许空值。
9.线程池作用是什么?线程池的参数?
作用:
- 降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。
- 提高响应速度;任务来了,直接有线程可用可执行,而不需要先创建线程,在执行。
- 提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控。
推荐通过 new ThreadPoolExecutor() 的写法创建线程池,这样写线程数量更灵活,开发中多数用这个类创建线程。
参数包括:
corePoolSize :代表核心线程数,也就是正常情况下创建的工作线程数,这些线程创建后并不会销毁,而是会常驻;
maxinumPoolSize:代表的是最大线程数,它与核心线程数相对应,表示最大允许创建的线程数,比如任务较多,将核心线程数都用完了,仍然无法满足需求时,此时就会继续创建新的线程,但是线程池内线程总数不会超过最大线程数;
keepAliveTime:表示超出核心线程数之外的线程的空闲时间,也就是说核心线程不会消除,但是超出核心线程数的部分线程如果空闲一定时间则会销毁,我们可以通过设置keepAliveTime来控制空闲时间;
unit:表示空闲时间的单位;
workQueue:用来存放待执行的任务,假设我们现在核心线程都被使用了,还有任务进来则全部放入等待队列中,直到等待队列放满任务还再继续加入新任务则会创建新的新的线程;
ThreadFactory:实际上是一个线程工厂,用来生产线程执行任务。我们可以选择使用默认的创建工厂,生产的线程在同一个组内,拥有相同的优先级,且都不是守护线程。当然我们也可以根据业务需要选择自定义线程工厂;
Handler:任务拒绝策略,有两种情况,第一种时当我们调用shutdown等方法关闭线程池后,这时候即使线程池内部还有未执行完成的任务,但是由于线程池已经关闭,我们再继续向线程池提交任务就会遭到拒绝。另外一种情况时当达到最大线程数,线程池已经没有能力继续处理新提交的任务时,这是也就是拒绝。
9.linux查询一个log文件里面的特定字段?
grep -i 关键子 文件名
linux项目部署常用命令如下:Linux常用命令(一) 项目部署常用命令_linux部署项目常用命令_xzh_2022的博客-CSDN博客
10.http和https的区别?对称加密与非对称加密?
HTTP是超文本传输协议,以明文方式发送内容,不提供任何方式的数据加密。HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。https则是具有安全性的ssl加密传输协议。http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。并且https协议需要到ca申请证书。HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
1、区别:加密一般分为两种,对称加密和非对称加密。对称加密就是加密解密都用同一个秘钥,比如DES、3DES(TripleDES)和AES等。
非对称加密就是加密和解密不是用的同一种秘钥,比如RSA算法、DSA算法、ECC算法、DH算法等。
在非对称加密中,用来加密的秘钥叫公钥,用来解密的秘钥叫私钥。公钥和私钥都是成对生成的,公钥分发给其他人用来加密,私钥用来解密。
2、优缺点:
对称加密:解密速度快,但保密性差。
非对称加密:加密算法保密性好,它消除了最终用户交换密钥的需要。但是加解密速度要远远低于对称加密。
11.udp和tcp和ip分别在那个层?
IP位于TCP/IP模型的网络层,对上可载送传输层各种协议的信息,例如TCP、UDP等;对下可将IP信息包放到链路层,通过以太网、令牌环网络等各种技术来传送。
TCP是位于TCP/IP模型传输层的协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。
UDP是位于TCP/IP模型传输层的协议,提供面向事务的简单不可靠信息传送服务。
IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性。解决互联网问题,实现大规模、异构网络的互联互通。分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,旨在适应支持多网络应用的分层协议层次结构。
用户数据报协议(UDP,User Datagram Protocol)为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
12.redis的持久化方式?
redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)
RDB:就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF:将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了;
RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
参考博客:redis的持久化_redis持久化_热爱编程的五年的博客-CSDN博客
13.说一下你了解的Tomcat?
Tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用。
建议使用nginx和Tomcat配合,Nginx处理静态,Tomcat处理动态程序。
具体的看这篇博客就可以:一篇带你们认识tomcat!东西全在这里了_咸蛋黄派的博客-CSDN博客_127.0.0.1:8019
14.Nginx了解吗?负载均衡?反向代理?
负载均衡是将请求分配到不同服务单元,既可以是同一台服务器的不同进程,也可以是不同服务器,这样既保证服务的高可用性,又保证高并发情况下得响应速度,能够给用户更好的体验。
常用的负载均衡的策略:
1)基于轮询的负载均衡(默认)
每个请求,按时间顺序逐一分配到不同的后端应用服务器节点,如果后端服务出现故障,nginx能够自动剔除该节点。
2)基于权重(weight)的负载均衡
权重(weight)默认值为1,权重越高,被分配的请求数量越多
3)基于IP HASH的负载均衡
每个请求,按照访问IP的hash结果分配,由于hash值为不重复的唯一值,因此每个请求能够固定访问同一个后端服务器,这样可以做到会话保持,解决session同步问题。
4)基于fair方式
根据后端服务器的响应时间来分配请求,响应时间短的节点被优先分配。
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
1.可以起到保护网站安全的作用,因为任何来自Internet的请求都必须先经过代理服务器。
2.通过缓存静态资源,加速Web请求。
3.实现负载均衡。顺便说下,目前市面上,主流的负载均衡方案,硬件设备有F5,软件方案有四层负载均衡的LVS,七层负载均衡的Nginx、Haproxy等。
在生产环境,Tomcat服务器一般不单独使用在项目中,我们一般通过nginx用于反向代理的服务器,并将请求转发给后端多台Tomcat服务器,从而达到负载均衡的目的。
15.eureka的注册机制?
我们看一下Eureka的基本原理,服务提供者会向注册中心注册自己的信息,消费者需要信息时候,直接根据服务名称从注册中心拉去即可。如果服务提供者提供多个服务,一般会根据负载均衡原理从服务列表中挑一个。服务提供者每30s会向注册中心提供一次心跳,这样就可以感知服务的健康状态了,有效地避免了消费者拉去到不健康的服务。
以上是关于服务端开发值Java备战秋招面试4的主要内容,如果未能解决你的问题,请参考以下文章