七叶笔记 » golang编程 » 「第四十七期」奇安信Golang服务端面经

「第四十七期」奇安信Golang服务端面经

一面(40分钟,部分面经):

项目相关:

  • 这个分布式缓存是做什么的?
  • 缓存和缓存后面的数据库怎么保证数据的一致性?
  • 什么是LRU算法?嘴撕LRU算法。。
  • 如果有数据插入进来会到队列头部,那如果有大量数据插入进来,原来的热数据不是会被挤出内存?怎么解决?这个问题?
  • 一致性哈希(这个面试官不懂一致性哈希,一直不懂为什么这个环结构能降低数据迁移的代价。最后画图讲清楚。。。。。)
  • 校内经历做过一些爬虫,这里问了一些爬虫相关的东西。
  • 怎么反爬?
  • 爬过哪些网站?
  • 微博怎么爬,知乎怎么爬的。
  • 用什么语言做的?

基础:

  • MongoDB有什么事务的支持?
  • 事务有什么特征?
  • 一致性?
  • 假设A向B转了10块钱,这时候在A数据库中减了10,但是在B的数据库中加10的过程中失败了,怎么办?用类似消息队列持久化请求,不断重试?如果一直不成功?甚至B的账号注销了?直接利用持久化的信息回滚A,退回钱。

手撕算法:

  • 一个数据组,无序,数据没有规律,怎么在其中找出一个数?直接遍历,时间复杂度O(n)可以吗?不可以。要小于O(n)级别。(这里我想他的意思是一个固定的数组,然后不断去找,通过Map去记录可能可以加速)
  • 二分查找。

二面:

基本都在扩展项目:

  • 项目了的LRU是怎么实现的,用Map和Queue是实现的。
  • 用Map和Queue太消耗内存了,怎么办?Map里存的是key/value的指针,不存具体的值。
  • 还有其它方法?牺牲时间效率,去掉Map,只用Queue去做LRU。
  • 缓存怎么解决时间戳问题?
  • 每个value都设置缓存过期时间,查找值的时候,把如果发现过期了,就去后面的数据库捞起来更新?
  • 如果需要一过期就踢出内存呢?
  • 开启另外一个线程,定时扫描。代价太大。。

不会了。。。

  • 有没有了解过redis的内存淘汰策略?随机淘汰一批。(恍然大悟)

面试官给我总结了redis和memcached的内存淘汰策略,让我可以多去了解缓存方面相关的开源产品的实现方案。

  • 有没有看过什么源码呢?比如etcd之类的
  • 最近看什么书?有什么收获?
  • 了解面向对象吗?

最后建议我以后可以去学习一下Rust语言,意思是这个语言像C++这类一样可以学到很多计算机底层的知识,但是学习成本又比C++小很多,Java和Go封装的太好,比较适合做业务,但会掩盖很多问题。

相关文章