java+分布式面试题总结

文章涵盖了Java基础、JVM、Spring框架、MyBatis、MySQL数据库、Redis缓存和Linux系统等多个方面的面试常见问题,包括了对象调用方式、内存区域、线程、数据类型、流、集合、数据库事务、索引等概念,以及Spring的IOC和AOP、MyBatis的缓存机制、Redis的持久化和锁等技术要点。
摘要由CSDN通过智能技术生成

java基础题

一、java按值调用还是引用调用

答:按值调用指方法接收调用者提供的值,按引用调用指方法接收调用者提供的变量地址。Java 总是按值调用,方法得到的是所有参数值的副本,传递对象时实际上方法接收的是对象引用的副本。

二、浅拷贝和深拷贝的区别

答:

浅拷贝: 只复制当前对象的基本数据类型及引用变量,没有复制引用变量指向的实际对象。修改克隆对象可能影响原对象,不安全。

深拷贝: 完全拷贝基本数据类型和引用数据类型,安全。

三、什么是反射?

答:在运行状态中,对于任意一个类都能知道它的所有属性和方法,对于任意一个对象都能调用它的任意方法和属性,这种动态获取信息及调用对象方法的功能称为反射。缺点是破坏了封装性以及泛型约束。反射是框架的核心,Spring 大量使用反射。

四、什么是泛型?有什么作用?

答:泛型本质是参数化类型,解决不确定对象具体类型的问题。泛型在定义处只具备执行 Object 方法的能力。

泛型的好处:① 类型安全。② 提升可读性。③ 代码重用,合并了同类型的处理代码。

五、自动装箱和拆箱是什么?

答:

自动装箱: 将基本数据类型包装为一个包装类对象,例如向一个泛型为 Integer 的集合添加 int 元素。

自动拆箱: 将一个包装类对象转换为一个基本数据类型,例如将一个包装类对象赋值给一个基本数据类型的变量。

六、Object 类有哪些方法?

答:equals、hashCode、toString、clone、finalize、getClass、wait / notify / notifyAll

七、为什么要同时重写equals方法和hashCode方法?

答:

如果两个对象通过equals方法比较相等,则他们nashCode的返回值一定要相等。但如果两个对象的nashCode值相等,他们通过equals方法比较的返回值则不一定相等。

如果两个对象hashCodel的返回值相等,不能判断两个对象是相等的。但如果两个对象的nashCode的返回值不相等,则可以判定两个对象一定不相等。

集合

一、Array和List的区别?

答:Array:是基于索引的数据结构,他在使用索引在数组中搜索和读取数据快,

List:是一个有序集合,可以包含重复的元素,提供了按索引访问的方式,他继承了Collection,有两 个实现类ArrayList和LinkedList

二、ArrayList和LinkedList的区别?

答:1、ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。

2、对于随机访问,ArrayList优于LinkedList

3、对于插入和删除操作,LinkedList优于ArrayList

4、LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

三、HashMap和HashTable的区别

答:都属于Map接口的类,HashMap没有分类和排序,它允许一个null值和多个null值,

HashTable类似于HashMap,但不允许null键值和null值,HashTable是同步的。

四、 Collection和Collections的区别?

答: Collection是Java集合框架中的一个接口,它定义了一组对象的集合。而Collections是一个包含了各种静态方法的工具类,提供了对集合的一些常用操作。

IO流

一、java.io 包下有哪些流?

答: java.io包提供了常用的多种流,主要分为字节流和字符流两大类。其中,每类又分为输入流和输出流。

二、复制用的是什么流?

答: 复制文件可以使用字节流来完成。常见的使用字节流复制文件的方式有以下两种实现方式:

1. 使用 FileInputStream(文件字节输入流 )和 FileOutputStream( 文件字节输出流)

public static void copyFile(String source, String target) throws IOException {
    FileInputStream in = new FileInputStream(source);
    FileOutputStream out = new FileOutputStream(target);
    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = in.read(buffer)) != -1) {
        out.write(buffer, 0, bytesRead);
    }
    in.close();
    out.close();
}

2. 使用 BufferedInputStream( 缓存字节输入流 ) 和 BufferedOutputStream( 缓存字节输入流 )

