WXG一面凉经
一面
先两道算法题(三十分钟),再问项目,根据项目具体内容提问八股(二十分钟)。被狠狠拷打,水货原型毕露,不过面试官非常的好,对答不出来的也会加以引导。
以下回答如有错误,请各位大佬点点😭
算法题
面试官说哪个语言写都可以,但是我C++有点忘了,换的Java写的。
-
子集 - 力扣78(LeetCode) ******
直接dfs暴搜
-
找到两个串的最长公共子串,若多个任意一个均可
LCS典题。一开始二分想假了,然后直接dp秒了,这里先写的二维dp,跟面试官说可以滚动掉一维,然后演示了一下。
项目和八股
-
介绍项目内容,设计是怎么样的?这套系统如何考虑设计的,从技术实现上来描述一下,比如涉及到的服务、模块、功能、层次?
没条例性地胡扯,想到什么说什么
-
比如如何设计后台接收用户请求?
先通过Nginx转发请求,然后进行身份鉴权,最后才到我们的Controller
-
这里Nginx转发的作用?
一是反向代理,隐藏真实的服务器地址,将请求转发到上游服务器;二是负载均衡,缓解服务器压力
-
负载均衡的方式?
轮询、响应时间、权重、随机、区域
-
-
项目是怎么实现的,用了什么框架?
主要是主流框架SpringBoot、MyBatis,没用中间件
-
你指的中间件是什么?
RabbitMQ、Gateway
-
Gateway是做什么的?
负载均衡、反向代理、请求拦截
-
-
服务直接连的数据库吗?
使用了Redis缓存,先查缓存再查数据库
-
缓存更新策略
主动更新 + 延时删除,以保证数据一致性
-
假如数据库更新成功,但是Redis因为延迟等原因更新失败,你想保证两者保证“事务性”,即同时成功同时失败,该如何处理?
不知道
延时双删:先删除缓存,然后更新数据库,延时一段时间,然后再次删除缓存。 ******
消息队列:数据库更新成功后,将更新操作放入消息队列,由另一个服务消费消息并更新缓存。******
-
Redis缓存存在的问题?
缓存穿透、缓存击穿、缓存雪崩,讲了其各自的原因和解决方法
-
你说解决缓存击穿使用互斥锁,但那些未拿到互斥锁的线程等待时间过长,查询过程就变成串行了,怎么解决?
不知道
反问时,面试官回答的答案:
一种解决方案是请求合并。对于请求相同key的线程,只让一个线程去查询数据库,其他线程等待这个线程的查询结果。这样可以避免多个线程同时查询数据库,减少数据库的压力。这种方案在Go语言中的GroupCache库中有实现。
另一种解决方案是使用限流。对于请求频率过高的key,可以限制其请求频率,超过限制的请求直接返回异常,而不是等待。
-
访问Redis使用TCP还是UDP?
不知道
来自ai的回答:
Redis使用TCP协议进行通信。TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,它能确保数据在网络中的可靠传输。相比之下,UDP(User Datagram Protocol)是一种无连接的协议,它不保证数据的可靠传输。由于Redis需要确保数据的可靠传输,所以选择了TCP协议。
-
TCP与UDP的区别?
忘了,寄,八股没背熟
-
WebSocket使用TCP还是UDP?
不知道,然后瞎吹。因为WebSocket需要保证数据的安全稳定,比如TCP对丢失的数据包会有超时重传的等方式以保证数据稳定。
来自ai的回答,同理Redis。
-
反问
-
问了实际是如何解决缓存击穿、缓存雪崩
-
我存在的问题和不足
题目做的还不错,认为与你参加比赛的经历有关。
但在项目实施上,没有深入思考和探索其中的问题,只是完成了一些基本功能。深入学习和理解使用的技术和框架,例如Spring Boot,理解其内部运行机制。