ITPub博客

首页 > 数据库 > 数据库开发技术 > 快手一面,这拷打我经不住

快手一面,这拷打我经不住

原创 数据库开发技术 作者:皇子谈技术 时间:2024-08-28 18:10:25 0 删除 编辑

火炼才能出真金,这就是在火炼吧

大家好,我是皇子。

快手的“可灵AI”这段时间玩的人越来越多了,体验也非常好。

高质量视频生成方面可灵AI能够生成长达2分钟的高清视频,能够将静态图像转化为动态视频,根据视频内容预测并生成后续场景,电影级画质,打造AIGC微短剧标杆《山海奇镜之劈波斩浪》...等等。

就是这么一家有趣的短视频社交平台公司,也让很多校招的同学都期待加入快手。

这里分享一位快手校招Java后端的同学的Java面经。


拷打了半个小时的项目和八股,问的都比较底层。

但整个过程感觉很舒适,面试官一直在引导,让这位同学有点自责的是自己真的菜,真的扛不住项目的拷打。

这里我也稍微整理一下本次面经的技术点,供大家参考。


MySQL

事务的四大特性

原子性(Atomicity)

事务被视为不可分割的最小单元,事务的所有操作要么全部提交成功,要么全部失败回滚。

回滚可以用回滚日志(Undo Log)来实现,回滚日志记录着事务所执行的修改操作,在回滚时反向执行这些修改操作即可。

一致性(Consistency)

数据库在事务执行前后都保持一致性状态。在一致性状态下,所有事务对同一个数据的读取结果都是相同的。假如 A 账户给 B 账户转 10 块钱,不管成功与否,A 和 B 的总金额是不变的。

隔离性(Isolation)

一个事务所做的修改在最终提交以前,对其它事务是不可见的。

持久性(Durability)

一旦事务提交,则其所做的修改将会永远保存到数据库中。即使系统发生崩溃,事务执行的结果也不能丢失。

如何保证ACID?

事务的隔离性

是通过数据库锁的机制实现的。

事务的原子性和一致性

由undo log来保证,undo log是逻辑日志,记录了事务的insert、update、delete操作,回滚的时候做相反的delete、update、insert操作来恢复数据。

事务的持久性

由redo log来保证:redolog被称作重做日志,是物理日志。事务提交的时候,必须先将事务的所有日志写入redo log持久化,最后事务的提交操作才算完成。

列举锁的分类有哪些

如果按锁粒度划分,有以下3种:

  • 表锁:开销小,加锁快;锁定力度大,发生锁冲突概率高,并发度最低;不会出现死锁。

  • 行锁:开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。

  • 页锁:开销和加锁速度介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

哪些情况下会发生锁升级

MySQL 中的锁升级是指从较低级别的锁(如行锁)升级到较高级别的锁(如表锁),通常是为了避免锁之间的冲突和提升并发性能。

不过MySQL 的 InnoDB 存储引擎默认情况下并不会直接进行锁升级操作,而是采用了其他机制来处理锁的竞争问题。


在此之前,我们先认识下在 MySQL InnoDB 中,锁的类型主要包括:

  1. 共享锁(S Lock):允许多个事务读取同一数据项。
  2. 排他锁(X Lock):只允许一个事务更新同一数据项。

InnoDB 使用的锁定策略包括:

  1. 记录锁:锁定单个记录。
  2. 间隙锁:锁定一个索引范围而不是单个记录。
  3. 意向锁:用于表示事务对更高层次锁的需求,但不是真正的锁升级。

现在我们可以知道的了在 InnoDB 中,通常不会出现显式的锁升级,但如果事务需要获取大量行锁,而这些行锁的总数接近表的大小时;或者无法通过索引触发记录锁或者间隙锁时,整个表可能会被隐式地锁定,从而达到类似的锁升级效果。


Java

说一说jvm分代回收

JVM 分代回收是Java虚拟机(JVM)垃圾收集器管理内存的一种策略。

这个策略的基本思想是根据对象存活的时间不同,在不同的区域分配内存空间,以便更高效地进行垃圾回收。它解决了标记整理不适用于老年代的问题,将内存分为各个年代。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),在堆区之外还有一个代就是永久代(Permanet Generation)。

  • 年轻代 (Young Generation):新创建的对象一般放在年轻代,这部分内存区域能够快速回收不再使用的对象。
  • 老年代 (Old Generation):经过多次年轻代回收后仍然存活的对象会被移动到老年代,这部分内存区域的对象生命周期较长。
  • 永久代 (Permanent Generation):存放类定义、常量池等数据,JDK 8 之后被 Metaspace 替换。

在不同年代使用不同的算法,从而使用最合适的算法,新生代存活率低,可以使用复制算法。而老年代对象存活率搞,没有额外空间对它进行分配担保,所以只能使用标记清除或者标记整理算法。的4种垃圾回收算法、垃圾回收机制与总结[通俗易懂]


内存区域

  1. Eden Space:年轻代的一部分,新创建的对象首先放在这里。
  2. Survivor Spaces (S0 和 S1):年轻代的另外两部分,用于保存每次垃圾回收后仍然存活的对象。
  3. Tenured Generation (Old Generation):存放长时间存活的对象。

回收过程

  1. Minor GC (年轻代回收):
  • 当Eden区满时触发。
  • 主要回收Eden区的对象,同时可能还会回收一部分Survivor区的对象。
  • 经过几次回收后仍然存活的对象会被移动到另一个Survivor区或者直接晋升到老年代。
  1. Major GC / Full GC (老年代回收):
  • 当老年代空间不足时触发。
  • 这种回收不仅涉及老年代,也可能包括年轻代,因此耗时较长。
  • 通常在系统运行过程中尽量避免触发Full GC,因为它会导致应用程序暂停,影响性能。

以上,点亮【赞与在看】让我们心中充满力量、披荆斩棘、不惧未来!

【推荐阅读】

大学生就业青睐的城市排行出炉,竟然没有这座城市!

美团二面,我是没想到还是AI

美团面试的新方式,涨见识了

《黑神话:悟空》是用什么编程语言开发的?


关于作者:一位热爱技术,并在职场与自媒体间探索的实践者,希望通过分享个人经验和见解,帮助更多人实现自我成长和价值。

如果您对我的公众号内容感兴趣,欢迎关注我。

也可以在下方添加我微信和一支烟花AI社区技术群,一起交流技术、职场心得。

原文作者:皇子谈技术;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2023-12-21

  • 博文量
    113
  • 访问量
    56509