public static void copyFile(String source, String target) throws IOException {
    FileInputStream fis = new FileInputStream(source);
    BufferedInputStream bis = new BufferedInputStream(fis);
    FileOutputStream fos = new FileOutputStream(target);
    BufferedOutputStream bos = new BufferedOutputStream(fos);
    byte[] buffer = new byte[4096];
    int bytesRead;
    while ((bytesRead = bis.read(buffer)) != -1) {
        bos.write(buffer, 0, bytesRead);
    }
    bis.close();
    bos.close();
}

以上两种方式都是使用字节流来复制文件,其原理是从源文件中读取数据并写入目标文件中。使用缓存(Buffered)流可以提高IO操作效率。

三、序列化和反序列化是什么?

答:Java 对象 JVM 退出时会全部销毁,如果需要将对象及状态持久化,就要通过序列化实现,将内存中的对象保存在二进制流中,需要时再将二进制流反序列化为对象。对象序列化保存的是对象的状态,因此属于类属性的静态变量不会被序列化。

四、什么是 BIO?

答:BIO 是同步阻塞式 IO

五、什么是AIO?

答:AIO 是 JDK7 引入的异步非阻塞 IO。

六、什么是NIO?

答:NIO 是 JDK1.4 引入的同步非阻塞 IO。

线程

一、进程和线程的区别?

答:进程是系统分配资源和调度的基本单位,也就是说进程可以单独运行一段程序。

线程是cpu调度和分派的最小基本单位。

二、创建线程的几种方式?

答:

  • 继承 Thread 重写 run 方法;
  • 实现 Runnable 接口;
  • 实现 Callable 接口。

runnable 没有返回值,callable 可以拿到有返回值

三、线程的生命周期?

答:

在线程的生命周期中,它要经过新建(New)、就绪(Runnable) 、运行(Running)、阻塞(Blocked)和死亡(Dead)5种状态

1) 新建状态(New):

当线程对象对创建后,即进入了新建状态,如: Thread t = new MyThread();

2)就绪状态(Runnable):

当调用线程对象的start()方法(t.start();),线程即进入就绪状态。处于就绪状态的线程,只是说明此线程已经做好了准备,随时等待CPU调度执行,并不是说执行了t.start()此线程立即就会执行

3)运行状态(Running):

当CPU开始调度处于就绪状态的线程时,此时线程才得以真正执行,即进入到运行状态。注:就绪状态是进入到运行状态的唯一入口,也就是说,线程要想进入运行状态执行,首先必须处于就绪状态中

4)阻塞状态(Blocked):

处于运行状态中的线程由于某种原因,暂时放弃对CPU的使用权,停止执行,此时进入阻塞状态,直到其进入到就绪状态,才 有机会再次被CPU调用以进入到运行状态

5)死亡状态(Dead):

线程在run()方法执行结束后进入死亡状态。此外,如果线程执行了interrupt()或stop()方法,那么它也会以异常退出的方式进入死亡状态。

JVM面试题

一、什么是JVM?

答:jvm是java虚拟机,是java运行时环境,他是虚构出来的计算机。能够解释 Java 字节码(.class 文件格式),并将其转化为特定平台上的本地指令执行。JVM 使得 Java 程序具有“一次编写、随处运行”的特性。

二、 JVM 运行时数据区域有哪些?

答: JVM 运行时数据区域分为:程序计数器、Java 虚拟机栈、本地方法栈、堆和方法区。其中,前三个都是线程私有的,堆和方法区则是线程共享的。

三、 JVM 堆的特点和作用是什么?

答: 堆是 JVM 运行时数据区域中最大的一块内存空间,由不连续的内存块组成。堆被所有线程共享,用于存放对象实例。Java 堆也是 GC(垃圾回收)执行回收的主要区域,因此具有很重要的作用。

四、 什么是方法区?它有哪些特点?

答: 方法区也是 JVM 运行时数据区域的一部分,用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

五、 什么是类加载器?

答: 类加载器(Class Loader)是 JVM 的一个组件,用于加载 Java 类文件。JVM 中包含三个系统默认的类加载器:启动类加载器、扩展类加载器和应用程序类加载器,它们负责从不同的地方加载类文件。

六、 什么是双亲委派模型?

答: 双亲委派模型是类加载器的一种工作机制。它通过委派机制来保证类的加载安全性,并避免重复加载。当一个类加载器需要加载某个类时,它会先把这个任务委派给父类加载器,如果父类加载器无法完成该任务,则由当前类加载器自己完成。这样就能避免出现同一个类被不同类加载器重复加载的情况,从而保证类的唯一性。

