来自蘑菇博客 http://www.moguit.cn
第一面我觉得应该是基础面,重点考察的是自己技术的广度 和一些技术的掌握情况,一面小哥哥也没有深究于某个特定的点,面试时间大约1个小时。
自我介绍
怎么打算投递后台岗位的,没有考虑契合自己研究方向的工作?
有了解过OAuth2.0么,说说你对OAuth2.0的理解
蘑菇博客开发过程中,有了解或学习其它的开源框架么
蘑菇博客文章发布的流程是怎么样的,是多人博客系统么
对其它的一些博客框架有了解么,比如hexo
hexo和蘑菇博客相比有什么区别呢?蘑菇博客多了哪些功能和优势
看你蘑菇博客用到了RabbitMQ,那谈谈为什么引入RabbitMQ?
RabbitMQ和其它消息队列,比如ActiveMQ,RocketMQ,Kafka有什么区别
Redis在你博客项目中的使用,为什么引入Redis?
Redis中存储的是热门文章,是通过什么来得到的?这样做会有什么问题么?
有听过长尾效应么?你通过推荐字段设置的推荐等级,这样会让这些文章一直保持在较高的点击量,而且热度和点击量也不会随着时间而降低,有什么解决方案么?
我看到你有用到JustAuth这个登录授权?说说它会存在账号泄漏的问题么?
下面谈谈Redis,它会存在线程切换的问题么?
谈谈Redis单线程模型和IO多路复用
Redis的大Key的问题,如果有个Value的大小是2M,会有什么问题么?最大支持的Value大小是多少?
谈谈Redis集群 Redis Cluster,以及主从复制原理?
说说Redis中的哨兵,即Redis Sentinel
下面来聊聊Linux,你知道Linux怎么查看当前的负载情况么?
你还知道其它的一些Linux命令么?
cat、tail、vi、vim命令的区别,分别说一说?
如果Linux下需要打开或者查看大文件,你会怎么做?
下面聊聊Http Code,你知道 3XX 状态码 对应的是什么?
在谈谈你知道的其它一些状态码,4XX 和 5XX?
下面我们来做个题目吧?语言任意,选择喜欢的(ps:其实是leetCode原题,没有做过类似的,想了几分钟没有思路,哭。。,想问问思路,然后说换一题吧,那就)
# 给定一些数组,例如下面的格式,他们都表示一个区间,然后你需要将区间进行合并
[1,2],[2,4],[3,7],[8,11]
# 如上所示, [1,2] 和 [2,4] = [1,4]
# 然后 [1,4] 和 [3,7] = [1,7]
# 最后 [1,7] 和 [8,11] 无法合并,所以最后结果应该返回 [1,7],[8,11]
# 给定一个数组,例如 [1,1,2,2,2,3,3,3,3]这样的,里面的数组不一定连续并且有序,假设我输入 2,这个2表示出现次数最高的两个
# 那么你需要给我返回 2,3
然后我最开始的思路就是,通过hash存储出现的次数,然后key就是数组中出现的值。最后在对hash中的次数进行排序,最后得到top N,因为时间复杂度是O(N^2),问有没有优化思路,能否优化到O(N),想了半天没有想出来,没有充分运用已经构建好的hash表
后面面试官给讲了一下思路。最后我们一次遍历,已经得到这样一个hash表
# key:数组中的值,value:出现的次数
map = {
1: 2
2: 3
3: 4
}
# 因为说过出现的次数是不会有相同的,所以可以翻转hash,也就是把原来的key作为value,value作为key
tmpMap = {
2: 1,
3: 2,
4: 3
}
# 然后因为数组的出现次数最多是 len(array),也就是数组的长度,那么我们只需要从长度最高的去遍历,然后从hash中取,如果能取到,表明就是最多的
count = 0
ret = []
for i in range(len(array), 0, -1):
if tmpMap.get(i):
ret.append(tmpMap.get(i))
count += 1
if count > 2:
return ret
二面考察的是技术深度面试,面试时间大约50分钟左右
自我介绍
博客已经开源了么,用的什么开源协议,博客的用户多么?
看你博客中用到了Solr和ElasticSearch,谈谈它们的原理,以及倒排索引?
对于Solr或者ES里面用到的一些中文分词器有了解过么?
谈谈那些技术栈,你比较熟悉的是那些,mysql 和redis?
聊聊MySQL的底层索引结构,InnoDB里面的B+Tree?
B Tree 和 B+ Tree的区别
聊聊MySQL索引的发展过程?是一来就是B+Tree的么?从 没有索引、hash、二叉排序树、AVL树、B树、B+树 聊。
谈谈MySQL里面的事务,说说什么是事务?
MySQL里面有那些事务级别,并且不同的事务级别会出现什么问题?
谈谈可重复读和幻读的区别?
MySQL中如果使用like进行模糊匹配的时候,是否会使用索引?一定不会用么?(索引这块了解的太少了,二面结束后,回去恶补了一下)
谈谈Redis吧,在你项目中的具体使用?
谈谈Redis如何实现分布式锁?
蘑菇博客是否存在缓存不一致的情况,你是如何解决的?
谈谈Redis中缓存穿透的问题,以及解决的方法?
还有其它解决缓存穿透的方法么?布隆过滤器有了解过么?
Redis中大面积的缓存失效,然后请求全部打到数据库,有什么解决方法?
如果出现一些热点数据,比如明星之间的新闻,造成大量的吃瓜用户涌入后台,但是服务器还没有缓存对应的数据,这样可能造成数据库宕机,如何避免这样的情况?
聊聊 JVM的组成结构?
谈谈垃圾收集原理?以及垃圾收集算法
复制算法 和 标记整理算法?
为什么不在新生代使用标记整理算法?或者在老年代使用复制算法?
有了解过Volatile么?谈谈你对Volatile的理解
Volatile如何保证可见性的?以及如何实现可见性的机制。
如果大量的使用Volatile存在什么问题?
谈谈操作系统的线程,以及它的状态
线程和进程的区别?
为什么要提出多线程应用,而不是多进程应用呢?
Linux你平时都有用到什么命令呢?
如果我需要查看端口号或者进程号,你会使用什么命令?
谈谈你做的另外一个项目吧?稍微介绍一下
来吧,写个题目试试
# 链表的两两翻转
# 给定链表: 1->2->3->4->5->6->7
# 返回结果: 2->1->4->3->6->5->7
应该是Leader面,从发量可以看出是资深的大佬~,面试时间大概50分钟
create table 'tb' (
id int,
name varchar(64),
status int,
createtime timestamp,
PRIMARY KEY (`id`)
)
-- 创建了三个普通索引
create index index_name on table('name')
create index index_status on table('status')
create index index_createtime on table('createtime')
-- 给定SQL语句,判断下面查询会用到几个索引
select * from tb where status = 1 and name = "zhangsan"
花10来分钟做个简单的沟通
字节跳动总体来说,面试体验还很不错的,尤其是在手撕代码题的时候,面试老哥会先叫你提供思路,如果你说的思路有问题的话,会帮你拨正,然后在进入coding阶段,但是怎奈何平时没怎么练习算法,leetcode做的少,面试两行泪。。这也算是提前批打响第一枪,期待后面精彩表现~