小厂golang实习一面凉经

学的主要是java,然而Boss直聘海投没细看投了go后端,结果简历居然过了筛。整体面下来感觉还是很不错的,面试官态度很好,只是这次准备实在不充分,很多东西答不上来,凉的很透。不过第一次线下面还算是收获颇丰,所以整理总结一下。


目录

1.自我介绍

2.看你简历里客户端后端前端都做过,为什么选择后端?

3.项目中的难点,怎么解决的

4.说说Jwt吧,它的原理

5.看到你项目里用的是MySQL对吧,你了解MySQL索引么?它用了什么数据结构?

6.为什么要用B+树做索引?它有哪些优点?怎么不用二叉树?

7.B+树在B树上做的改进?

8.对mysql的索引调优你有什么了解?

9.你的项目中用Redis做了什么?

10.Redis索引的机制?

11.讲一下乐观锁

12.http的状态码

13.说说工厂模式

反问环节


1.自我介绍

2.看你简历里客户端后端前端都做过,为什么选择后端?

(回答大概是后端比较符合个人兴趣,前端太杂了,面试官表示前端还在发展中,目前机会可能比较多,后端发展较早水可能比较深,但是成规模,总之各有利弊。)

3.项目中的难点,怎么解决的

由于需要处理用户权限问题而使用了SpringSecurity框架,其中考虑到安全性而使用了Jwt进行加密处理,但是Security本身有一个BCrypt密码加密的格式问题,所以查了一些博客和谷歌来解决了该问题。

4.说说Jwt吧,它的原理

(这里答得乱七八糟)

用户登录后,前端给后端提供一个表单信息,后端将Json字符加密并签发一个token给前端让其储存。前端储存后每次请求信息时都带上该token给后端,用于验证权限,后端验证成功后再将数据返回。

面试官:你说的这是用户权限处理吧,那这个传递过程中如何保证token信息没有被前端篡改呢?

(短路中,一下想不起来相关信息。)

面试官:那除了Jwt以外你还了解哪些认证方式呢?

还了解一个传统的认证方法,大概是把用户信息放在浏览器的cookie里,但是这样做的弊端是如果使用的不是浏览器而是客户端,因为没有cookie就没有办法移植了。而且也不安全。

面试官:你说的是session吧,为什么不安全呢?

(流汗中)因为信息存在cookie里……吧,是明文么?

面试官:

它不是明文,其实它是安全的,是加密过的一串码,最不安全的是Jwt。

之前的这个方式需要一个表,存储加密后的数据对应的用户信息,这就导致了性能上的浪费,而且如果这个表出了问题,整个业务就无法继续运行,因此有了Jwt。

Jwt一般是分三段,标头(Header)、有效载荷(Payload)和签名(Signature)。服务端提供一个签名来保证token不被篡改,如果修改了token就会验证失败。

现在做验证用的基本上用的都是Jwt,当然一些大公司有别的技术就是另外一回事了。

(找了个 博客详细了解了一下)

header和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法,从payload中获取有效数据。
signature由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。服务端获取header中的加密算法之后,利用该算法加上secretKey对header、payload进行加密,比对加密后的数据和客户端发送过来的是否一致。注意secretKey只能保存在服务端,而且对于不同的加密算法其含义有所不同,一般对于MD5类型的摘要加密算法,secretKey实际上代表的是盐值。

5.看到你项目里用的是MySQL对吧,你了解MySQL索引么?它用了什么数据结构?

了解一些,用的是b+树。

6.为什么要用B+树做索引?它有哪些优点?怎么不用二叉树?

(胡诌)B+树节点可以有多个元素,是一对多的关系所以比较适合做索引吧。二叉树容易不平衡然后成为斜树……

面试官:那平衡的呢

平衡的,平衡的就没有顺序了吧。好像这部分数据结构是为了解决某些问题发展的,先二叉树再红黑树再b树再b+树。

面试官:嗯,确实是。那平衡也有顺序的二叉树,为啥不用呢?

(不知道)

面试官:这个还得从早期的磁盘说起,磁盘主要的限制是什么?(分块读取?)不对,是随机寻址效率很低,寻一个地址大概需要多少多少毫秒。二叉树层数太高了,寻址次数就会相应增加,那就太慢了,因此引入了B树。

7.B+树在B树上做的改进?

B+树在节点的数据存储上做了改变吧,B+树的节点只存储索引key值,具体信息的地址存在于叶子节点的地址中。

面试官:是的,那有什么好处呢?

我猜是IO读写降低了?(开摆)

面试官:这样它就把所有信息都放在了叶子节点里,然后就可以成块查询。(这里我真没太听明白)还做了其他改进么?

我:不清楚了。

面试官:B+树中叶子和叶子节点间增加了一个双向的链表,这样查找就不用再返回到根节点了。更有便于范围查询。

8.对mysql的索引调优你有什么了解?

不了解。

9.你的项目中用Redis做了什么?

用户登录时将信息存入redis,收到token后解析出id,在redis里通过用户id查找用户信息,如果没有该id则未登录,登出时从库里删除该id。

面试官:为什么要用redis呢,和mysql的区别在哪?

答:处理一下高并发吧,因为是暂时性的信息,频繁存取,感觉用redis好一点。

(面试官表示没有问题,但对我的小项目来说意义不大,因为不存在高并发。)

10.Redis索引的机制?

不了解。

11.讲一下乐观锁

(脑子短路巴拉巴拉一顿讲,结果讲成了悲观锁。)

面试官:这很基础,你回去查。

回来重新查了下,感觉简单来说就是悲观锁在用共享资源时就给锁上,后面的人想用得等前面的人开锁。乐观锁就是用且信任这资源没问题,只是会检查一下资源是否被改动,改动了就重新读。

12.http的状态码

200 500 402 404 只了解这几个

面试官:按段来吧,每段都分别是什么错误

没有归纳过。大概凭经验答了一下200是成功,400段是用户权限出问题或者请求信息出问题,500段是后端服务器bug。

小厂golang实习一面凉经_第1张图片

回来找了一张图 ,300重定向这个真没见过。

13.说说工厂模式

感觉一下很难说,先问了一下什么工厂模式,抽象工厂么?然后简单的举了个生产各种牌子的电脑的例子。

面试官:工厂模式的好处在哪?

解耦,可以省去多余参数的考虑。

面试官:这种设计模式主要依赖面向对象语言的哪个特性呢?

好久没看java基础,加上紧张居然把三大特性都忘了……大脑一片空白,想半天只吭哧出一句封装。

面试官:其实主要依赖的是多态性,像电脑可以通过一个工厂产出多个牌子都属于多态。


反问环节

问了想要提高计算机水平有什么推荐的书籍,于是得到了一堆mysql的资料。面试官反复强调了几遍一定要找实习,说我们这一届很卷。语言方面面试官表示高级语言都只是抓手,主要看中的还是知识深度。总之感受到了自己知识储备的巨大缺口qwq

你可能感兴趣的:(面试,java,mysql)