框架面试题

Spring Ioc和AOP
一、IOC是什么?
答:IoC 即控制反转,简单来说就是把原来代码里需要实现的对象创建、依赖反转给容器来帮忙实现。
二、依赖注入的实现方法有哪些?
答:构造方法注入,setter 方法注入,接口注入
三、AOP 是什么?
答:AOP 即面向切面编程,简单地说就是将代码中重复的部分抽取出来,在需要执行的时候使用动态代理技术,在不修改源码的基础上对方法进行增强。
四、AOP 的相关注解有哪些?
答:
(一)@Aspect:声明被注解的类是一个切面 Bean。
(二)@Before:前置通知
(三)@After:后置通知
(四)@AfterReturning:返回后通知,
(五)@AfterThrowing:异常通知
SpringMVC
一、Spring MVC 的处理流程?
答:客户端发送请求,所有的请求会转发给 DispatcherServlet 前端处理器处理,DispatcherServlet 会请求 HandlerMapping 找出容器中被 @Controler 注解修饰的 Bean 以及被 @RequestMapping 修饰的方法和类,生成 Handler 和 HandlerInterceptor 并以一个 HandlerExcutionChain 处理器执行链的形式返回。
之后 DispatcherServlet 使用 Handler 找到对应的 HandlerAdapter,通过 HandlerAdapter 调用 Handler 的方法,将请求参数绑定到方法的形参上,执行方法处理请求并得到 ModelAndView。
最后 DispatcherServlet 根据使用 ViewResolver 试图解析器对得到的 ModelAndView 逻辑视图进行解析得到 View 物理视图,然后对视图渲染,将数据填充到视图中并返回给客户端。
二、Spring MVC 有哪些组件?
答:
○DispatcherServlet:SpringMVC 中的前端控制器,是整个流程控制的核心,负责接收请求并转发给对应的处理组件。
○Handler:处理器,完成具体业务逻辑,相当于 Servlet 或 Action。
○HandlerMapping:完成 URL 到 Controller 映射,DispatcherServlet 通过 HandlerMapping 将不同请求映射到不同 Handler。
○HandlerInterceptor:处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口。
○HandlerExecutionChain:处理器执行链,包括两部分内容:Handler 和 HandlerInterceptor。
○HandlerAdapter:处理器适配器,Handler执行业务方法前需要进行一系列操作,包括表单数据验证、数据类型转换、将表单数据封装到JavaBean等,这些操作都由 HandlerAdapter 完成。DispatcherServlet 通过 HandlerAdapter 来执行不同的 Handler。
○ModelAndView:装载模型数据和视图信息,作为 Handler 处理结果返回给 DispatcherServlet。
○ViewResolver:视图解析器,DispatcherServlet 通过它将逻辑视图解析为物理视图,最终将渲染的结果响应给客户端。
三、Spring MVC 的相关注解?
答:
○@Controller:在类定义处添加,将类交给IoC容器管理。
○@RequtestMapping:将URL请求和业务方法映射起来,在类和方法定义上都可以添加该注解。
○@RequestParam:如果 Controller 方法的形参和 URL 参数名一致可以不添加注解,如果不一致可以使用该注解绑定。
○@PathVariable:Spring MVC 支持 RESTful 风格 URL,通过 @PathVariable 完成请求参数与形参的绑定。
四、 Spring MVC 中的多个 Controller 如何共享数据?
答: 可以使用 ModelMap 来在多个 Controller 之间进行数据传递。ModelMap 是一个 Map 类型的对象,用于保存视图要显示的数据模型。多个 Controller 可以通过向 ModelMap 中添加键值对来共享数据。
Mybatis面试题
一、Mybatis 的优缺点?
答:优点:
●相比 JDBC 减少了大量代码量,减少冗余代码。
●使用灵活,SQL 语句写在 XML 里,从程序代码中彻底分离,降低了耦合度,便于管理。
●提供 XML 标签,支持编写动态 SQL 语句。
●提供映射标签,支持对象与数据库的 ORM 字段映射关系。
缺点:
●SQL 语句编写工作量较大,尤其是字段和关联表多时。
●SQL 语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
二、Mybatis 的 XML 文件有哪些标签属性?
答:select、insert、update、delete 标签分别对应查询、添加、更新、删除操作。
三、Mybatis 的一级缓存是什么?
答:一级缓存是 SqlSession 级别,默认开启且不能关闭。一级缓存的作用域是 SqlSession 范围的,在同一个 SqlSession 中执行两次相同的 SQL 语句时,第一次执行完毕会将结果保存在缓存中,第二次查询直接从缓存中获取。
四、Mybatis 的二级缓存是什么?
答:二级缓存是Mapper 级别,默认关闭。使用二级缓存时多个 SqlSession 使用同一个 Mapper 的 SQL 语句操作数据库,得到的数据会存在二级缓存区,同样使用 HashMap 进行数据存储,相比于一级缓存,二级缓存范围更大,多个 SqlSession 可以共用二级缓存,作用域是 Mapper 的同一个 namespace,不同 SqlSession 两次执行相同的 namespace 下的 SQL 语句,参数也相等,则第一次执行成功后会将数据保存在二级缓存中,第二次可直接从二级缓存中取出数据。
五、Mybatis #{} 和 ${} 的区别?
答:使用 ${} 相当于使用字符串拼接,存在 SQL 注入的风险。
使用 #{} 相当于使用占位符,可以防止 SQL 注入,不支持使用占位符的地方就只能使用 ${} ,典型情况就是动态参数。
六、什么是数据持久化
答:持久化就是将程序的数据在持久状态和瞬时状态转换的过程
七、为什么用Mybatis连接池
答:Mybatis连接池是Mybatis框架中的一个重要组件,它可以帮助我们更好的管理数据库连接,提高应用程序的性能和可伸缩性。减少数据库连接的创建和销毁次数,提高应用程序的性能。避免数据库连接泄漏,连接池会自动回收长时间未使用的连接。提高应用程序的可伸缩性,可以动态地调整连接池大小以适应不同的负载。
八、单例模式的特点是什么?
答:单例模式属于创建型模式,一个单例类在任何情况下都只存在一个实例,构造方法必须是私有的、由自己创建一个静态变量存储实例,对外提供一个静态公有方法获取实例。
九、Spring的生命周期?
答:spring启动时,先加载beanFactory,创建工厂类,然后创建bean,bean的生命周期主要为:实例化,属性填充,初始化,使用,销毁。

