一、JVM相关
1.1 请介绍类加载过程,什么是双亲委派?
答:关于这个问题呢,需要从几个方面来回答。简单说一下类的加载这个一个机制。就是我们自己写的Java文件到最终运行,它必须要经过编译和类加载这两个阶段。而编译的过程,就是把.java文件编译成.class文件。而类的加载过程就是把.class文件加载在JVM内存里面,装载完成以后会得到一个Class对象。我们就可以使用new关键字来实例化这个对象。

而类的加载过程需要涉及到类加载器,JVM在运行的时候会产生三个类加载器。这三个类加载器组成了一个层级关系。每一个类加载器分别去加载不同作用范围的jar包。比如像Bootstrap Classloader,它主要是负责Java核心类库的加载。也就是%{JRE_HOME}\lib下面的一个rt.jar和resources.jar等等。 Extension ClassLoader主要是负责%{JRE_HOME}\lib\ext目录下的一个jar包和class文件。Application ClassLoader主要是负责当前应用里面classpath下面的所有的jar包和类文件。除了系统自己提供的类加载器以外。还可以通过Classloader类来实现自定义加载器,去满足一些特殊的场景需求。

而所谓的父委托模型。就是按照类加载器的层级关系,逐层进行委派。比如说当我们进行加载一个class文件的时候,首先会把这个class文件的查询和加载委派给父加载器去执行。如果父加载器都无法加载这样一个class, 那么再尝试自己来加载这样一个class。

这样设计的好处,主要有两个:
-
安全性:因为这种层级关系实际上代表的是一种优先级,也就是说所有的类加载优先要给到Bootstrap ClassLoader. 那么对于核心类库的一些类,就没有办法被破坏,比如说自己写一个java.lang.String。最终还是会交给启动类加载器。再加上每个类加载本身的这个作用范围,那么自己写的java.lang.String就没有办法去覆盖类库中的类。
-
这种层级设计的关系,可以避免重复加载,导致程序混乱的一些问题,因为如果父加载器已经加载过了,那么子加载器就没有必要去加载了。
二、数据库相关
2.1 什么是聚集索引和非聚集索引
聚集索引就是基于主键创建的索引。除了主键索引以外的其他索引,统一称为非聚集索引,也叫二级索引。因为在InnoDB的引擎里面。一张表的数据对应的物理文件本身就是按照B+树来组织的。而聚集索引呢,就是按照每张表的主键来构建这样一个B+树。然后叶子节点里面,存储了这个表里面的每一行数据记录,所以基于InnoDB这样一个特征,聚集索引并不仅仅是一种索引类型。还代表了一种数据的存储方式。同时也意味着,每个表里面必须要有一个主键。如果没有主键,InnoDB会默认选择,或者添加一个隐藏列,作为主键索引来存储这个表的数据行。一般情况下建议使用自增的id作为主键。这样的话id本身是具有连续性的。使得对应的数据也会按照顺序存储在磁盘上,写入性能和检索性能都很高,否则使用随机ID的话,在插入磁盘的时候会导致随机磁盘IO。从而会导致性能下降。不过需要主要的是,InnoDB只能存在一个聚集索引,因为如果存在多个聚集索引,那么这个表里面会存在多个副本。不仅会造成磁盘空间浪费,还会去导致数据的维护困难。因为在InnoDB里面,它是存储了一个表的完整数据。所以,如果是基于非聚集索引来查询一条数据的时候,那么最终还是需要访问主键索引来进行检索。

三、redis相关
3.1 什么是Redis?它的特点是什么?
Redis(Remote Dictionary Server)是一个开源的基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。其主要特点包括:
-
基于内存: Redis数据存储在内存中,因此访问速度非常快,能够提供高性能的数据读写操作。
-
支持多种数据结构: Redis支持丰富的数据类型,如字符串、列表、哈希、集合、有序集合等,使其具备了灵活存储和操作不同类型数据的能力。
-
持久化支持: 支持多种持久化方式,可以将内存中的数据持久化到磁盘,确保数据不会因进程重启而丢失。
-
高级特性: 支持事务、发布/订阅、脚本执行、管道(Pipeline)等高级功能,使其在不同场景下有着广泛的应用。
-
分布式: Redis支持多种方式的数据复制和分片(sharding),能够构建高可用性和高可扩展性的分布式系统。
-
简单和快速: Redis采用单线程模型,使得它的实现相对简单,同时在大多数情况下能够保持非常高的性能。
-
丰富的功能和生态系统: Redis具有强大的功能集合,而且有一个活跃的社区,支持许多客户端库和工具,使其易于集成和使用。
总的来说,Redis因其高性能、灵活的数据结构、丰富的功能和简单易用而受到广泛欢迎,被用于许多场景,如缓存、会话存储、实时分析、排行榜等。