首页 > 阿里Lazada实习三面凉经
头像
waigo
编辑于 2021-08-26 16:01
+ 关注

阿里Lazada实习三面凉经

在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
  • Redis一般用来做什么?
    • string
      • 用来做分布式锁
    • hash
      • 用来做商城的购物车
    • list
      • 举例可以做微信订阅号的订阅专栏
    • 做缓存,将访问的热点数据进行缓存
    • 结合SpringSession完成分布式下会话统一存储
  • 为什么用分布式锁?
    • 我说是需要降低数据库压力,在需要查库的时候锁住其它线程,使得就一个线程去查库,在集群下单机锁无法保证只有一个线程查库
  • 讲一下常见的垃圾收集器
  • 讲一下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:
    • 什么时候用非聚簇索引,什么时候使用聚簇索引?
      • 这个还真不知道,我就直接开始说索引的数据结构了,又是一套数据结构的选择(hash、B树到B+树),balabala...
      • 最后直接说如果记录很大,一个节点存不了几个就用非聚簇索引。其实我挺迷惑的,因为一级索引聚簇不聚簇不是存储引擎已经决定了吗?
  • 问Redis
    • 如果让你实现list,你怎么做?
      • 分析了一下链表,说指针一个得8字节,可能内容比起这些指针都要小,所以使用数组实现。(好像答非所问)
    • 如果让你实现zset,你怎么做?
      • 讲了一下跳表的算法增删改查咋做。
    • 这两题真是不懂咋说。。。
  • 公平锁和非公平锁?
  • 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}}"
              • image-20210818210817963
        • 做客户端本地缓存(多端登录怎么办?反问:多端的组件应该不适配,还得根据多端进行不同的存储?然后就没讨论多端的事情了。。。)
        • 将用户按照不同地区,每天将最新的按钮位置做成文本放到Nginx上做动静分离?(这个想法太蠢了,用户是实时修改布局的,这样就不好搞了。。。)
        • 整个验证码,做一下流量错峰?(嘶,胡言乱语了,其实我觉着应该读写分离做做缓存应该能够完成这个功能了,有点过度设计的感觉了。。。)
        • 高并发下做接口的限流、熔断、降级
    • 差不多了,想不出来了...
    • 问我英语咋样,额。。。四级水平,然后就简单问下我自我介绍。

好吧,给这段面试画上句号啦,三面挂了,看来还需要继续努力。

更多模拟面试

全部评论

(13) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

近期精华帖

热门推荐