MySQL

一、MySql, Oracle,Sql Service的区别

答:

  • Sql Service只能在Windows上使用,而MySql和Oracle可以在其他系统上使用,而且可以支持数据库不同系统之间的移植
  • MySql开源免费的,Sql Service和Oracle要钱。
  • 我从小到大排序哈,MySql很小,Sql Service居中,Oracle最大
  • Oracle支持大并发量,大访问量,Sql Service还行,而MySql的话压力没这么大,因此现在的MySql的话最好是要使用集群或者缓存来搭配使用
  • 做分页的话,MySql使用Limit,Sql Service使用top,Oracle使用row
  • Oracle没有自动增长类型,Mysql和Sql Service一般使用自动增长类型

二、数据库经常使用的函数

答:

  • count(*/column):返回行数
  • sum(column): 返回指定列中唯一值的和
  • max(column):返回指定列或表达式中的数值最大值
  • min(column):返回指定列或表达式中的数值最小值
  • avg(column):返回指定列或表达式中的数值平均值
  • date(Expression): 返回指定表达式代表的日期值

三、MySQL存储引擎MyISAM与InnoDB区别

比较

MyISAM

Innodb

存储结构

每张表被存放在三个文件:frm-表格定义、MYD(MYData)-数据文件、MYI(MYIndex)-索引文件

所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB

存储空间

MyISAM可被压缩,存储空间较小

InnoDB的表需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引

可移植性、备份及恢复

由于MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作

免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了

文件格式

数据和索引是分别存储的,数据.MYD,索引.MYI

数据和索引是集中存储的,.ibd

记录存储顺序

按记录插入顺序保存

按主键大小有序插入

外键

不支持

支持

事务

不支持

支持

锁支持(锁是避免资源争用的一个机制,MySQL锁对用户几乎是透明的)

表级锁定

行级锁定、表级锁定,锁定力度小并发能力高

SELECT

MyISAM更优

--

