一面
- redis和etcd的区别
- 从数据结构方面来讲 Redis支持多种数据类型(string,set,list,hash,zset)
- 从读写性能上来讲,Redis读写性能优异,并且提供了RDB、AOF持久化,而etcd v3的底层采用boltdb做存储,value直接持久化
- 从使用场景上来看,etcd更适用于服务发现,配置管理,而Redis更适用于非强一致性的需求,比如说是队列,缓存,分布式Session
- 两者都是KV存储,但是etcd通过Raft算法保证了各个节点间的数据和事务的一致性,更强调各个节点间的通信;Redis则时更像是内存式的缓存,因此来说读写能力很强。
- Redis是c开发的,etcd是go开发的,他是源于k8s的兴起作为一个服务发现。
- etcd v3只能通过gRPC访问,而redis可以通过http访问,因此etcd的客户端开发工作量高很多。
- etcd的Raft算法介绍一下
- ping指令的实现,涉及到哪些协议
- linux的用户态和内核态,什么时候切换到内核态
- 为什么说线程的切换比协程要慢
- redis、etcd 分布式锁的实现
- redis string类型的底层实现
- 和c语言string的区别
- 获取字符串长度只需要O(1)的时间复杂度,程序仅需要访问SDS的len属性即可
- c语言会产生缓冲区溢出,在Redis中如果需要对SDS进行修改时,API回显检查SDS的空间是否满足修改所需要的要求,如果不满足的话,API会自动将SDS的空间拓展到执行修改所需要的大小,然后才执行实际的修改操作
- 减少修改字符串时带来的内存重分配次数,SDS通过free属性记录未使用的字节,通过未使用空间,SDS实现了空间预分配和惰性空间释放两种优化策略。是的修改字符串长度N次最多需要执行N次的内存重分配。
- c字符串只能保存文本数据,SDS可以保存文本或者二进制数据
二面
二面基本是场景设计题,具体忘了,有一说一百度面试体验很好,和面试官一起探讨解决的办法
之后有一道智力题吧,有10个元素存到长度为12的数组中,有两个元素重复,找出这两个元素
比如a b通过把元素累加在进行减法运算可以得到a b
通过累乘再进行除法运算可以得到a*b的值
考虑到假如元素溢出,那么可已通过平方累加得到a^2 b^2的值
根据关系式可以求得a,b的值
三面
- go和java的区别 可以从多个角度来讲 比如面向对象来说,多态继承等等 从运行速度来讲,go的并发模型 channel和goroutine 从包管理来讲,go mod 包括之前的dep等等
- go的gmp调度原理
- cpu的上下文切换问题
- channel有无缓冲槽的区别 主要还是从同步和异步来讲
- redis的zset实现
- 负载均衡实现 几道算法题 现场手写的 堆排的一道问题,string化整型,链表反转
四面
手写了两道算法,单链表的中间节点 一道dp题目 百度的算法题目都是easy到meduim级别的
然后对项目问的比较细,比如在实现的虚拟链路中keepalive是怎么实现的啊,有什么可以优化的点吗
怎么查找程序的性能瓶颈等等