【百度】四面面试题总结分享

2020-11-30 10:56:11 浏览数 (1)

一面

  • redis和etcd的区别
  1. 从数据结构方面来讲 Redis支持多种数据类型(string,set,list,hash,zset)
  2. 从读写性能上来讲,Redis读写性能优异,并且提供了RDB、AOF持久化,而etcd v3的底层采用boltdb做存储,value直接持久化
  3. 从使用场景上来看,etcd更适用于服务发现,配置管理,而Redis更适用于非强一致性的需求,比如说是队列,缓存,分布式Session
  4. 两者都是KV存储,但是etcd通过Raft算法保证了各个节点间的数据和事务的一致性,更强调各个节点间的通信;Redis则时更像是内存式的缓存,因此来说读写能力很强。
  5. Redis是c开发的,etcd是go开发的,他是源于k8s的兴起作为一个服务发现。
  6. etcd v3只能通过gRPC访问,而redis可以通过http访问,因此etcd的客户端开发工作量高很多。
  • etcd的Raft算法介绍一下
  • ping指令的实现,涉及到哪些协议
  • linux的用户态和内核态,什么时候切换到内核态
  • 为什么说线程的切换比协程要慢
  • redis、etcd 分布式锁的实现
  • redis string类型的底层实现
  • 和c语言string的区别
  1. 获取字符串长度只需要O(1)的时间复杂度,程序仅需要访问SDS的len属性即可
  2. c语言会产生缓冲区溢出,在Redis中如果需要对SDS进行修改时,API回显检查SDS的空间是否满足修改所需要的要求,如果不满足的话,API会自动将SDS的空间拓展到执行修改所需要的大小,然后才执行实际的修改操作
  3. 减少修改字符串时带来的内存重分配次数,SDS通过free属性记录未使用的字节,通过未使用空间,SDS实现了空间预分配和惰性空间释放两种优化策略。是的修改字符串长度N次最多需要执行N次的内存重分配。
  4. 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是怎么实现的啊,有什么可以优化的点吗

怎么查找程序的性能瓶颈等等

0 人点赞