字节试水一面连环50问 以为要凉凉?多靠这份“Java复习宝典

我居然回答了32个,应该是32位,8位一个byte,共计四个byte

20. 你们用过缓存吗

没有,但是用redis做了分布式锁

21. 你说说下分布式锁怎么做的?

分布式锁也是一个锁,需要满足几个特性,1 可重入 2 可以识别加锁的身份防止ABA问题 3 考虑是否需要续约 key是所需要加上的锁的业务资源唯一编码,value是当前线程的uuid,uuid存在threadLocal内 加锁的时候用的jedis,先设一个过期时间,然后用ex,若不存在key则添加新key,若已经存在则直接失败 解锁用的阿里云企业版的CAD(compareAndDelete),原子比较并解锁,本质是通过lua脚本进行的类似事务操作

22. 除了redis还有什么可以做分布式锁?

Mysql、zookeeper等

23. 如果让你用Mysql做分布式锁你怎么做

新建一张表,主键为需要锁的锁key,col1为线程uuid,col2为ttl时间 加锁的时候在一个事务中选取当前key的record,若存在则判断ttl,若不存在则直接可以插入 解锁的时候直接把record删除即可 起一个定时任务来遍历表,清楚过期键防止无限膨胀

24. zookeeper了解吗

一点点,摄入不深

25. 那我们继续聊聊Redis吧,Redis有什么数据结构?

List,Hash,Set,Zset,List

26. Zset怎么实现的?

跳表+map实现

27. 什么是跳表?

常规链表只有一个next节点,跳表持有多个指向其他链表的指针,可以跨越式的进行查找,时间复杂度是logn

28. 如果我要找一个score为A的节点应该如何去找?

首先在map中找到对应的node排名,然后根据排名在skiplist中进行查找

29. zrange是如何实现的?

