《Java视频面试实录:深入剖析大厂校招岗位挑战》

 面试时间约 40分钟

面试录播地址: 视频地址

1. 什么是负载均衡?

指的是将来自客户端的请求分配给多台服务器进行处理的技术

2. 一个浏览器的请求最终到达服务器, 在整个过程中哪些可以做负载均衡?

DNS解析 : 当用户输入网站名时, DNS服务器会将域名解析为对应的IP地址, 如果网站后台采用了负载均衡技术, 那么DNS服务器就可以将该域名解析为多个IP地址, 并按照一定策略返回其中一个IP地址给客户端, 比如返回最优的、随机的、轮询的等

当用户在浏览器中输入网站域名时,首先会向本地DNS服务器(Local DNS server)发起查询请求,以获取目标网站的IP地址。如果该本地DNS服务器缓存了目标网站的IP地址,则直接返回给用户,否则将向上级DNS服务器(Root DNS server)发起查询请求,一直沿着域名解析树向下递归查询,直到找到目标网站的IP地址并返回给用户。

在这个过程中,DNS服务器可以利用负载均衡技术来实现多台服务器之间的流量分发。比如,DNS服务器可以将目标网站的域名解析为多个IP地址(一个网站会有多台服务器),并通过一些策略(如轮询、最优IP、随机IP等)返回其中的一个IP地址给用户,从而实现对多台服务器的负载均衡。这样,在高流量访问情况下,不同的用户请求会被分配到不同的服务器上进行处理,从而避免了某一台服务器负载过重的情况,提高了整个系统的性能和可用性。

3.什么是服务器的横向扩容和纵向扩容?

横向扩容(Horizontal Scaling)指“水平扩展”,即通过增加服务器数量来扩大系统规模,实现分布式处理和负载均衡。具体来说,就是将应用程序部署到多个服务器上,同时使用负载均衡技术将请求分摊到不同的服务器上进行处理,从而提高了整个系统的并发处理能力和处理量。横向扩容通常适用于需要处理大量并发请求或有较高吞吐量要求的应用场景下。

纵向扩容(Vertical Scaling)指“垂直扩展”,即通过增加单个服务器的硬件资源(如CPU、内存、磁盘空间等)来提高系统性能和负载能力。这通常意味着替换旧的硬件设备,或者升级现有的硬件设备,以便支持更高的访问量或更复杂的计算任务。相比较横向扩容,纵向扩容的优势在于其可以通过提高单台服务器的处理能力达到一定的扩容效果,成本相对较低,但是也存在一定的限制,比如单台服务器的性能上限、单点故障等。

4.什么是单元测试和集成测试?

单元测试是指针对软件应用中最小的可测试单元进行的测试。通常情况下,这个单元是一个函数、方法或过程,它被看做是软件设计的基本模块。单元测试通过分析和检验每个模块是否满足各种输入和输出条件,以确定模块的正确性。单元测试通常由开发人员编写和运行,并使用一些测试框架和工具来辅助测试。单元测试的优点在于它可以在软件开发早期尽早发现并解决问题,减少错误传递和修复成本,提高软件的可靠性和可维护性。

集成测试是指在完成单元测试之后,将多个模块组合成一个更大的系统集成测试。集成测试的作用在于验证设计的模块彼此结合的正确性和互操作性。集成测试可以帮助开发人员找出模块之间的接口问题、数据传输问题、性能问题等,通过集成测试,开发人员可以发现和解决单独运行的模块中无法捕捉到的问题。

5.讲一下分布式和集群的概念?

分布式系统 是指在不同的计算机之间进行分工合作,通过消息传递或远程过程调用等方式,相互协作完成一个共同的目标。分布式系统通常具有高并发性、高可用性、分布式存储等特点,可以将任务分解成多个子任务,由各个计算机节点独立完成。分布式系统具有的主要优点是可扩展性强,容错性高,可以提供更好的性能和响应速度,同时也存在一些挑战,如通信开销大、数据一致性控制、故障排除等问题。

集群是指将多个计算机连接在一起,以模拟单一逻辑服务器,为用户提供服务。集群通常由多个服务器组成,通过负载均衡、故障转移等技术来提高系统的可用性和性能,简化管理和维护工作。集群的优点在于可以提高系统的可靠性和伸缩性,使得系统能够快速增加处理能力以满足不断增长的需求,同时也存在一些挑战,如数据一致性控制、分布式事务管理等问题。

