概述
这篇博客记录面试
3-7 上午 谷露软件
这家岗位是DevOps
算法
- reverse linkedList
- two sum
golang 相关
- GC
- GMP
- Go如何保证线程安全
- CAS
k8s
- k8s的组件
- 通过最近几天的学习你对k8s有什么了解
- MySQL主从复制
项目
- redis的应用
- 排行榜、效率工具
今天下午其实还去谷露做了二面,由于体验不是很好,也没问技术相关的问题,主要是问了未来的计划,所以这里就不记录了
3-7 下午 星宙之形
一面
- go channel在工作中用过嘛
工作中确实没用过
- 那你自己对channel有了解嘛
有一点了解
- channel的使用场景
控制并发、做消息队列
- 为什么channel可以控制并发
channel 内部有加了互斥锁
- channel的类型以及不同类型的使用场景
有缓存和无缓存. 有缓存的channel可以拿来当队列使用,无缓存的当时没答上来,在面试官的引导下说了一种。(其实就是前面提到的控制并发)比如可以控制不同的goroutine的执行。
- go里面的切片用过吧?那你说一下如果定义了一个切片,在方法内部对这个切片做了一些修改的操作,方法结束后这个切片会跟着改变吗?
用过,不一定会改变,如果对切片做了扩容操作那么就会创建一个新的切片对象,这样一来就和之前切片不一样了,如果没有做扩容操作的话,原来的切片就会跟着改变。
- 那我怎么可以拿到改变后的切片呢?不管有没有扩容
可以在传参的时候传递切片的指针。
- go的map是线程不安全的,并发时会加锁;如果有个map数据会被并发访问,如果加了锁会导致性能下降,如何解决这个问题呢?
这个没什么思路,面试官也引导我向粒度的问题靠近,最后的解决办法就是降低锁的粒度,可以给这个map拆分成多个map,把比较热点的kv提出来放到单独的一个map里面。
- MySQL的索引是什么结构,为什么要用这个结构?
B+树,减少硬盘的寻道时间,提高搜索速度
- B+树和二叉树有什么区别
二叉树每个节点只有两个子节点,B+树可以有多个节点
- B+树里面存了什么?聚簇索引是什么,联合索引存了什么?通过联合索引怎么找到数据的?
B+树的数据存在叶子节点上,聚簇索引是MySQL里的主键索引,聚簇索引的B+树存了表每一列的主键和对应的数据。联合索引也是一个B+树,保存了该索引键和对应列的主键,这一块叫做回表。
- 为什么你们要用gRPC,直接用HTTP不行吗?
gRPC是远程过程调用,可以调其他服务的方法,另外gRPC用了HTTP2的协议,有HTTP2的一些特性,比如长连接,可以在请求数据的时候保存请求头等信息,节省传输资源,提高传输效率。同时有ProtoBuf这个序列化协议加持,可以对数据进行高效的处理。
- 为什么用ProtoBuf,那么麻烦还需要定义一堆规则,不同的语言也要用不同的序列化工具,多不方便,为什么不直接用JSON
ProtoBuf主要是砍掉了传输数据中的key,用提前定义好的索引1、2、3、4……来定位value,因此需要传输的数据比JSON少,也不需要传花括号这些内容。像go里面的int64类型,也做了一些特殊处理,大小并不是固定的,所以也可以节约资源。
- Redis可以拿来做什么
消息队列,缓存
- 消息队列怎么实现
说了半天,其实可以用list实现
二面
二面主要聊了项目,也涉及了一些一面中问到的问题,主要是考察我符不符合他们团队的风格,我个人感觉我还是可以的,我也很喜欢他们的风格,和二面面试官聊完之后我就贼想来这家公司了。