面试复盘(北京某小公司)

北京某小公司一面复盘

先和面试官做了自我介绍,然后他问了我的一些基本情况。然后开始问项目

问:谈一谈项目中有哪些亮点?

我用redis来做验证码的缓存,当用户登录时,刷新得到验证码,验证码会被放到redis当中,key为生成的随机字符串,value即为言验证码内容,在cookie当中也会存储这个字符串,当用户提交表单时,后端会取到cookie的值,然后从reids缓存中根据key取到验证码的值进行判断即可验证验证码是否正确。

问:为什么要把key存放到cookie当中呢,session不可以吗?

可以存放在session当中,但session是存在服务器上的,因为验证码经常被刷新,所以这可能对服务器来说经常刷新不太友好,所以把它存放在cookie当中

问:为什么还要把验证码存放在redis当中呢?直接存放在cookie不可以吗?

因为验证码存放在cookie当时是可修改的,那么就是不安全的,如果用户修改了cookie中验证码的值就会出现错误。

问:那我修改cookie当中的key,不就跟修改验证码一样吗?修改之后你可能在redis当中找不到

。。。确实是这样(当时直接懵了,面完之后想了想这真是一个大问题,看来项目还是没研究透,还需要自己延申思考)

问:还有其他亮点吗?

采用线程池来异步发送注册激活邮件,这可以大大提高响应速度,也不会造成主线程的堵塞。

问:那这个线程是怎么创建的呢,手动创建吗?

这个是由线程池作为管理的,然后我说了说线程池创建函数的七个参数代表什么含义,以及线程池的执行原理。

问:深入问一下,那任务结束后,这些线程(非核心线程)如何回收呢?线程池如何实现的?

这个是由KeepAliveTime参数决定的,他决定了非核心线程的存活时间,比如说我们设置为60s,非核心线程空闲后,60s之后就会给线程池终止。(面试官点了点头)

问:项目中kafka是怎么用的?

主要用到系统通知,当有用户点赞,评论,关注时,就会触发这个机制,生产者负责把时间消息放到队列之中,消费者,也就是被通知人会从消息队列当中获取消息,并把消息落到数据库当中。然后读取数据库将消息发给指定用户。

问:点赞,关注这些你是怎么设计的?

这个是用到了redis作为缓存,因为他有这个持久化机制,而不需要把数据再放到数据库当中,每次都要读取,这样会很消耗时间,因为redis是基于内存操作的,所以速度很快。点赞的key设计为一个字符串,主要是加上当前实体类型,帖子为1,评论为2,再加上实体的id,当用户点赞时,数量加1,再次点赞,减1。关注就是运用到这个有序集合,某个实体的粉丝设计的key的字符串主要是加上当前实体的id,value为粉丝的id,score设置为时间。关注列表也类似。

问:那设想一下如果我要实现查看两个人共同关注的功能,这个场景如何实现?

运用集合的特性,做交集即可得到。

问:实现某个人发布帖子后,他的粉丝列表会收到推送,这个你会怎么做呢?

我觉得可以用kafka吧,当贴子发布后,他的粉丝就是消费者,直接从里面拿取。

面试官说这个性能不太好,你这个相当于是拉的方式,最好用推(面完我查了查,可以用WebSocket来实现实时推送)

问:说一下http和https有什么区别?

http和https最大的区别就是安全性,http的建立过程较为简单,而https的建立过程涉及到了身份验证的等环节,还需要建立SSL连接,所以他的保密性更强!

问:说一下https的建立过程

。。。G,背的八股忘了。磕磕巴巴的说了一些

反问环节:

  • 公司是做什么的?
    • 主做大数据风控

面试官问我薪资要求,我说公司一般给到多少?他说本科生是最低200外加每天25的餐补,你是硕士,可以给你多申请一些,但不会到300。

感悟

项目还是琢磨的不够,八股文有的地方记得也不扎实,需要继续努力!下面会有二面,说要考考算法,看看编码能力(真是搞不懂小公司都面上算法了?)

记于——2024年3月19日23:30

你可能感兴趣的:(面经,面试,职场和发展)