总结一句 : 集群更多的是用于提高单个服务器的性能和可靠性,而分布式系统更多的是为了解决单台计算机无法胜任的大规模计算等任务.

6.关系型数据库和非关系型数据库的区别?

关系型数据库(如MySQL、Oracle)采用表格的形式存储数据,每个表格包含多行和多列,表格之间在逻辑上存在关联。这种数据结构支持 SQL 查询事务处理等复杂的操作,适合存储结构化数据。但是对于非结构化数据的存储和查询,性能则会受到一定的影响。

非关系型数据库(如MongoDB、Redis)则采用键值对、文档、等其他数据结构存储数据,其中每个文档可以包含不同数量和类型的字段。这种结构适合存储非结构化数据,如 JSON 格式的文档,而且读写速度通常比关系型数据库快很多。但是在进行复杂的查询和分析时,则可能会受到限制。

7.什么是事务?

简称ACID

  1. 原子性(Atomicity): 就是事务是不可分割的单位,要么全部执行,要么全部不执行。
  2. 一致性(Consistency): 事务开始之前和结束之后,数据库必须保持一致性状态。这意味着,在事务操作过程中,数据的约束条件、引用完整性、触发器等都得到了维护。
  3. 隔离性(Isolation): 多个事务并发执行时,彼此互相不影响,每个事务所做的修改,对于其他事务来说是不可见的。(隔离性有四个级别的)
  4. 持久性(Durability): 在数据提交成功后,其更改是永久性的,即使系统崩溃或重启,更改仍然能够保存。

8. (追问上一题的持久性) MySQL的持久化存储每次写入都会直接刷到磁盘吗

对于InnoDB存储引擎,它采用了“WAL(Write Ahead Log)”的机制来保证数据的持久化存储。当InnoDB执行写操作时,数据会先写入到redo log里,而不是直接写入磁盘。然后,在事务提交时,InnoDB会将redo log里的数据刷新到磁盘中的数据文件中,以保证数据的持久化存储。

8.(追问上一题) 那其他的log有了解过吗?

  1. 错误日志(Error Log):记录MySQL在启动、运行和关闭过程中的错误和警告信息。
  2. 查询日志(General Log):记录所有到MySQL服务器的请求,包括查询语句、连接和断开连接等信息。
  3. 慢查询日志(Slow Query Log):记录执行时间超过阈值的查询语句,以帮助识别数据库中的性能问题。
  4. 二进制日志(Binlog Log):记录所有对MySQL数据库进行更改的语句,例如INSERT、UPDATE和DELETE等操作。
  5. 撤销日志(Undo Log):记录已经执行的事务对数据库的修改操作,用于支持事务回滚。在InnoDB存储引擎中使用。
  6. 重做日志(Redo Log):记录所有已经提交但还未写入磁盘的修改操作,用于保证数据的一致性和可靠性。在InnoDB存储引擎中使用。

9. (追问上一题的Binlog) Binlog是在事务开始的时候产生的还是事务结束的时候产生的?

是在事务提交的时候产生的。也就是说,当 一个事务完成提交之后,MySQL 就会将该事务的所有修改操作记录到 Binlog 文件中。

因为 Binlog 记录的是已经成功提交的事务,所以它可以用于数据备份、主从复制等操作,确保从库上的数据与主库保持一致。同时,Binlog 还支持基于时间点的恢复,可以使用户在任意时间点回滚到之前的状态。

10.(追问上一题) 那如果binlog事务开始就产生了, 那为什么不直接用binlog去回滚而是用UndoLog呢?

因为 Binlog 是以日志形式记录数据修改的操作,它并没有真正备份数据,只是记录了修改的语句和对应的位置信息。如果要回滚事务,需要根据 Binlog 的内容重新执行相反的操作来达到回滚的效果,这样可能涉及大量的查询和计算。而 Undo log 则直接备份了事务开始时的数据,回滚时只需将数据从 Undo log 恢复即可,速度更快。

11.事务里面的原子性MySQL它是怎么去实现的呢?

Redo Log : 用于记录已提交的事务对数据的修改操作。当事务提交时,将相关的修改操作记录到事务日志中。在数据库发生故障或重启时,MySQL 可以利用事务日志中的信息来恢复已提交的事务,并将对数据的修改重新应用到数据库中,确保事务的原子性。

