第一次整理,非常潦草。诸位莫怪。

第一次整理,非常潦草。诸位莫怪。,第1张

第一次整理,非常潦草。诸位莫怪。

你好,面试者,欢迎面试我们公司的Java开发岗位,首先请你做一个自我介绍。

好,那么接下来我问你一些Java相关的问题,

比方说你知道Java是面向什么的,好是面向对象,那么请你说一下jvm当中的内存区域有哪些?
    线程私有:程序计数器、虚拟机栈、本地方法栈;线程共享:堆、方法区/永久代
jvm运行时内存有哪些?
    新生代、老年代、永久代(java8中被“元空间”取代)
垃圾回收算法有哪些?
    标记清除算法、复制算法(适用新生代)、标记整理算法(适用老年代)、分代收集算法
Java当中4种引用类型知道吗?
    强引用,软引用,弱引用,虚引用
Gc垃圾回收器有哪些呢?
    新生代:Serial 垃圾收集器(单线程、复制算法)、ParNew 垃圾收集器(Serial+多线程)、Parallel Scavenge 收集器(多线程复制算法、高效)
    老年代:Serial Old 收集器(单线程标记整理算法 )、CMS(Concurrent mark sweep)收集器(多线程标记清除算法)、G1(Garbage first)收集器、Parallel Old 垃圾收集器
Java当中io和nio他们之间有什么不同的地方?
    io,就是传统bio同步阻塞式io,适用简单,但是并发处理差。
    nio,同步非阻塞式io,客户端和服务端通过Channel通讯,实现了多路复用。
    补充:aio,异步非阻塞io, *** 作基于事件和回调机制。
Java的类加载机制请你给我简单描述一下。
    我们编写的java文件都是保存着业务逻辑代码。java编译器将 .java 文件编译成扩展名为 .class 的文件。.class 文件中保存着java转换后,虚拟机将要执行的指令。当需要某个类的时候,java虚拟机会加载 .class 文件,并创建对应的class对象,将class文件加载到虚拟机的内存,这个过程被称为类的加载。

好,那么它里边有一个双亲委派机制,你给我详细的说一说。
    当一个类收到了类加载请求时,不会自己先去加载这个类,而是将其委派给父类,由父类去加载,如果此时父类不能加载,反馈给子类,由子类去完成类的加载。
    如果没有使用双亲委派模型,由各个类加载器自行加载的话,如果用户自己编写了一个称为java.lang.Object的类,并放在程序的ClassPath中,那系统将会出现多个不同的Object类。

那么在tomcat当中,他又是如何打破了双亲委派机制的呢?
    先说说为什么要打破双亲委派:Tomcat中会部署多个应用,每个应用可能会出现相同的类名,或者引用相同的jar包但版本不同,若使用双亲委派,一个类只会加载一次,项目就互相之间有冲突,若打破双亲委派,可以实现各自的应用加载自己应用的类,互不影响。
    如何打破:自定义类加载器,然后重写loadClass,不先由父类加载。


好,接下来问你一些集合和相关的问题,

我们list当中你接触过,比方说有arraylist vector和linked list,他们的底层实现分别是哪些?有什么不同?
arraylist:底层是动态数组结构,查询 方便,线程不安全。
linkedlist:底层是双向链表结构, 增删改  方便,线程不安全。
vector:底层是动态树结构,线程安全,因为其方法自带synchronized! ,所以效率低。

Set当中有hashset,treeset和linkedhashset,他们底层又是如何实现的?
HashSet底层采用HashMap来保存元素。hashmap底层就是数组+链表。
TreeSet是基于TreeMap实现的,TreeMap底层通过红黑树实现。
linkedHashSet底层是一个linkedHashMap,底层维护了一个数组 + 双向链表,不允许添加重复元素

