【第四十七期】奇安信Golang服务端面经

itmrtan · · 1787 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

一面(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封装的太好,比较适合做业务,但会掩盖很多问题。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1787 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传