Undo Log : 用于记录事务开始之前各个数据项的原始值。当事务失败或被回滚时,MySQL 可以使用撤销日志中的原始值进行数据还原,将数据恢复到事务开始之前的状态,保证事务的原子性。

12.关系数据库表里面一般都会设置外键, 那么外键是做什么用的?

关联数据:通过外键,可以将两个或多个表之间的记录进行关联。这样,在查询数据时可以方便地获取相关联的数据,从而满足复杂的查询需求。

约束数据完整性:外键约束能够确保数据的完整性和一致性。它限制了插入、更新和删除操作,只允许存在有效的关联数据,避免了出现孤立无效的数据。

实现级联操作:外键还可以定义级联操作规则。当父表中的记录发生变化时(如被删除或更新),相关联的子表记录也会相应地进行操作,保持数据的一致性,并减少了手动处理关联数据的工作量。

13.(追问上一题)但是在实际的项目中, 我们很少在数据库层面去设置外键, 我们只是在这个逻辑上会有一个外键, 你觉得这是出于什么考虑的?

灵活性和性能:在某些情况下,数据库系统对于维护外键约束可能会产生额外的开销。如果应用程序已经处理了数据完整性方面的验证和处理,那么在数据库层面设置外键约束可能会影响性能,并且限制了更灵活的操作。

分布式架构和复杂性:在分布式系统或微服务架构中,数据库可能被多个服务共享并独立部署。在这种情况下,跨服务的数据一致性可能更加复杂,因此外键约束在数据库层面难以直接维护。

14.数据库的分库和分表你觉得他们解决的问题有什么不一样吗?

分库(Sharding):分库是将一个数据库中的数据划分为多个独立的数据库实例或服务器上。每个库可以独立部署在不同的物理机器或逻辑节点上,各自管理自己的数据。主要解决的问题是水平扩展(Scale-out),通过将数据分散存储在多个数据库中,提高了系统的并发处理能力和吞吐量。

分表(Partitioning):分表是将单个表拆分成多个较小的表,每个表存储部分数据。通常是根据某个列(如时间、地区等)的值进行划分,使得不同数据块可以分布到不同的物理位置。主要解决的问题是垂直分割(Vertical Partitioning),提升查询性能和减少单个表的数据量,同时优化磁盘读写操作。

15.分布式事务这个概念你是怎么理解的? 为什么会存在分布式事务?

水平扩展:为了提高系统的性能和容错能力,需要将应用程序拆分成多个部分,并将它们部署在不同的服务器上。

业务需求:某些业务场景可能需要跨多个数据库或消息队列进行操作,例如,对多个账户进行转账操作

高可用性:为了确保系统的高可用性和容错能力,需要将数据进行冗余备份并部署在多个服务器上。当一个服务器故障时,需要快速自动切换到另一个服务器上,保证业务的连续性

16.分布式事务有哪些解决方案?

两阶段提交协议(也就是Spring Cloud Alibaba中的seate) 是在事务开始前向各个节点确认一次, 在事务最后提交之前再去确认一次

17.分布式系统里面有个CAP理论, 这个理论你是怎么理解的?

一致性(Consistency)指的是分布式系统的多个节点在进行数据访问时,应该保证数据的一致性,即不同节点之间访问到的数据应该是相同的。

可用性(Availability)指的是分布式系统应该保证在任何时候都能够对外提供服务,即系统不应该因为某些节点的故障而导致整个系统不能正常工作。

分区容错性(Partition Tolerance)指的是分布式系统应该能够容忍网络分区(node failure 或 network partition),即在网络分区后,系统仍然能够继续工作。

18.(追问上一题)CAP里面的C和刚刚说的ACID里面的C有什么区别?

在 CAP 理论中,C 指的是一致性(Consistency),强调的是分布式系统在出现故障、网络分区等情况时,多节点之间的数据始终保持一致。

而在 ACID 中,C 指的是原子性(Atomicity),强调的是一个事务要么全部执行成功,要么全部回滚,即保证数据库的一致性。

