虾皮一面
1.Redis被大量访问导致压力过大如何解决?
答:分级缓存,利用guava或者ConcurrentHashMap作为内存缓存。限流。利用Redis集群,集群中每一个节点部署以一主多从。
2.Kafka为什么这么快?
答:消息压缩,消息批量发送,零拷贝,IO多路复用,一个主题多个Partition,利用broker集群,将一个topic下的多个partition部署在多个broker上,消费者组中一个消费者对应一个partition。
3.Redis中的Zset是用什么数据结构实现的,为什么这个实现?
答:用跳表。至于为什么这个实现,只打出插入删除时间复杂度为O(1),利用链表建立多级索引,查找某一节点的时间复杂度为O(logN),链表实现起来比红黑树简单,debug也更加直观,感觉没答到点上,答得不好。
4. Mysql为什么要用B+树做索引?
答:B+树非聚簇索引的非叶子节点只存储索引列,叶子节点存储主键,聚簇索引非叶子节点主存储主键,叶子节点存储完整行数据,而B树非叶子节点也存储行数据,这样一比较,B+树非叶子节点可以存储更多的索引,树的层高就可以更短,从而可以减少数据库磁盘IO的次数,而磁盘IO较内存IO慢很多,并且,B+树叶子节点用链表连接起来,便于范围查询。
5. 介绍一下并发编程?
答:简单说了一下JMM。也就是每一个线程都有自己的工作内存,工作内存使用的变量是从主内存加载的副本,如果没有加volatile关键字的话,工作内存不会将变量的变化同步到主内存,其他线程也无法得知变量被其他线程所更改。然后说了一下synchronized的重量级锁是利用操作系统的Mutex原语实现的,线程获取不到锁会进入阻塞状态,并等待操作系统唤醒,而java优化了synchronized关键字,它会在获取锁时,尝试cas自旋一段时间,如果超出时间还没有获取到锁,则锁升级为重量级锁(这些内容都忘的差不多了,不知道对不对)。
6. 为什么Java1.8后ConcurrentHashMap同步机制从ReentrantLock变为了synchronized?
答:不知道
7. 面试官介绍了一下部门业务,是搜索部门。
8.两道算法题,比较简单。
一个是删除一个有序链表中存在重复值的所有节点。另一个是返回一个数组中当前位置以及后N个位置中最小值,每一个位置都要返回。第一个太简单了直接秒了,后一个觉得应该用单调栈或者单调队列做,但是没时间了,我就直接用TreeSet暴力秒了。
总体感觉问的比较简单。面试完两个小时HR约了第二场面试。