足足1h,因为面试官在一个地方集体面试,太吵了。
介绍完了之后问我消息队列的削峰填谷是怎么做的?
我说前面部分与redis打交道,完成redis库存的减。然后这一部分算完成了,你把这个信息发送给消息队列,后面专门有一个消费者,来处理后面的订单完整的创建的过程。就是前面与redis打交道,后面与mysql打交道。
然后说,那会不会产生redis和mysql不一致的问题呢?
(有一说一,这里面的一致性到还真的没有考虑。)当时我没回答好,说什么分布式事务,会回滚什么,其实分布式事务不在这里。
然后面试官说,就是这其实是一个看谁的问题,就是最终保持与redis一致,还是与mysql一致?
我说这里应该得看与redis一致,然后问我怎么一致?
我先说了先写数据库,然后删除缓存。
他说你不是要与缓存一致吗?怎么做呢?就是缓存覆盖数据库的过程,是在业务执行过程中覆盖呢?还是业务执行完了覆盖?
我说如果可以的话,对业务进行回滚,在覆盖。
但是貌似不对。然后又思考了一会儿,回答不出来了。
(哎,感觉就是前面的说错了呀。首先这里面我觉得一开始产生不一致的源头的搞清楚。因为这里面前面处理redis,后面处理mysql,如果产生不一致,那么可能是后面的消费者处理的时候,出现了问题,所以需要有消费者ack确认机制等等。是吧,然后他问的几个别的问题稍微思考下吧。)
联合索引六个例子,判断,为什么⑧也符合最多原则?优化器优化。
(我自己说一下对上面这个的见解。就是说,如果秒杀的时候,rabbitmq发的异步消息,然后rabbitmq宕机了,那怎么办,redis的缓存库存和mysql不一致了呀?
那我觉得宕机了,那肯定首先是要对rabbitmq做主从,做到高可用,让他能够保证最终一致性。然后就算如果真的宕机不一致了。因为这是秒杀跟库存有关,而不是一般情况的读多写少的缓存商品库存的场景。感觉还是得需要做到看缓存,而不是看数据库。那如何最终同步呢?最终库存为0同步就行了吧。??)
然后给场景,一只有一个打印机,如何处理高并发的请求。
我说一个队列放需要打印的东西,然后有一个epoll的多路复用技术,可以并发的监听。
说不要说底层的,得说实际代码能用的。
我说创建线程池,去接受请求,然后请求的数据放入队列中,开一个另外的线程打印。
那么问题来了,另外的那个打印线程,怎么样监听到数据呢?就是难道一直CPU轮训吗?
我说countdownlatch,或者线程有数据后发送信号给打印队列,打印队列进行打印。
给你三个线程,如何等待三个线程完成,在干别的事情呢?
我说用join,主线程创建,然后join。
他说如果线程数目很多呢?
我说可以用signal,都满足之后,再进行下一步。countdownlatch。
反正面试官给我的感觉总是我不对,但是我感觉好像对的呀。特别的上面的那个join,说了很多他好像不知道这个join的语法。
问了我单例模式有哪几种,我说了饿汉懒汉。 然后出了常见的还有双重检查,静态内部类,枚举来实现。然后枚举可以有效的避免被反射和序列化。
手写单例模式,volatile拼写不对,不过单例写出来绰绰有余。
然后就是sql语句,写出每一个班级的最高成绩的同学名称。
我用了group by having score = max(score)
看得出他不想让我这样写
又问了我如何写每一个班的前两名成绩的同学。
我打算用group by后面orderby得到前两名,但其实是不行的
后面没有写出来,而且用limit也不对,因为limit只能拿到所有的前两名。
后面反问问了面试官,然后说需要over函数,rownumber函数等等,这就确实有点超出我的范围了。(后面我自己学了,确实是简单的。)
然后问我实验室都干了什么呀,我说科研,然后这个中控系统是我做的。一篇论文是在物联网的基础上发的。
然后问是不是代码敲得比较少,我说这个中控系统是我做的,还有挺多的python内容等等,字里行间还是缺乏实战经验。
然后问,给你一个场景。我是机票部门的嘛,问你给你所有城市之间的连线,求两个城市之间是否联通?
我说这个的话首先建图,然后利用并查集,求出所有联通图。
然后他说,是求出比如A到B的路径?
那我说建图,BFS呗。
八股这是其中一个,另外的想不起来了?
讲讲ConcurrentHashMap的内部实现?
然后说如果用concurrentHashmap,首先get,然后value+1,再put回去,会有什么问题?
我说了覆盖,然后具体的覆盖的流程也讲了。
然后说为什么会出现呢?
Emmm,我说可以同时读引起的,不过看面试官表情应该是不对。
部门,只有北京吗,技术栈。
然后问他前面那个sql,看起来sql还得看看啊,哎~