Map当中有hashmap,那么你为什么使用了concurrenthashmap,它是怎么实现的一个线程安全的呢?
在1.7中,它是采用segmnt分段锁,将HashMap进行切割,把HashMap进行切割,把 HashMap 中的哈希数组切分成小数组,每个小数组有 n 个 HashEntry 组成,其中小数组继承自ReentrantLock(可重入锁),这个小数组名就叫Segment。默认16个,写 *** 作占用一个segment,其他 *** 作在剩余15个中进行。
在1.8取消了分段锁,采用 CAS + synchronized 来保证并发安全,数据结构跟 jdk1.8 中 HashMap 结构类似,都是数组 + 链表(当链表长度大于8时,链表结构转为红黑二叉树)结构。synchronized 只锁定当前链表或红黑二叉树的首节点,只要节点 hash 不冲突,就不会产生并发,相比 JDK1.7 的 ConcurrentHashMap 效率又提升了 N 倍


说到线程,

那么Java当中多线程,你知道有哪些创建线程的方式吗?
继承Thread, 编写简单,直接使用this即可获得当前线程。但是,不能再继承其他父类。
实现runnable接口,
实现callable接口, 这两个线程类只是实现了Runnable接口或Callable接口,还可以继承其他类。但是,编程稍微复杂,如果要访问当前线程,则必须使用Thread.currentThread()方法
Threadpool创线程。

那4种线程池分别是什么?
FixedThreadPool 可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程。在某个线程被显式地关闭之前,池中的线程将一直存在。
SingleThreadPool:Executors.newSingleThreadExecutor()返回一个线程池(这个线程池只有一个线程),这个线程池可以在线程死后(或发生异常时)重新启动一个线程来替代原来的线程继续执行下去!
CachedThreadPool 缓存线程池,可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。如果现有线程没有可用的,则创建一个新线程并添加到池中。终止并从缓存中移除那些已有 60 秒钟未被使用的线程。
ScheduledThreadPool 计划线程池,可以定时定期执行任务。
(那你们公司用哪一种线程池呢?我们用自定义的,根据项目需求,调整线程池的几个参数)

线程的生命周期又是什么?
新建(NEW),就绪,阻塞(BLOCKED)【等待阻塞(o.wait->等待对列),同步阻塞(lock->锁池),其他阻塞(sleep/join),】,运行,死亡

如何终止线程?
正常运行结束
使用退出标志退出线程
Interrupt 方法结束线程(细分两种)
stop 方法终止线程(直接thread.stop(),但是不安全)

那么sleep和wait有什么区别?
sleep()属于Thread类;wait()属于Object类;
sleep()不会释放对象锁,但是wait()会让对象释放锁。

Start和run又有什么区别?
run只是Thread里面的一个普通运行方法,start是启动线程的方法。

Java之中又有哪些锁机制?偏向锁、轻量级锁、自旋锁、重量级锁(应该是问的多线程加锁机制,主要有两种,一种是JDK实现的lock,另外一种是JVM底层实现的Synchronized关键字)
好,其中的synchronize的非常用的多,那么synchronize它的作用核心和实现分别又是什么?
底层原理:
每个对象都是一个监视器锁(monitor),当monitor被占用时就会处于锁定状态,线程执行monitorenter指令会尝试获取monitor的所有权,过程如下:
    如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者;
    如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1;
    如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权;

好的,那么线程当中有什么方法?线程,上下文又如何切换?
run(),start()这样的。还有sleep(),wait(),join(),yield()等等。
什么是上下文切换:同一时间,cpu只有一个线程执行,所谓多线程,就是将cpu的执行时间分片,1s分成100份10ms,就是100个1时间片。
当前任务执行一个时间片后会切换到下一个任务,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态,从任务保存到再加载的过程就是一次上下文切换。
(上下文切换会导致额外的开销,因此减少上下文切换次数便可以提高多线程程序的运行效率。减少上下文切换的方法有无锁并发编程、CAS算法、使用最少线程和使用协程)