这个没想到不应该,查了一下如下: ZRANGE key start stop [WITHSCORES],zrange 就是返回有序集 key 中,指定区间内的成员,而跳表中的元素最下面的一层是有序的(上面的几层就是跳表的索引),按照分数排序,我们只要找出 start 代表的元素,然后向前或者向后遍历 M 次拉出所有数据即可,而找出 start 代表的元素,其实就是在跳表中找一个元素的时间复杂度。跳表中每个节点每一层都会保存到下一个节点的跨度,在寻找过程中可以根据跨度和来求当前的排名,所以查找过程是 O(log(N) 过程,加上遍历 M 个元素,就是 O(log(N)+M),所以 redis 的 zrange 不会像 mysql 的 offset 有比较严重的性能问题。

30. Redis持久化

RDB:快照存储,可以选择是否阻塞,使用场景在数据库上下线、主备复制等情况中 AOF:类似于binlog,每个里面都是一个写事件,是优先读取的策略,支持多策略写入(强同步、按时间刷盘、交由操作系统决定刷盘等),AOF为了防止文件膨胀也支持重写

31. AOF重写的时候会不会block主线程?

不会,没有这个必要,起一个子线程重写完毕之后把手头的buffer在刷进去就行了

32. 在载入的时候是怎么做的

本地起一个client直接读取AOF重放其中的命令

33. Redis有哪些多机部署方案?

经典的主备同步,通过RDB初始化备库然后进行命令传播 Sentinel,实际上是一种容灾机制 cluster,集群部署,使用多机占用slot的方式进行集群服务提供

34. 在主备环境下,如果一个备库中途断链了,重新上线的时候怎么执行同步?

主备各自维护一个写入的Offset,对比差异之后在buffer中读出丢失的命令并进行同步

35. 如果备库的offset过于落后已经不在buffer当中了呢?

直接RDB重新同步 使用AOF来查找对应offset的语句(这个是我猜的)

36. cluster如何做的故障转移?

不知道,估计也是检测到客观下线然后paxos选主

37. Mysql了解吗,里面有哪些锁?

类型分类:共享锁(S),独占锁(X),意向锁(与表锁互斥) 粒度分类:行锁、表锁

38. 行锁怎么实现的?

不知道,这个时候已经有点崩溃了,怎么这么多不知道nnd

39. 讲一下事务隔离级别吧

RU、RC、RR、Serializable

40. 你们用的是哪个隔离级别

mysql默认的是RR,我们改成RC了

41. 在默认隔离级别下会产生幻读问题吗?

会,这是幻读是RR的经典问题之一

42. 描述一下幻读

在T1里Select * From table where id = 1;若不存在该记录则insert id = 1的记录进去,但是在select完毕之后T2事务插入了id=1的record,此时后续insert执行失败,本质上来讲是当前的快照都不支持后续dml语句的执行

43. MVCC机制了解吗?

了解,由undolog支撑的数据隔离机制,主要是为了提供更高的并发度

44. 讲一下原理

每一行record都存在两个隐藏行,一个是当前的事务id,一个是指向undolog的指针 mvcc机制运行 在rr和rc两个隔离级别下 在每次生成ReadView的时候,会将当前的活跃事务ID维护在列表当中,如果访问的Record的ID比最小活跃事务的ID还要小说明之前已经提交了,可以直接读取,如果与最大事务ID还要大就证明该事务在这个快照时没提交,需要根据undolog去找对应的历史版本,如果在最大和最小之间,那么若其为活跃事务则找历史版本,若不是则直接读取 在RC级别下,每次Select都生成新的ReadView,所以能看到不同事物间的提交 在RR级别下,只在第一次Select的时候生成ReadView,所以会产生幻读,因为快照读和真实读的结果不一致

45. 慢sql怎么处理?

捞慢sql日志先分析写的索引是不是有问题或者offset太大了,然后看expain

46. 你关注explain的那些col?

key:真实用到的索引 possible_key:可能用的索引 rows:扫描行数,越大越拉垮 filter:过滤数据比例,这个col可以验证索引有效性 extra:包含是否使用索引、sort是否时filesort等

47. https了解吗?

client发一个随机数给server server发证书+随机数回来 client拆证书找第三方验证证书有效性,取出公钥 client拿

《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》

【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享

公钥加密第三个随机数发server server私钥解密

48. 线上机器cpu100%你怎么处理?

容器化时代,一定要top看下是不是st过高,存在超卖的可能性 如果不是的话top看下哪个进程有问题,然后看这个进程哪个线程吃了cpu jstack直接把线程dump出来然后找对应有问题的线程再分析 也有可能是内存泄漏导致的频繁GC问题,可以拉GClog然后在jmap把heap dump出来看下

49. 你们线上JVM一般调整什么参数?

XMX&XMS固定防止内存抖动 堆空间调整:年轻代Age调整、年轻代eden:s0:s1比例调整 收集器调整:大促前把CMS的预清理次数调低一些,CMS的清理阈值调高一些

50. 反问

什么团队? 做什么业务的?

自我反思


虽说这次是抱着试水的心态去的,但是这一连50问着实是有点傻眼了,而且也发现了自己的很多漏洞,如下:

  • 我的简历过长,难以被面试官抓住重点

  • 项目使用技术栈没有体现出来

  • 涉及相关项目重难点表述不是很清楚,分布式锁、多租户的分库分表以及中间件隔离方案、性能问题排查等

  • 各类技术栈停其实都还留在使用层,没有深入去挖掘

  • 语速太快了,70分钟的面试大大小小回答了50个问题,我感觉放慢点够我回答两轮了

最后总结个人所得(供大家参考学习)


这次一面结束之后我反思很久,发现自己真的是有很多不足和漏洞,所以最近一直在规划自己的学习路线去不足,不论你是复习备战面试还是自己学习,我相信我所说的多少还是有点用处的—复习+学习宝典全

1.1 首先,第一个应该去梳理整个体系的知识大纲

整个体系的知识大纲5个专题:并发编程实战、性能调优实战、Spring全家桶、缓存数据库、分布式&微服务等,这边全以xmind绘画,截图展示,原件可提供 点击传送门即可!!


1.2 其次来看面试专题

我从基础-中级-高级开始一步一步逐步深入,这些面试问题一样都有分类整理(附答案解析)

全部的答案不好上传,题目有点多,完整版请点击传送门即可!!


  • 比如基础部分(列举部分提取):
  1. 什么是 Java 程序的主类?应用程序和小程序的主类有何不同?

  2. 构造器 Constructor 是否可被 override?

  3. String StringBuffer 和 StringBuilder 的区别是什么?String 为什么是不可变的?

  4. 对象的相等与指向他们的引用相等,两者有什么不同?

  5. 重载和重写的区别?

  6. 在一个静态方法内调用一个非静态成员为什么是非法的?

  7. 简述线程,程序、进程的基本概念。以及他们之间关系是什么

  8. 什么是方法的返回值?返回值在类的方法里的作用是什么?

  9. 一个类的构造方法的作用是什么 若一个类没有声明构造方法,该程序能正确执行吗 ?为什么?

  10. Java 面向对象编程三大特性: 封装 继承 多态

  11. Java 序列化中如果有些字段不想进行序列化 怎么办?

  12. 在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?

  13. 线程有哪些基本状态?

  14. 创建一个对象用什么运算符?对象实体与对象引用有何不同?

  15. 成员变量与局部变量的区别有哪些?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值