INSERT、UPDATE、DELETE

--

InnoDB更优

select count(*)

myisam更快,因为myisam内部维护了一个计数器,可以直接调取。

索引的实现方式

B+树索引,myisam 是堆表

B+树索引,Innodb 是索引组织表

哈希索引

不支持

支持

全文索引

支持

不支持

四、MyISAM索引与InnoDB索引的区别?

答:

  • InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
  • InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
  • MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
  • InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。

五、什么是索引?

答:

  • 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
  • 索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
  • 更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。

六、索引有哪些优缺点?

答:

索引的优点

  • 可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
  • 通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

索引的缺点

  • 时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
  • 空间方面:索引需要占物理空间。

七、索引有哪几种类型?

答:

主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。

唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。

  • 可以通过 ALTER TABLE table_name ADD UNIQUE (column); 创建唯一索引
  • 可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2); 创建唯一组合索引

普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。

  • 可以通过ALTER TABLE table_name ADD INDEX index_name (column);创建普通索引
  • 可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);创建组合索引

全文索引: 是目前搜索引擎使用的一种关键技术。

  • 可以通过ALTER TABLE table_name ADD FULLTEXT (column);创建全文索引

八、什么是数据库事务?

答:

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。

九、事物的四大特性(ACID)介绍一下?

答:

  • 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
  • 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
  • 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
  • 持久性: 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

十、什么是脏读?幻读?不可重复读?

答:

  • 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。
  • 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。
  • 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

十一、InnoDB存储引擎

答:

InnoDB: InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎。

MyISAM: MyISAM拥有较高的插入、查询速度,但没有事务。

MEMORY: MEMORY存储引擎将表中的数据

Redis面试题

一、什么是Redis?
答:Redis 是一个非关系缓存数据库。它支持存储的类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
二、使用redis有哪些好处?
答:
● 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都很低
●支持丰富数据类型,支持string,list,set,sorted set,hash
●支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
●丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
三、为什么要用 Redis / 为什么要用缓存
答:
●高性能:
假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!
●高并发:
直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。
四、Redis 的持久化机制是什么?各自的优缺点?
答:
●Redis 提供两种持久化机制
○RDB(快照):RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中
○AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
五、Redis持久化数据和缓存怎么做扩容?
答:
●如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。
●如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。
六、redis事务的三个阶段
答:
○事务开始 MULTI
○命令入队
○事务执行 EXEC
七、什么是redis穿透?
答:就是用户请求透过redis去请求mysql服务器,导致mysql压力过载
解决方法:
●从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点。
●接口层增加校验,
●采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力
八、什么是redis雪崩?
答:
●就是redis服务由于负载过大而宕机,导致mysql的负载过大也宕机,最终整个系统瘫痪
●解决方法:
○redis集群,将原来一个人干的工作,分发给多个人干
○缓存预热
○数据不要设置相同的生存时间,不然过期时,redis压力会大
九、 什么是 Redis 锁?
答: Redis 锁指的是利用 Redis 的特性来实现分布式锁。由于 Redis 本身是单线程的,且支持原子操作,因此可以通过 Redis 来实现对共享资源的加锁和解锁操作。
十、 Redis 锁有哪些实现方式?
答:
●基于 SETNX 的实现方式
●基于 Redlock 算法的实现方式
●基于 Lua 脚本的实现方式
十一、Redis存不存在线程安全问题?
答:Redis采用了线程封闭的方式,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁
十二、Redis是单进程还是单线程?
答:
Redis 6(以前) 是单进程单线程的,redis 利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销 。
Redis 6 (以后)是单进程多线程的,NIO模型 ==> 主要的性能提升点。

Linux面试题