好,这点不知道了,行,那么我们再往下说,你知道一些CAS吗?
CAS是什么?什么又是aqs ?
一个一个说:
compare & swap  比较并替换。一种基于乐观锁的 *** 作。java.util.concurrent包完全建立在CAS之上的。
3个 *** 作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
常见的CAS问题就是ABA问题,可以通过加版本号version解决,每次 *** 作,version+1。
因为CAS通过自旋等待来实现数据的获取,还会造成CPU性能的占用问题。

aqs,(AbstractQueuedSynchronizer)抽象队列同步器。是java自带的synchronized关键字之外的锁机制。
是一个用来构建锁和同步器的框架,内部实现的关键是:先进先出的队列、state状态,在LOCK包中的相关锁(常用的有ReentrantLock、 ReadWriteLock)都是基于AQS来构建。


ok,那就先问到这里,那么接下来再问你一点,其他的比方说我们Java基础当中,

你遇到过哪些异常吗?NullPointerException,ArithmeticException这样的,想不起来太多。
他们异常是怎么分类的?检查异常和运行时异常
好,分别给我举出具体的有哪些异常吧,
典型的RuntimeException(运行时异常)包括NullPointerException, ClassCastException(类型转换异常),IndexOutOfBoundsException(越界异常), IllegalArgumentException(非法参数异常),ArrayStoreException(数组存储异常),AruthmeticException(算术异常),BufferOverflowException(缓冲区溢出异常)等;
非RuntimeException(检查异常)包括IOException, SQLException,InterruptedException(中断异常-调用线程睡眠时候),NumberFormatException(数字格式化异常)等。
java当中反射有什么作用,它的好处是什么?
通过反射可以使程序代码访问装载到JVM 中的类的内部信息,包括:已装载类的属性信息,已装载类的方法,已装载类的构造方法信息
反射提高了Java程序的灵活性和扩展性,降低耦合性,提高自适应能力。它允许程序创建和控制任何类的对象,无需提前硬编码目标类

Java当中注解你又是如何使用的?像是写Mybatis常用的@Controller,@Service,@Mapper,@Autowired。
你自己写过注解没有?写过。
好,内部类是什么东西?一个类的定义放在另外一个类的定义内部,这就是内部类。内 部类本身就是类的一个属性,与其他属性定义方式一致。
泛型又是什么东西?
泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。泛型的本质是参
数化类型,也就是说所 *** 作的数据类型被指定为一个参数。比如我们要写一个排序方法,能够对整型数
组、字符串数组甚至其他任何类型的数组进行排序,我们就可以使用 Java 泛型。

Java序列化是要干什么的?
序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。 反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。 总结:核心作用就是对象状态的保存和重建。

Ok,Java基础先问到这里。

那么在问你一些Java web相关的知识,

比方说cookie和session是什么意思?分别是要干什么的?
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式。

转发和重定向又有什么区别?
都是页面跳转用,
转发:由服务器端进行的页面跳转
    地址栏不发生变化,显示的是上一个页面的地址
    请求次数:只有1次请求
    根目录:http://localhost:8080/项目地址/,包含了项目的访问地址
    请求域中数据不会丢失
重定向:由浏览器端进行的页面跳转
    地址栏:显示新的地址
    请求次数:2次
    根目录:http://localhost:8080/ 没有项目的名字
    请求域中的数据会丢失,因为是2次请求

写过JSP没有?
Jsp当中的4个作用域以及9种内置对象,你给我说一下,没有用过那就算了。
按照作用范围:PageContext(jsp页面) request 请求对象 类型 javax.servlet.ServletRequest 作用域 Request
response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page
pageContext 页面上下文对象 类型 javax.servlet.jsp.PageContext 作用域 Page
session 会话对象 类型 javax.servlet.http.HttpSession 作用域 Session
application 应用程序对象 类型 javax.servlet.ServletContext 作用域 Application
out 输出对象 类型 javax.servlet.jsp.JspWriter 作用域 Page
config 配置对象 类型 javax.servlet.ServletConfig 作用域 Page
page 页面对象 类型 javax.lang.Object 作用域 Page
exception 例外对象 类型 javax.lang.Throwable 作用域 page