19.数据库跟客户端连接它其实也有一个连接池这么一个概念, 那这个连接池我们一般会设置多大呢?

  1. 应用程序的并发访问量:如果并发访问量较高,则连接池的大小应该适当增加,以满足更多的并发请求。
  2. 数据库服务器的处理能力:如果数据库服务器的处理能力较强,则可以适当增加连接池的大小,以提高应用程序的访问效率。
  3. 数据库连接的资源消耗:每个数据库连接都会消耗一定的系统资源,如果连接池的大小设置过大,可能会导致系统资源的浪费,而设置过小则可能会限制了应用程序的性能。
  4. 长时间空闲连接的清理策略:需要定期清理连接池中长时间空闲的连接,以防止占用过多的资源。

20.(追问上一题)那如果有一个新的系统, 从0到1上线, 那这个数据库连接数配置多少, 这个你会怎么评估?

答: 我会先做一个压力测试, 看看系统指标再定

问: 直接压数据库吗

答:从客户端开始压, 因为是客户端到数据库的请求

问:那你压测的时候关注哪几个指标

答:首先是CPU的负载, 应该还需要关注系统的吞吐量, 还有就是在队列中阻塞的连接数, 最后是用户端请求的延迟

21.在数据库层面哪些操作会导致锁表呢?

  1. 数据库的DDL语句:数据库的DDL语句包括创建、删除、修改表结构等操作,执行这些操作时,通常需要对整个表进行锁定,以防止其他用户操作导致数据异常。
  2. 大批量数据的INSERT、UPDATE和DELETE操作:这些操作涉及到大量的数据处理,如果不加控制,很容易导致锁表现象。同时,还需要注意事务的隔离级别设置,避免产生不可重复读和幻读等问题。
  3. 大事务:大事务是指事务执行时间较长,期间会锁定相关的资源,造成其他用户等待或者超时。因此,需要尽量缩短事务执行时间,或者采用分布式事务等技术来缓解锁表问题。
  4. 并发更新和查询:并发更新和查询操作会导致锁表现象,需要通过合理的锁机制来管理并发操作。例如,采用行级锁或者读写分离等技术可以减少锁表现象,提高数据库的性能和可用性。

22.如果按照锁的类型来分的话, 表级别的锁有哪些?

  1. 共享锁(Shared Lock):也称为读锁,允许多个事务同时持有共享锁,并发读取数据。共享锁之间不会互斥,因此可以并发存在。
  2. 排他锁(Exclusive Lock):也称为写锁,当一个事务持有排他锁时,其他事务无法获取共享锁或排他锁,用于保证数据的独占性和一致性。同一时间只能有一个事务持有排他锁。
  3. 意向共享锁(Intent Shared Lock):作为一种辅助锁机制,用于表示事务意图在某个数据行上获取共享锁。当一个事务需要对表中的某个数据行获取共享锁时,会先尝试获取意向共享锁。
  4. 意向排他锁(Intent Exclusive Lock):作为一种辅助锁机制,用于表示事务意图在某个数据行上获取排他锁。当一个事务需要对表中的某个数据行获取排他锁时,会先尝试获取意向排它锁。

23.SQL笔试题

问题:
product (id,name)

shop (id,name)

sales_volume (id,product_id,shop_id,volume)

销量最高的三个产品?

店铺名、商品名、销量

答案:

SELECT s.name AS shop_name, p.name AS product_name, sv.volume

FROM sales_volume sv

JOIN product p ON sv.product_id = p.id

JOIN shop s ON sv.shop_id = s.id

ORDER BY sv.volume DESC

LIMIT 3;

24.算法笔试题

问题:
给定一个字符串 s ,请你找出其中不含有重复字符的 最长连续子字符串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子字符串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子字符串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:
输入: s = ""
输出: 0 
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成


答案:

class Solution {
    public int lengthOfLongestSubstring(String s) {
        // 哈希集合,记录每个字符是否出现过
        Set<Character> occ = new HashSet<Character>();
        int n = s.length();
        // 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        int rk = -1, ans = 0;
        for (int i = 0; i < n; ++i) {
            if (i != 0) {
                // 左指针向右移动一格,移除一个字符
                occ.remove(s.charAt(i - 1));
            }
            while (rk + 1 < n && !occ.contains(s.charAt(rk + 1))) {
                // 不断地移动右指针
                occ.add(s.charAt(rk + 1));
                ++rk;
            }
            // 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = Math.max(ans, rk - i + 1);
        }
        return ans;
    }
}

#面试##Java##数据库##分布式##spring#
全部评论

相关推荐

3 12 评论
分享
牛客网
牛客企业服务