一、什么是 Linux 内核?
●Linux 系统的核心是内核。内核控制着计算机系统上的所有硬件和软件,在必要时分配硬件,并根据需要执行软件。
a系统内存管理
b应用程序管理
c硬件设备管理
d文件系统管理
二、什么是硬链接和软链接?
●硬链接:由于 Linux 下的文件是通过索引节点(inode)来识别文件,硬链接可以认为是一个指针,指向文件索引节点的指针,系统并不为它重新分配 inode 。每添加一个一个硬链接,文件的链接数就加 1 。
不足:
a不可以在不同文件系统的文件间建立链接;
b只有超级用户才可以为目录创建硬链接。
●软链接:软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。
不足:
因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移;还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。
三、Shell 脚本是什么?
●一个 Shell 脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell 脚本)来完成这些日常工作任务。
四、Linux 性能调优都有哪几种方法?
1、Disabling daemons (关闭 daemons)。
2、Shutting down the GUI (关闭 GUI)。
3、Changing kernel parameters (改变内核参数)。
4、Kernel parameters (内核参数)。
5、Tuning the processor subsystem (处理器子系统调优)。
6、Tuning the memory subsystem (内存子系统调优)。
7、Tuning the file system (文件系统子系统调优)。
8、Tuning the network subsystem(网络子系统调优)。
五、Linux常用命令:
●cd :切换目录
●pwd:显示绝对路径
●ls:查看当前目录下所有文件夹
●ll:查看当前目录下所有文件详细信息和文件夹
●touch:创建文件夹
●mkdir:创建目录
●cat:查看文件命令
●more:分页查看文件命令(多)
●less:分页查看文件命令(少)
●tail:查看文件命令(最后几行)
●cp:复制
●mv:移动
●rm:删除
●find:查找指定文件夹或目录
●vim:文本编辑器
●grep:正则表达式,用于字符串的搜索工作(模糊查询)
●yum install -y lrzsz:实现win到Linux文件互相简单上传文件
●tar:压缩
●ps:进程状态
●clear:清屏命令
●ifconfig:查看IP地址和本机详细信息
●ping:用于检测与目标的连通性
●free:显示系统内存

SpringCloud面试题

一SpringBoot和SpringCloud的区别
答:
●SpringBoot专注于快速方便的开发单个个体微服务。
●SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来,
●为各个微服务之间提供,配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等集成服务
●SpringBoot可以离开SpringCloud独立使用开发项目, 但是SpringCloud离不开SpringBoot ,属于依赖的关系
●SpringBoot专注于快速、方便的开发单个微服务个体,SpringCloud关注全局的服务治理框架。
二、SpringCloud由什么组成?
答:
●Spring Cloud Nacos:服务注册与发现
●Spring Cloud Gateway:服务网关
●Spring Cloud Nginx:客户端负载均衡
●Spring Cloud Feign:声明性的Web服务客户端
●Spring Cloud Hystrix:断路器
●Spring Cloud Config:分布式统一配置管理
三、什么是Nacos?
答:Nacos是阿里巴巴推出来的一个新开源的项目,是一个更易于构建动态服务发现,配置管理和服务管理平台,可以帮助快速实现动态服务发现,服务配置服务元素及流量管理。
Nacos相对于Eureka来说,更加强大,可以与Spring,SpringBoot,SpringCloud集成,并能代替Eureka和Config。
四、为什么要将服务注册到Nacos
答:微服务里有很多服务,为了更好的管理和查找服务,将服务注册到Nacos中,简单易用,稳定可靠,性能卓越。
五、什么是配置中心?
答:存储项目中配置信息的一个服务
六、为什么使用配置中心?
答:集中管理配置 信息,动态发布配置信息
七、sentinel有哪些限流模式?
答:直连模式,关联模式,链路模式
八、sentinel限流效果是?
答:快速失败,预热,排队
九、什么是Gateway网关?
答:网关是服务访问流量的一个入口,类似于生活中的网关
十、为什么使用网关?
答:服务安全,同意服务入口管理,负载均衡,限流,认证
十一、网关层面是如何实现负载均衡的?
答:通过服务名查找具体的服务实例
十二、什么是Docker?
答:
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似iPhone的app),更重要的是容器性能开销极低。
十三、Docker的三大核心是什么?
答:
○镜像:Docker的镜像是创建容器的基础,类似虚拟机的快照,可以理解为一个面向Docker容器引擎的只读模板。
○容器:Docker的容器是从镜像创建的运行实例,它可以被启动、停止和删除。可以把容器看做是一个简易版的linux环境和运行在其中的应用程序。
○仓库:仓库注册服务器上往往存放着多个仓库,每个仓库中包含了多个镜像,每个镜像有不同标签(tag)。
十四、什么是rabbitMQ?
答:釆用AMQP高级消息队列协议的一种消息队列技术撮大的特点就是消费并不需要 确保提供方存在,实现了服务之间的高度解耦
十五、为什么要使rabbitmq
答:
○ 在分布式系统下具备异步,削峰,负载均衡等一系列高级功能;
○ 拥有持久化的机制,进程消息,队列中的信息也可以保存下来。
○ 实现消费者和生产者之间的解耦。
○ 对于高并发场景下,利用消息队列可以使得同步访问变为串行访问达到一定 量的限流,利于数据库的操作。
○ 可以使用消息队列达到异步下单的效果,排队中,后台进行逻辑下单。
十六、 使用rabbitmq的场景
答:
○ 服务间异步通信
○ 顺序消费
○定时任务
○ 流量削峰
○ 解耦
十七、如何确保消息不丢失?
答:消息持久化,当然前提是队列必须持久化
十八、feign的实现原理
答:
首先在接口上定义了@FeignClient注解,feign就会对这个接口创建一个动态代理,然后调用这个接口的时候,其实就是调用了Feign创建的动态代理,Feign的动态代理会根据接口上@GetMapping/@RequestMapping等等注解来动态构造要代理的服务的地址,然后对这个地址发起请求,解析响应。
十九、高并发设计时,为什么要分库分表?
答:
如果有几千万条数据的时候,单表数据量太大,会极大影响你的 sql 执行的性能,到了后面你的 sql 可能就跑的很慢了
1、分表是啥意思?
就是把一个表的数据放到多个表中,然后查询的时候你就查一个表。比如按照用户 id 来分表,将一个用户的数据就放在一个表中。然后操作的时候你对一个用户就操作那个表就好了
2、分库是啥意思?
就是你一个库一般我们经验而言,最多支撑到并发 2000,一定要扩容了,而且一个健康的单库并发值你最好保持在每秒 1000 左右,不要太大。那么你可以将一个库的数据拆分到多个库中,访问的时候就访问一个库好了。
二十、垂直分库(分表)和水平分库(分表)
垂直:以列为单位将数据拆分成多张表,多张表通过主键进行关联,从而组成完整的数据,分表之后每张表的数据结构都不相同,
作用:
减少了字段的查询,从而提高了查询的效率。
水平:以行为单位进行数据拆分,分表之后所有的表数据结构都是一样的。
作用:
解决表中数据量打得问题,如果一张表的数据太多,查询和操作起来都很麻烦,
二十一、如何进行缓存预热?
缓存预热:
缓存预热就是系统上线或更新后,提前将相关配置的缓存数据直接加载到缓存系统。避免在网站用户在系统上线第一次请求的时候,先查询数据库,然后再将数据缓存的问题,用户直接查询事先被预热的缓存数据,这样增加了数据库的压力,降低了用户的体验度。
处理方案:
1、配置一个job定时刷新数据缓存。
2、直接写个缓存刷新页面,上线后手动刷新。