那么第三大块我再问你一些spring相关的东西,

spring它有什么特点?ioc,aop。
它的核心组件有?Core、Context和Bean。
哪些常用模块,哪些包,哪些常用注解你都用过呢?
常用模块:核心容器,spring上下文,spring aop,spring dao,spring orm,spring web框架,spring mvc框架
主要jar包:
org.springframework.core--Spring的核心工具包,其他包依赖此包
org.springframework.beans--所有应用都用到,包含访问配置文件,创建和管理bean等。
org.springframework.aop--spring面向切面编程,提供aop的实现
......

好,spring  Ioc的原理是什么呢?
通过一个配置文件描述 Bean 及 Bean 之间的依赖关系,利用 Java 语言的反射功能实例化 Bean并建立 Bean 之间的依赖关系。
(以前需要自己new对象,现在提供实体类,spring自动创对象,导依赖)

好,那么spring当中它的作用域、bean生命周期以及依赖注入的4种方式,你给我说一下。
作用域:
(默认)Singleton是单例类型,就是在创建起容器时就同时自动创建了一个bean的对象,不管你是否使用,他都存在了,每次获取到的对象都是同一个对象。
Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象。
Request:每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。当处理请求结束,request作用域的bean实例将被销毁
作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。当HTTP Session最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉
作用域为Global Session,表示在一个全局的HTTP Session中,一个bean定义对应一个实例。bean被限定于全局portlet Session的生命周期范围内。
依赖注入:
构造器注入;
setter方法注入;
静态工厂注入;
实例工厂

好,那么aop又是什么意思?
(Aspect Orient Programming)为面向切面编程。就是把业务逻辑和横切的问题进行分离,目的是重用代码,把公共代码抽取出来。在不改动原代码的情况下,实现新功能。

好, SpringMVC它的一个工作流程简单给我描述一下。
客户端通过url发送请求
核心控制器Dispatcher Servlet接收到请求,通过系统或自定义的映射器配置找到对应的handler,并将url映射的控制器controller返回给核心控制器。
通过核心控制器找到系统或默认的适配器
由找到的适配器,调用实现对应接口的处理器,并将结果返回给适配器,结果中包含数据模型和视图对象,再由适配器返回给核心控制器
核心控制器将获取的数据和视图结合的对象传递给视图解析器,获取解析得到的结果,并由视图解析器响应给核心控制器
核心控制器将结果返回给客户端

好,那么spring boot它的原理是什么?
同传统的Spring开发模式相比,开发Springboot应用时,我们只需要引入相关的starter jar包就能构造一个可以运行起来的应用,这样就可以把主要的精力用于核心业务功能的开发,非常方便和高效。
(就是各种 引pom依赖很方便?高度封装好的各种注解,用就完事了。)


好,那么mybatis它里边有几个缓存?
    一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
   对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D *** 作后,默认该作用域下所有 select 中的缓存将被clear。


好的,那么 Spring这边先问到这里,接下来再问问你微服务相关的东西

你用过哪些微服务的组件?
(微服务就用过springcloud,dubbo没玩过)springcloud五大组件:服务发现Eureka,客户端负载均衡Ribbon,断路器Hystrix,服务网关Zuul,分布式配置

注册中心,网关,配置中心、事件调度、服务跟踪,熔断分别是哪些组件?
注册中心,包括Zookeeper,Eureka,Etcd,Consul,Nacos。主要提供 服务发现,服务配置,服务健康检测功能。
网关,gateway,官方的定义:网关服务是单一访问点,并充当多项服务的代理
    大白话解释一下:A系统调用B系统的接口,不再是直接调用,而是A系统调用网关,网关调用B系统。
