在8月4号进行了一面,笔试三道题
- 1.写一个死锁
- 2.找出数组排好序后的前N个数
- 3.写一个限流算法,使得一分钟内api接口只能访问100次(没写出来)
算法结束后开始面试
- 项目
- HashMap(负载因子、容量2的N次方、扩容、1.7和1.8的比较,基本都说了)
- 聊一下垃圾回收机制
- 先讲什么是垃圾,如何找到垃圾(引用计数、根可达算法)
- 讲分代模型,分析各个代的特性
- 讲垃圾回收算法(标记清除、标记整理、复制)
- 讲垃圾回收器(Serial+SerialOld、ParNew+CMS、PS+PO、G1)这里讲的不太好,感觉讲的太久了,有点慌就匆匆结束了。
- 如何排查线上GC频繁的问题(没有线上处理过,这是背的)
- 查看是否最近有新代码上线
- 查看JVM参数设置是否合理
- 排查是否是元空间被打满、内存泄漏、代码显式调用GC方法
- jmap转储堆内存文件,使用jhat进行分析定位可疑对象
- 我常用的GC组合是什么?(说的PS+PO,因为默认jdk1.8用的就是这个)
- 如何保证用户信息的安全?(应该是这样,是一个关于安全的问题,具体记不太清了,我就当作保证用户密码的安全,从而保证用户账户的安全开始讲了)
- 讲密码的存储方式
- 明文+缺点
- 哈希摘要+缺点(彩虹表破解)
- 哈希摘要+盐值
- 基于http协议无法保证安全+中间人攻击
- 问了一下要不要讲https,面试官说不用,她说我好像理解错题意了
- 讲密码的存储方式
- 缓存雪崩讲一下
- 讲了一下定义,就是大批量的key同时过期
- 解决方式:加随机过期时间,还补充了一句:但是本来设置key的时间就是错开的,设置一个固定的就行了,可以加随机过期时间反而还可能适得其反
- 讲一下设计模式?(这个答的是最蠢的,我搁那就开始背23种设计模式了,背了5、6个,我就说除了解释器模式是用于词法语法分析,没有写过demo之外,其它的都有了解,然后面试官也没问)
- 反问:问了一下我的面试表现以及需要改进的地方。
- 答:我看你的项目中用到了Sentinel做限流,觉得你对限流应该有所了解了,我们大部分时候都不会重复造轮子,但是对于使用的框架底层要熟悉一点,这样开发的时候比如说碰上什么bug才知道怎么找。
好像就这些了,记不太清了,面试感觉自己问题还是挺大的,很容易讲着讲着就上头了,然后脑子和嘴就配合不上了,而且确实是对于框架原理没怎么了解过,很多都是拿来用了也就用了,解决了问题就不管了,这在之后需要注意。
呼~,第一场正式面试还是比较紧张的,由于代码撕的不行,特别是面试官说没写出限流挺可惜的时候,我已经觉得凉凉了。没想到今天下午四点吃中午饭的时候(额,别注意这个),来了个浙江杭州的电话,我心想感谢信咋还要打电话过来感谢?(这里有个小插曲,当时嘴里还含着一大口饭在嚼着,我不好意思接电话,然后让面试官又打了一遍)
晚上7点二面
- 自我介绍
- 讲了一下项目用到的微服务技术,但是听我说都是只是简单用一下,就没问了
- 问我Redis我比较熟悉什么?
- 答:底层数据结构、主从复制、集群原理
- 讲一下底层数据结构吧?
- SDS
- 讲了SDS和C字符串的区别和优势
- 空间预分配
- 惰性空间释放
- 字典
- 说了下结构,底层使用了两张哈希表
- 渐进式的hash
- SDS
- Redis一般用来做什么?
- string
- 用来做分布式锁
- hash
- 用来做商城的购物车
- list
- 举例可以做微信订阅号的订阅专栏
- 做缓存,将访问的热点数据进行缓存
- 结合SpringSession完成分布式下会话统一存储
- string
- 为什么用分布式锁?
- 我说是需要降低数据库压力,在需要查库的时候锁住其它线程,使得就一个线程去查库,在集群下单机锁无法保证只有一个线程查库
- 讲一下常见的垃圾收集器
- 讲一下MySQL的索引(这里真的大失败,能答的太多了,但是讲着讲着就慌了,怕讲太久,然后也是匆匆结束了)
- MyISAM和Innodb的聚簇和非聚簇索引
- 二级索引举例又普通索引、唯一索引、前缀索引啥的
- 索引的匹配规则
- 没讲索引失效的情况
- 讲索引组织的数据结构
- AVL树
- 红黑树
- B树,为什么不选择这三种
- 为什么选择了B+树
- 讲一下红黑树?
- 讲红黑树的定义
- 所有节点非黑即红
- 红红不相邻
- 从头走到叶,每条路的黑色节点数目相同
- 头尾都是黑(这个忘记讲了)
- 讲它的好处,扰动性好,调平衡最多三次,快
- 说它可维护性不好,因为插入5种情况需要调平衡,删除8种情况
- 讲SB树、跳表和它的对比
- 讲红黑树的定义
- 讲一下数据库的乐观锁和悲观锁
- 乐观锁MySQL本身不支持,添加version字段,每次操作version+1
- 悲观锁
- 行锁、表锁
- 讲MyISAM和InnoDB支持锁的不同
- 讲InnoDB的行锁,讲到它在不同隔离级别下表现不同,在rr级别下使用间隙锁解决幻读问题
- 反问:问了和一面一样的问题,面试表现,需要改进的地方。
- 得到了一样的答案:需要注意原理,深入了解原理才能更好的回答
- 最后,问我那个一面限流没有写出来,到今天为止有几天了,能不能写出来。
- 我下来之后是有查看过一些实现的,不过没有翻guava的源码,而只是找了几篇博客看了一下,我说能写。
- 然后又发了个链接,磕磕绊绊写了个令牌桶,不知道能不能过。
总的来说,面试体验还是很棒的,我在回答问题的时候面试官会很耐心听。就是我挺不解的,大家在回答问题的时候一般一个问题回答多久呀,我总是从问题发生的原因,演化啥的讲起,一个问题会卡很久,然后就很容易慌了,导致关键点反而没有答好。
三面
- 自我介绍
- 熟悉的技术点有哪些?
- 说的Redis和MySQL
- 先问MySQL
- 如何定位慢SQL语句?
- 这个答的不好,我就讲了自己项目中那个优化的慢SQL,就说的用JMeter压测接口看看吞吐量,低的就用执行计划看看有没有用到索引啥的。。。
- 如何优化SQL?
- 尽量走索引,explain查一下执行计划有没有走索引
- 如果没走,就看看SQL语句是否造成了索引失效
- 看需要的字段,如果不多就直接建组合索引,直接索引覆盖就不用回表了。
- 把MRR开开,将磁盘变成顺序读
- 使用5.6之后版本,在组合索引使用中,进行索引下推
- 增加冗余字段,避免联表查询
- 想不到了。。。:cry:
- 尽量走索引,explain查一下执行计划有没有走索引
- 什么时候用非聚簇索引,什么时候使用聚簇索引?
- 这个还真不知道,我就直接开始说索引的数据结构了,又是一套数据结构的选择(hash、B树到B+树),balabala...
- 最后直接说如果记录很大,一个节点存不了几个就用非聚簇索引。其实我挺迷惑的,因为一级索引聚簇不聚簇不是存储引擎已经决定了吗?
- 如何定位慢SQL语句?
- 问Redis
- 如果让你实现list,你怎么做?
- 分析了一下链表,说指针一个得8字节,可能内容比起这些指针都要小,所以使用数组实现。(好像答非所问)
- 如果让你实现zset,你怎么做?
- 讲了一下跳表的算法增删改查咋做。
- 这两题真是不懂咋说。。。
- 如果让你实现list,你怎么做?
- 公平锁和非公平锁?
- Java的注解底层怎么实现的?
- 不懂...
- 讲了一下平时用注解的情况,说做参数校验的时候进行过自定义注解
- 设计模式,在平时怎么用的,用的多的有什么?
- 从单例开始讲:
- 懒汉式
- 饿汉式
- DCL(打断,讲太具体了,结合一下平时做的项目啥的,实际上怎么用的?)
- 做的一个坦克大战小游戏
- 坦克一键换装(抽象工厂)
- 将数据运算逻辑封装成一个Manager对象(门面:Facade)
- 各种各样的碰撞,坦克碰坦克,坦克碰墙,子弹碰坦克什么的(责任链:cor)
- 从单例开始讲:
- 平时用的多的app有啥?
- 我说zhifu宝、tao宝
- OK,zhifu宝首页如果说是可定制的,提供很多按钮给用户进行自由的定制摆放,如何设计后端逻辑?
- 开始讨论
- 这个按钮是否是固定的,用户能不能自己还定义新的组件?
- 答:固定的
- 每个按钮所摆放的位置应该只有个x,y坐标,为了适配,将这些坐标以百分比的方式存储数据。
- 由于每个用户下次进来还要看到自己之前离开时候的样子,所以必须得进行持久化。
- 这个功能是一个高并发的读的情况:thinking:
- MySQL读写分离
- 做Redis缓存(反问:每个用户存一份,会不会太浪费Redis空间?)
- 其实吧,组件存储也就存一下x,y,我觉得是耗费不了多少空间的,就是key有点多。
- 可以对key进行一下分段?
- hset user:1-100 3 "{"3":{"x":30,"y":40}}"
- 可以对key进行一下分段?
- 其实吧,组件存储也就存一下x,y,我觉得是耗费不了多少空间的,就是key有点多。
- 做客户端本地缓存(多端登录怎么办?反问:多端的组件应该不适配,还得根据多端进行不同的存储?然后就没讨论多端的事情了。。。)
- 将用户按照不同地区,每天将最新的按钮位置做成文本放到Nginx上做动静分离?(这个想法太蠢了,用户是实时修改布局的,这样就不好搞了。。。)
- 整个验证码,做一下流量错峰?(嘶,胡言乱语了,其实我觉着应该读写分离做做缓存应该能够完成这个功能了,有点过度设计的感觉了。。。)
- 高并发下做接口的限流、熔断、降级
- 这个按钮是否是固定的,用户能不能自己还定义新的组件?
- 差不多了,想不出来了...
- 问我英语咋样,额。。。四级水平,然后就简单问下我自我介绍。
- 开始讨论
好吧,给这段面试画上句号啦,三面挂了,看来还需要继续努力。
全部评论
(13) 回帖