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