配置中心、传统的静态配置方式要想修改某个配置只能修改之后重新发布应用,要实现动态性,可以选择使用数据库,通过定时轮询访问数据库来感知配置的变化。轮询频率低感知配置变化的延时就长,轮询频率高,感知配置变化的延时就短,但比较损耗性能,需要在实时性和性能之间做折中。配置中心专门针对这个业务场景,兼顾实时性和一致性来管理动态配置。
事件调度:......
服务跟踪,目前,链路追踪组件有Google的Dapper,Twitter 的Zipkin,以及阿里的Eagleeye (鹰眼)等,它们都是非常优秀的链路追踪开源组件。
熔断:hystrix


好,那么你用过netty框架吗?
官方定义为:Netty 是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器
Netty和rpc他们有什么联系?
RPC,即Remote Procedure Call(远程过程调用),调用远程计算机上的服务,就像调用本地服务一样。RPC可以很好的解耦系统
RPC框架有很多,比较知名的如阿里的Dubbo、google的gRPC、Go语言的rpcx、Apache的thrift。当然了,还有Spring Cloud,不过对于Spring Cloud来说,RPC只是它的一个功能模块。
(是存在一个消费者和生产者的关系吗?)

你用netty可以写出一个rmi来吗?G

好,那么接下来再问您网络的知识,

你知道网络的7层架构和5层架构分别是怎么一回事?
(1)OSI七层模型
OSI中的层 功能 TCP/IP协议族
应用层 文件传输,电子邮件,文件服务,虚拟终端 TFTP,HTTP,SNMP,FTP,SMTP,DNS,Telnet
表示层 数据格式化,代码转换,数据加密 没有协议
会话层 解除或建立与别的接点的联系 没有协议
传输层 提供端对端的接口 TCP,UDP
网络层 为数据包选择路由 IP,ICMP,RIP,OSPF,BGP,IGMP
数据链路层 传输有地址的帧以及错误检测功能 SLIP,CSLIP,PPP,ARP,RARP,MTU
物理层 以二进制数据形式在物理媒体上传输数据 ISO2110,IEEE802,IEEE802.2

(2)TCP/IP五层模型的协议
应用层
物理层:中继器、集线器、还有我们通常说的双绞线也工作在物理层
数据链路层:网桥(现已很少使用)、以太网交换机(二层交换机)、网卡(其实网卡是一半工作在物理层、一半工作在数据链路层)
网络层:路由器、三层交换机
传输层:四层交换机、也有工作在四层的路由器

好,那么TCP/IP的原理你给我简单说一下,
G

TCP IP的 Tcp它为什么需要3次握手以及4次挥手?
三次握手:
客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的。
第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。
第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。
四次挥手:
1)客户端向服务端发送断开连接请求(FIN=1,进入FIN-WAIT-1状态)(第一次挥手);
2)服务端接收到断开请求后,同意向客户端断开连接,但是还有数据在传输,要等数据先传输完,所以先告知客户端收到断开请求了(进入CLOSE-WAIT状态)(第二次挥手);
3)服务端数据传输完成后,告知客户端,要关闭连接了(第三次挥手);
4)客户端接收到服务端的断开连接消息后,告知服务端已收到断开连接的消息(第四次挥手);
客户端和服务端就关闭了连接。

我能不能加几次或者减少几次?
两次握手,服务端就无法确认客户端的接发能力。
四次握手会造成浪费。

Http它的原理是什么?
HTTP 是一个无状态的协议。
无状态是指:客户端(Web 浏览器)和服务器之间不需要建立持久的连接,这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服务器端不保留连接的有关信息;
HTTP 遵循请求(Request) / 应答(Response)模型。客户端(浏览器)向服务器发送请求,服务器处理请求并返回适当的应答。所有 HTTP 连接都被构造成一套请求和应答。