二十二、Spring的常用方法

字符串变量名.length(); 返回int类型 得到字符串长度
语法 :字符串名.charAt(值);返回值为 char 类型 从字符串中取出指定位置的字符
语法 :字符串名.toCharArray();返回值为 char 数组类型 将字符串变成一个字符数组
语法 :字符串名.indexOf("字符",值) 查找一个指定的字符串是否存在,返回的是字符串的位置,如果不存在,则返回-1 。
lastIndexOf("字符") 得到指定内容最后一次出现的下标
.toUpperCase();.toLowerCase();字符串大小写的转换
.split("字符") 根据给定的正则表达式的匹配来拆分此字符串。形成一个新的String数组。
equals(Object anObject) 语法 :字符串变量名.wquals(字符串变量名);返回值为布尔类型。比较两个字符串是否相等,返回布尔值
trim(); 去掉字符串左右空格 新字符替换旧字符,也可以达到去空格的效果一种。
 substring(int beginIndex,int endIndex) 截取字符串
equalsIgnoreCase(String) 忽略大小写的比较两个字符串的值是否一模一样,返回一个布尔值
 contains(String) 判断一个字符串里面是否包含指定的内容,返回一个布尔值
startsWith(String) 测试此字符串是否以指定的前缀开始。返回一个布尔值
endsWith(String) 测试此字符串是否以指定的后缀结束。返回一个布尔值
replaceAll(String,String) 将某个内容全部替换成指定内容,
repalceFirst(String,String) 将第一次出现的某个内容替换成指定的内容

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值