你经常遇到哪些HTTP的状态码?
    200 - 请求成功
    301 - 资源(网页等)被永久转移到其它URL
    404 - 请求的资源(网页等)不存在
    500 - 内部服务器错误

好,cdn知道是干什么用的吗?
Content Delivery Network内容分发网络。
CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。
平时我们发起web请求:
1:当我们通过浏览器对我们的想要的域名发起访问时,浏览器会向本地DNS服务器(域名解析服务器)发起请求,对我们要访问的域名进行解析。
2:如果本地DNS服务器的缓存中存在这个域名的解析ip,则直接响应用户的解析请求。
3:如果本地DNS服务器不存在该域名的解析结果,则通过递归的方式向整个DNS系统请求解析,在获得反馈后将结果反馈给浏览器。
4:浏览器得到该域名的解析ip后,会向服务器发起请求。
5:服务器会返回用户请求结果到浏览器。
有CDN时,web请求时:
1:用户向本地DNS服务器请求解析域名时,DNS系统最终会将域名的解析权交给CNAME指向的CDN专用DNS服务器。
2:CDN的DNS服务器会将CDN的全局负载均衡设备ip地址返回给用户。
3:用户向ip地址所指的全局负载均衡设备发送url请求。
4:CDN全局负载均衡设备根据用户的地址和用户请求域名,为该用户分配地区负载均衡设备,将地区负载均衡设备ip地址发送给用户,用户继续向地区负载均衡设备发起请求。
5:地区负载均衡设备根据用户的请求,为用户分配一台缓存服务器。
6:用户向该缓存服务器发起请求,该缓存服务器响应该强求,将数据发送给用户。
7:如该缓存服务器不存在用户需要的数据,则向它的上一级缓存服务器发送请求,直至追溯到网络的原服务器,将数据发送给用户。


好,那么你用过哪些日志框架?
除了sel4j,log4j,logback以外,你用过elk没有?
ELK是Elasticsearch、Logstash、Kibana的简称(在狭义上:日志链路分析架构技术总栈)
ELK 其实并不是一款软件,而是一整套解决方案,是三个软件产品的首字母缩写
Elasticsearch:负责日志检索和储存
Logstash:负责日志的收集和分析、处理
Kibana:负责日志的可视化
(汇总、分析和搜索重要数据日志)

接下来再问问zookeeper听说过吗?
在分布式领域有一个很著名的CAP定理:C:数据一致性。A:服务可用性。P:分区容错性(服务对网络分区故障的容错性)。
在这个特性中任何分布式系统只能保证两个。ap 或者 cp。由于当前网络延迟故障会导致丢包等问题,所以我们分区容错性是必须实现的。
Eureka和Zookeeper就是CAP定理中的实现,Eureka(保证AP),Zookeeper(保证CP)
Zookeeper的设计理念就是分布式协调服务,保证数据(配置数据,状态数据)在多个服务系统之间保证一致性。
ZK最重要的就是它的ZAB(消息广播和崩溃恢复)协议了。
现在nacos用的也很多,它有两种模式,分别侧重ap,cp。

它当中有哪些角色?
领导者(leader),学习者(leaner){跟随者follower,观察者observer},客户端(client)

他的投票机制是什么?
https://blog.csdn.net/qq_42046105/article/details/111026718?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242.1&utm_relevant_index=3

好,你用过mq没有?你用过几种消息队列?activemq,rabbitmq,rocketmq,kalfa。
好,说说卡夫卡的设计理念。(...)

你用过rabbitmq没有?Rbmq它的几种工作模式给我简单介绍一下。
一、简单模式,
生产者将消息交给默认的交换机,交换机获取消息后交给绑定这个生产者的队列(投递规则为队列名称和routing key 相同的队列),监听当前队列的消费者获取信息并执行消费逻辑。
有一个oa系统,用户通过接收手机验证码进行注册,页面上点击获取验证码后,将验证码放到消息队列,然后短信服务从队列中获取到验证码,并发送给用户。
二、工作模式,
生产者将消息交给交换机,交换机交给绑定的队列,队列有多个消费者监听,一条消息只能由一个消费者消费,这样就形成了资源竞争,谁的资源空闲大,争抢到的可能性就大
有一个电商平台,有两个订单服务,用户下单的时候,任意一个订单服务消费用户的下单请求生成订单即可。不用两个订单服务同时消费用户的下单请求
三、发布订阅模式
生产者将消息扔给交换机,交换机类型是fanout,不同的队列注册到交换机上,不同的消费注册在不同的队列上。所有消费者都会收到消息。
有一个商城,我们新添加一个商品后,可能同时需要去更新缓存和数据库。
四、路由模式
生产者将消息发送给交换机,消息携带具体的routingkey。交换机类型是direct,接收到消息中的routingkey,比对与之绑定的队列的routingkey,分发到不同的队列上。
还是一样,有一个商城,新添加了一个商品,实时性不是很高,只需要添加到数据库即可,不用刷新缓存。
五、主题模式
路由模式的一种,路由功能添加了模糊匹配。星号(*)代表1个单词,#号(#)代表一个或多个单词。具体可参考路由模式。
还是一样,有一个商城,新添加了一个商品,实时性不是很高,只需要添加到数据库即可,数据库包含了主数据库mysql1和从数据库mysql2的内容,不用刷新缓存。

好,那么如果数据量过大了,我们的数据库存不下,你用过hbase没有?没用过。
很好。Hb它的核心概念是什么?它有哪些核心的架构?你简单来说一下它的一个写逻辑。

好,mongoDB你用过吗?它适合在什么场景下使用?非关系型数据库嘛,
MongoDB很适合那些表结构经常改变,数据的逻辑结构没又没那么复杂不需要多表查询 *** 作,数据量又比较大的应用场景。
一般用在项目里,存的都是一些不是太重要的数据,像是评论区这样的。

那么设计模式你听说过没有?能说几种设计模式?除了工厂单例模式,你再给我说几个?再说10种。
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
总体来说设计模式分为三大类:
创建型模式(5种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
结构型模式(7种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

好负载均衡听说过。那么我问你做过哪些负载均衡?
nginx。

它负载均衡有哪些策略与算法?
Nginx可使用的负载均衡策略有五种:轮询(默认)、权重、ip_hash、url_hash(第三方)、fair(第三方)。
1,轮询:不会考虑到每台的服务器的处理能力
2,权重:考虑了每台服务器处理能力的不同,用的最多
3,ip_hash:能实现同一个用户访问同一个服务器,解决了分布式session问题,但ip hash 负载均衡也是不平均的
4,url hash(第三方:需要配第三方插件):能实现同一个服务(url)访问同一个服务器,
5,fair(第三方):根据后端服务器的响应时间分布请求,响应时间短的优先分配 。

Lvs和keep alive还有nginx,它们分别的负载均衡有什么区别?(完全没了解过)
http://www.javashuo.com/article/p-rtnqrkjd-ez.html

数据库再问你一些相关内容,数据库你经常使用好吧?

那么mysql是你经常使用的,那么你说一说innoDb它底层是如何实现的?
底层就是B+树嘛。它的特点就是分叶子节点和非叶子节点。
叶子节点会存值;非叶子节点仅存键;
叶子节点间还有双向链表连接,更易实现区间查。

索引是怎么构建的?它如何失效?
普通的索引的创建:
CREATE INDEX  (自定义)索引名  ON  数据表(字段);
复合索引的创建:
CREATE INDEX  (自定义)索引名  ON  数据表(字段,字段,。。。);
删除索引:DROP INDEX 索引名;
索引查询失效的几个情况:
1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
3、组合索引,不是使用第一列索引,索引失效。
4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
5、在索引字段上使用not,<>,!=。不等于 *** 作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
6、对索引字段进行计算 *** 作、字段上使用函数。(索引为 emp(ename,empno,sal))
7、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。

数据库的三范式分别是什么?
1.第一范式(1NF):列不可再分
2.第二范式(2NF)属性完全依赖于主键
3.第三范式(3NF)属性不依赖于其它非主属性    属性直接依赖于主键

数据库它里面这些事务你知道有什么?
事务具有原子性,执行事务要成功,全部成功;要失败,全部执行失败,其中改变的数据会回滚。经典例子:转账断电。
用begin transaction  声明此处使用事务,下面的语句就会合并为整体执行,直到遇见  rollback  回滚。

用过存储过程吗?
SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。
语法:
CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]])[特性 ...] 过程体
示例:
  CREATE PROCEDURE myproc(OUT s int)
    BEGIN
      SELECT COUNT(*) INTO s FROM students;
    END

用过触发器吗?
触发器(trigger):监视某种情况,并触发某种 *** 作。
语法:
create trigger 触发器名
after/before insert/update/delete on 表名
for each row   #这句话在mysql是固定的
begin
sql语句;
end;

好,那么再问你一些一致性算法,(算法题GG)

Paxos这个算法知道吗?Raft知道吗?好,知道没听过就算了。(感兴趣自己查,G)

那么我们再问你一点, Java当中的算法,你除了二分查找算法冒泡排序算法之外,你还知道哪些算法?
好,你说一下最短路径算法应该是怎么算呢?(G)

好,那么数据结构再问一点,你知道这些数据结构有哪些吗?

很好,那么排序二叉树是干什么用的?
很好,红黑树呢?btree呢?
很好,那么加密算法你知道哪些吗?没听过。
Aes,RSA和MD5,他们这几种加密算法分别是什么意思?


好,那么分布式缓存当中你听过怎么样缓存
如何雪崩,如何解决?
雪崩就是同一时间,大批量的缓存数据失效,导致查询全部到了数据库,数据库就崩了。
解决办法:给缓存数据的过期时间设置随机数,避免同一时间失效。或者加锁。

缓存穿透了如何解决?
穿透就是不听访问数据库中不存在的数据,导致数据库压力过大。
解决:允许存 key-null,同时设置其过期时间短点(存活时间非常短)。

缓存预热是干什么?
缓存预热是指系统上线后,提前将相关的缓存数据加载到缓存系统中,避免刚上线使用户有太多请求打到数据库上去,然后再去将数据缓存的问题。
    数据量不大的时候可以不进行缓存预热,或者工程启动后再进行加载缓存动作
    数据量很大的时候,一定要保证热点数据提前加载到缓存。

缓存如何更新?
缓存更新,是指根据需要定期或触发清理过期或不需要的缓存。
除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们还可以根据具体的 业务需求进行自定义的缓存淘汰,常见的策略有两种:

(1)定时去清理过期的缓存;

(2) 当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数 据并更新缓存。

两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,根据自己的应用场景来权衡。

缓存如何降级?
当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开 关实现人工降级。 降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。

以参考日志级别设置预案:

(1)一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;

(2)警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级, 并发送告警;

(3)错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的 最大阀值,此时可以根据情况自动降级或者人工降级;

(4)严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。

服务降级的目的,是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,Redis出现问题,不去数据库查询,而是直接返回默认值给用户。

好,那就先问到这里。这是Java基础,ok我看你还做过哪几个项目,那么接下来第二大块你说说你的项目,
你上一个项目你是做的什么?
他然后你在里边做了哪些模块?
遇到最大的问题是什么?好的。
行,那么第三块我知道你的能力了,

那么接下来我想问一下,那么你的期望薪水是多少?
比如说10k我觉得你只值7k你能接受吗?

好的,那么回去等通知。好,那么此次面试到此结束。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5696734.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存