Java基础:
- Spring 是如何解决循环依赖的问题的?比如A autowired B,Bautowired A,内部是如何是如何实现的?
- Spring IOC的理解,原理与实现;
- 设计模式:代理模式与装饰者模式的区别;常用的设计模式:单例模式、代理模式、装饰着模式等,单例模式主要解决什么问题;
单例模式的优点:
单例模式的缺点: - Spring boot何时启动结束;(58、)
- Spring boot 启动类上的注解 @spring boot Application说明?
Spring boot如何判断当前应用是否时web应用?
spring boot启动流程:
1)构造SpringApplication实例,在构造过程中有判断当前应用的类型,代码如下:
this.webApplicationType = WebApplicationType.deduceFromClasspath();
2)、执行run方法:
(1)、创建并应用监听;
(2)、加载配置文件;
(3)、准备并刷新上下文;
- Bean Factory与FactoryBean有什么区别?@Bean这个注解时如何实现Bean的注入的?
BeanFactory是一个工厂类的接口,是spring IOC的容器的核心接口,它的职责实例化、定位、配置应用程序中的对象即建立这些对象的依赖;
FactoryBean是一个Bean,它是实现了FactoryBean<T> 接口的bean,根据该Bean的Id从BeanFactory中获取的实际是BeanFactory的getObject返回的对象,而不是Factory Bean本身;即BeanFactory是用来获取对象的,Bean Factory是用来管理对象的。
- Java中的静态方法只有一个实例,如果想用多个实例怎么办?
- 深度克隆的主要实现方式?
- Java面向对象的基本特征,继承、封装与多态;
- 重写和重载的是什么意思?
- 怎样生命一个类不会被继承?final
- Integer是基本数据类型还是引用数据类型?
- HashMap中jdk1.7与jdk1.8的区别(58);
二叉树-》平衡二叉树-》红黑树;
- concurrenthashMap 的底层实现原理(58);
- spring、spring boot、springcloud之间的关系;
- Java种的自增是线程安全的吗,如何实现线程安全的自增?
- Jdk1.8种的stream有用过吗,stream的并行操作原理,stream并行的线程池是从哪里来的;
- Jdk1.8的completableFuture有用过吗;
- Java种的代理有几种实现方式;
Java 并发及JVM相关:
- 线上部署时出现内存溢出该如何处理?
1、使用top命令查看当前进程对应的内存大小信息,并使用shift+M按照内存大小进行排序,查看进程中内存占用较大的进程;
2、利用jstat查看某一进程虚拟机的GC情况;
3、生成dump文件,通过dump文件查看当时内存对象相关的信息;生成dump文件有两种方式:
1)、使用jmap直接生成dump文件;
jmap -dump:format=b,file=heap.prof 17561 ;
format=b:表示生成二进制类型的dump文件;
file=:后面写的四输出的dump文件路径;
17561:jvm进程ID;
- Java多线程几种状态变更的图,图中包括线程所处的状态及线程各个状态之间是如何切换的?
- Java中的wait和sleep的区别与联系?
- Java.untils.concurrent包主要用到了哪些知识?
并发容器:
同步锁(两种):
线程池:
并发工具(3种): - 如何在方法栈中进行数据传递?
使用volatile关键字 - ThreadLocal的底层实现形式及实现的数据结构?
- Java有返回值的多线程使用?
- Java中值类型和引用类型的区别(==与equals()的区别、Java中的引用类型:值引用与);
- Java中方法参数的传递时值传递还引用传递?
- Java中堆和栈的区别?
- JVM 内存划分与垃圾收集算法:fullGC与youngGC;
- Java JVM相关内容结合项目介绍;
- 线上如何排查JVM内存溢出问题?
1.可以通过idea进行远程debugger;
2.相关命令jstat、jmap、jconsole等;
3.相关的工具,如阿里的阿尔萨斯等; - 服务器CPU占用特别高,怎么查看(58),面试重点JVM及多线程;
- Array List是线程安全的吗?
- ConcurrentHash Map是如何实现线程安全的;
- Sychornized是否是公平锁;
- JVM为什么要增加元空间;
- Javam如何查看问题,并进行jvm调优;
- 堆G1垃圾收集器有了解么,有什么特点;
Mysql面试题:
- MysqlMVCC、MySQL为什么选择B+树作为它的存储结构,为什么不选择Hash、二叉、红黑树(58);
- 如果仅仅是select * from table where id =45,上面三种数据结构都可以实现,但是如果是select * from table where id <45;则它们的查找方式就类似于全表扫描。B+树只在最末端叶子节点存数据,叶子节点是以链表形式相互指向的;
- 为什么不选择Hash索引:Hash索引不适合范围查找,而B+树特别适合范围查找;Hash索引每次查询都需要加载所有的索引数据到内存中,而B+树只需要根据匹配规则选择对应的叶子数据加载即可;
- Mysql如何写sql才能提高sql的执行效率;
- Mysql数据库的事务与锁的理解;
- 数据库临时表有没有用过,是怎么用的?
- 添加索引的缺点?
- Mysql的最左原则;
- Mysql的锁:两条sql语句分别执行如下:
sql1:更新数据的ID between 10 and 20 ;
sql2:更新数据的ID为11;
那么这个锁是如何保证11这条数据不被更新的呢? - Mysql的sql优化
1、Mysql使用过程中走索引的语句;
2、索引的优化
3、亿级的数据必须使用like进行查询,如何优化
- 多数据源情况下如何进行事物的管理;
- Union和union all有什么区别;
- dateTime和timestamp有什么区别;
- mysql数据库事务的几种形式,模式事务级别,Oracle、SQL server默认事务级别;
读未提交;
读已提交;
不可重复读;
可序列化; - mysql主从模式的实现;
- 如何解析sql语句;即explain关键字的使用;
- Select_type:查询类型,是简单查询还是复核查询;
- Type:对表的访问类型:All、index、range、ref、eq_ref、const、system、null;从左到右,性能从差到好;
- Possible_keys:指出mysql能使用按个索引在表中找到记录;
- Key:该列显示mysql实际使用的索引;
- Filtered:按表条件过滤行的百分比;
- Extra:执行情况的描述和说明;
- 为什么不对mysql的所有表都添加索引?
- Mysql索引为什么不用hash而用B+树;Hash的时间复杂度是多少;
- B+树索引可以进行范围查询吗,比如大于小于;
- 应用种mysql是集群还是单节点,最大表数据量是多少;
- Mysql的主从同步原理,mysql主从复制主要有几种模式;
- Mysql主库在事务提交时会把数据库变更作为事件event记录在二进制文件binlog中;mysql主库上的sys_binlog控制binlog日志刷新到磁盘;
- 主库推送二进制文件binlog中的事件到从库的中继日志relay log,知乎从库根据中继日志重做数据库变更操作。通过逻辑复制,以此来达到数据一致。
- Mysql通过三个线程来完成主从库之间的数据复制:其中binLog Dump线程泡在主库上,I/O线程和SQL线程泡在从库上。当从库启动复制时,首先创建一个I/O线程连接主库,主库随后创建binlog dump线程读取数据库时间并发送给I/O线程,I/O线程获取到数据库事件更新到从库的中继日志realy log中,之后从库上的sql线程读取中继日志relay log中更新的数据库事件并应用;
Mysql主从复制主要有三种模式:
- 基于sql语句的复制(statement-based replication,SBR);
- 基于行的复制(row-based replication,RBR);
- 混合模式复制(mixed-based replication,MBR);
Java框架相关:
- RabbitMQ的使用;
- Zookeeper的原理,什么情况下会使用zookeeper,zookeeper如何监听生成的节点,zk内部是如何实现的;
- Springcloud eureka是如何注册服务、如何监测心跳的,它注册的流程是怎么样的;
- Redis在项目中是如何使用的;
- 在分布式环境中如何快速发现某一台服务有问题;
- Mysql中如何设置一个字段为自增的;
- 分布式集群系统对外提供接口的时候如何验证对方的身份;
- Spring boot整合jsp的流程,需要注意哪些点;
- Eureka和zookeeper作为注册中心有什么区别(58);
- CAP理论:一致性(consistency)、可用性(Aviailability)、分区容错性(Partition tolerance)三者只能满足其二;
- CA:不是分布式架构,就使用这种,关系数据库按照CA进行设计,放弃分区容错性,因为没有分区;
- AP:加强可用性和分区容错性,放弃立即一致性(强一致性),追求最终一致性。比如eureka;比如微信提现,提示两小时到账,而不是马上到账;
- CP:强调强一致性和分区容错性,放弃可用性,比如zookeeper,master在宕机后进行选举leader期间服务不饿能提供;比如夸张转账,就是立即到账,你这边转出,那边收进,才任务一个事务完成;
- 由于ZK采用的时cp原则,所以其可用性降低,这是致命的问题,springcloud集成的eureka采用的是ap原则,牺牲了一致性,但是保证了可用性;
- Zookeeper0、zookeeper1、zookeeper2,三个节点的集群描述一下从zk启动,到zk对外提供服务的整个过程(58);
- Zookeeper集群leader的选举;
- 服务器初始化阶段和服务器运行期间leader挂掉情况选举机制大体相同,此处仅对服务器初始化启动期间进行说明;
- 先后启动两台服务器,启动后两台服务器进行通信,每台服务器都试图找到lead,于是进入leader选举过程,过程如下:
- 每个server发出一个投票,由于初始概况,server1和server2都会将自己作为leader服务器来进行投票,每次投票都会包含所推举的服务器的myId和ZXID,使用(myid,ZXID)来表示,此时server1的投票为(1,0),server2的投票为(2,0),然后各自将这个投票发给集群中的其他机器。
- 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票,是否来自lookiing状态的服务器。
- 处理投票:针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,pk规则如下:
优先检查ZXID。ZXID比较大的服务器优先作为leader。
如果ZXID相同,那么就比较myid。Myid比较大的服务作为leader服务器。 - 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受相同的投票信息,对于server1,server2而言,都统计出集群中已经有两台机器接受了(2,0)的投票信息,此时便认为已经选举出了leader;
- 改变服务器状态。一旦确定了leader,每个服务器就会更新自己的状态,如果是follower,就会变成Followiing,如果是leader,就会变成Leading。
- Zookeeper数据同步;
- Zookeeper对外提供服务;
- 有一个key,往zk写入,到写入成功它的大体过程是什么样的(58);
- 此处有一个客户端client和zookeeper服务器;
- Client向zookeeper的某一个server上写数据,发送一个写请求;
- 如果server1不是leader,那么server1会把接收到的请求进一步转发给leader,印美每个zookeeper集群里有一个是leader,这个leader会将写请求广播给各个server;各个server写陈工后就会通知leader;
- 当leader收到大多数server(超过一半)数据写成功了,那么就说明数据写成功了,如果是三个节点的话,只要有两个节点数据写成功了,那么就默认数据写陈工l ,写成功之后,leader会告诉server1数据写成功了。
- Server1会进一步通知client数据写成功了,这时就认为整个写操作成功;
- Zookeeper监听器的原理;
- 首先要由一个main()线程;
- 在main线程中创建zookeeper客户端,这是就会创建两个线程,一个负责网络连接通信,一个负责监听;
- 通过connect线程将注册的监听事件发送给zookeeper。
- 在zookeeper的注册监听器列表中将注册的监听时间添加到列表中。
- Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
- listener线程内部调用了process方法;
- 排行榜功能的实现:使用redis的zset;zset的底层数据结构是什么样的;除了redis的zset还有什么其他的数据结构可以实现这个功能;
- Redis的zset底层实现是跳跃表,跳跃表的底层实现是链表+索引(如上图),具体详情请点 https://www.jianshu.com/p/dc252b5efca6
- Sychronized和ReentryLock的区别(重点:底层实现的区别);
区别:1、2、3、4:Sychronized底层是unsafe方法、ReentryLock底层是(AQS); - Redis集群种类:主从模式、cluster模式及其应用;
- Redis种数据类型及应用场景;
- Redis的使用场景及存储格式;redis的持久化;RDB与AOF的设置,redis种哪个版本开始可以进行分布式的使用;
- Redis默认持久化方式为RDB:有三个策略:save 900 1\save 300 10\save 60 10000;
- AOF默认是关闭的;
- Nginx如何做限流?令牌桶算法与漏桶算法;
- Tomcat调优;
- 为什么使用RPC框架,什么时候会使用http请求;
- 什么场景下会使用MQ;MQ的优势与劣势,什么时候不能用MQ(MQ做不到同步);
- Springcloud组件介绍;
Linux服务器:
- Linux如何查看应用占用内存情况;
- Linux脚本编写会么;
- 线上应用的debugger;
idea有插件,可以远程链接服务器的代码,并在本地debugger;
其他工具:pingpoint(分布式性能监测工具); - 服务器CPU数量及线程池数量的关系;
1、服务器cpu数量(n);
2、是IO密集型(2n个线程)应用还是计算密集型(n+1个线程)应用;
算法题:
- 将一个矩阵顺时针旋转90°,请写出伪代码;
A11,A12,A13, A31,A21,A11,
A21,A22,A23, ——顺时针旋转90°——》 A32,A22,A22,
A31,A32,A33, A33,A23,A13,
(行,列)
第i行第j列——》第(j)行第(n-i)列;
- 输入:a boy is good ,输出:good is boy a ;
- 链表:1->2->3->4->5;请写一个程序,将链表反转过来:5->4->3->2->1;
综合考察:
- 如何做一个秒杀系统;
1、MQ做限流:保证只有1000个人可以访问系统;
2、使用redis做缓存;
3、redis往mysql中进行持久化
如何实现高可用、高并发、高吞吐的技术方案?
高并发:应用缓存、HTTP缓存、多级缓存、池化、异步并发、扩容、队列;
高吞吐:分布式集群;
高可用:负载均衡与反向代理(nginx)、隔离(hystrix)、限流(MQ/nginx)、降级(hytrix)、超时与重试(hystrix)、回滚(hystrix);
- A给B发请求,B执行往数据库insert的操作;设计一个架构,保证能够提供最大的并发量,架构如下:
- 分布式锁:
Redis实现方式:
redis:为什么使用setnx,或者说set 和setNx有什么区别;
setNx:系统在10:05 设置一个值,并给出5分钟的过期时间,系统刚刚set完之后redis集群崩溃,10:11分系统重启成功,那么redis中set的值是否还存在?
考察点:
1、redis 的持久化:刚set完是否能够被持久化到快照或者binlog日志中;
2、假设redis被持久化,且系统重启时间超过了redis设置的过期时间,那么key是否会被清理;
zookeeper实现方式:
- 缓存数据如何同DB同步更新?(mysql读取redis的binlog,进行数据的更新操作)
其他:
- 处于什么目的考PMP;
- 一个项目启动大会,大概是一个什么过程?
1.介绍项目启动;
2.任命项目经理;
3.宣布项目正式启动; - 对于自己来说,最近接触的比较新的东西或者知识;JVM、python;
- Python2和python3的区别(因为我上一个回答了python,所以这里会问);
- 对自己开发的系统的服务器硬件的了解;
- 在什么应用场景下需要升级服务器配置,什么场景下需要扩充集群;
Java基础:
- Spring 是如何解决循环依赖的问题的?比如A autowired B,Bautowired A,内部是如何是如何实现的?
- Spring IOC的理解,原理与实现;
- 设计模式:代理模式与装饰者模式的区别;常用的设计模式:单例模式、代理模式、装饰着模式等,单例模式主要解决什么问题;
单例模式的优点:
单例模式的缺点: - Spring boot何时启动结束;(58、)
- Spring boot 启动类上的注解 @spring boot Application说明?
Spring boot如何判断当前应用是否时web应用?
spring boot启动流程:
1)构造SpringApplication实例,在构造过程中有判断当前应用的类型,代码如下:
this.webApplicationType = WebApplicationType.deduceFromClasspath();
2)、执行run方法:
(1)、创建并应用监听;
(2)、加载配置文件;
(3)、准备并刷新上下文;
- Bean Factory与FactoryBean有什么区别?@Bean这个注解时如何实现Bean的注入的?
BeanFactory是一个工厂类的接口,是spring IOC的容器的核心接口,它的职责实例化、定位、配置应用程序中的对象即建立这些对象的依赖;
FactoryBean是一个Bean,它是实现了FactoryBean<T> 接口的bean,根据该Bean的Id从BeanFactory中获取的实际是BeanFactory的getObject返回的对象,而不是Factory Bean本身;即BeanFactory是用来获取对象的,Bean Factory是用来管理对象的。
- Java中的静态方法只有一个实例,如果想用多个实例怎么办?
- 深度克隆的主要实现方式?
- Java面向对象的基本特征,继承、封装与多态;
- 重写和重载的是什么意思?
- 怎样生命一个类不会被继承?final
- Integer是基本数据类型还是引用数据类型?
- HashMap中jdk1.7与jdk1.8的区别(58);
二叉树-》平衡二叉树-》红黑树;
- concurrenthashMap 的底层实现原理(58);
- spring、spring boot、springcloud之间的关系;
- Java种的自增是线程安全的吗,如何实现线程安全的自增?
- Jdk1.8种的stream有用过吗,stream的并行操作原理,stream并行的线程池是从哪里来的;
- Jdk1.8的completableFuture有用过吗;
- Java种的代理有几种实现方式;
Java 并发及JVM相关:
- 线上部署时出现内存溢出该如何处理?
1、使用top命令查看当前进程对应的内存大小信息,并使用shift+M按照内存大小进行排序,查看进程中内存占用较大的进程;
2、利用jstat查看某一进程虚拟机的GC情况;
3、生成dump文件,通过dump文件查看当时内存对象相关的信息;生成dump文件有两种方式:
1)、使用jmap直接生成dump文件;
jmap -dump:format=b,file=heap.prof 17561 ;
format=b:表示生成二进制类型的dump文件;
file=:后面写的四输出的dump文件路径;
17561:jvm进程ID;
- Java多线程几种状态变更的图,图中包括线程所处的状态及线程各个状态之间是如何切换的?
- Java中的wait和sleep的区别与联系?
- Java.untils.concurrent包主要用到了哪些知识?
并发容器:
同步锁(两种):
线程池:
并发工具(3种): - 如何在方法栈中进行数据传递?
使用volatile关键字 - ThreadLocal的底层实现形式及实现的数据结构?
- Java有返回值的多线程使用?
- Java中值类型和引用类型的区别(==与equals()的区别、Java中的引用类型:值引用与);
- Java中方法参数的传递时值传递还引用传递?
- Java中堆和栈的区别?
- JVM 内存划分与垃圾收集算法:fullGC与youngGC;
- Java JVM相关内容结合项目介绍;
- 线上如何排查JVM内存溢出问题?
1.可以通过idea进行远程debugger;
2.相关命令jstat、jmap、jconsole等;
3.相关的工具,如阿里的阿尔萨斯等; - 服务器CPU占用特别高,怎么查看(58),面试重点JVM及多线程;
- Array List是线程安全的吗?
- ConcurrentHash Map是如何实现线程安全的;
- Sychornized是否是公平锁;
- JVM为什么要增加元空间;
- Javam如何查看问题,并进行jvm调优;
- 堆G1垃圾收集器有了解么,有什么特点;
Mysql面试题:
- MysqlMVCC、MySQL为什么选择B+树作为它的存储结构,为什么不选择Hash、二叉、红黑树(58);
- 如果仅仅是select * from table where id =45,上面三种数据结构都可以实现,但是如果是select * from table where id <45;则它们的查找方式就类似于全表扫描。B+树只在最末端叶子节点存数据,叶子节点是以链表形式相互指向的;
- 为什么不选择Hash索引:Hash索引不适合范围查找,而B+树特别适合范围查找;Hash索引每次查询都需要加载所有的索引数据到内存中,而B+树只需要根据匹配规则选择对应的叶子数据加载即可;
- Mysql如何写sql才能提高sql的执行效率;
- Mysql数据库的事务与锁的理解;
- 数据库临时表有没有用过,是怎么用的?
- 添加索引的缺点?
- Mysql的最左原则;
- Mysql的锁:两条sql语句分别执行如下:
sql1:更新数据的ID between 10 and 20 ;
sql2:更新数据的ID为11;
那么这个锁是如何保证11这条数据不被更新的呢? - Mysql的sql优化
1、Mysql使用过程中走索引的语句;
2、索引的优化
3、亿级的数据必须使用like进行查询,如何优化
- 多数据源情况下如何进行事物的管理;
- Union和union all有什么区别;
- dateTime和timestamp有什么区别;
- mysql数据库事务的几种形式,模式事务级别,Oracle、SQL server默认事务级别;
读未提交;
读已提交;
不可重复读;
可序列化; - mysql主从模式的实现;
- 如何解析sql语句;即explain关键字的使用;
- Select_type:查询类型,是简单查询还是复核查询;
- Type:对表的访问类型:All、index、range、ref、eq_ref、const、system、null;从左到右,性能从差到好;
- Possible_keys:指出mysql能使用按个索引在表中找到记录;
- Key:该列显示mysql实际使用的索引;
- Filtered:按表条件过滤行的百分比;
- Extra:执行情况的描述和说明;
- 为什么不对mysql的所有表都添加索引?
- Mysql索引为什么不用hash而用B+树;Hash的时间复杂度是多少;
- B+树索引可以进行范围查询吗,比如大于小于;
- 应用种mysql是集群还是单节点,最大表数据量是多少;
- Mysql的主从同步原理,mysql主从复制主要有几种模式;
- Mysql主库在事务提交时会把数据库变更作为事件event记录在二进制文件binlog中;mysql主库上的sys_binlog控制binlog日志刷新到磁盘;
- 主库推送二进制文件binlog中的事件到从库的中继日志relay log,知乎从库根据中继日志重做数据库变更操作。通过逻辑复制,以此来达到数据一致。
- Mysql通过三个线程来完成主从库之间的数据复制:其中binLog Dump线程泡在主库上,I/O线程和SQL线程泡在从库上。当从库启动复制时,首先创建一个I/O线程连接主库,主库随后创建binlog dump线程读取数据库时间并发送给I/O线程,I/O线程获取到数据库事件更新到从库的中继日志realy log中,之后从库上的sql线程读取中继日志relay log中更新的数据库事件并应用;
Mysql主从复制主要有三种模式:
- 基于sql语句的复制(statement-based replication,SBR);
- 基于行的复制(row-based replication,RBR);
- 混合模式复制(mixed-based replication,MBR);
Java框架相关:
- RabbitMQ的使用;
- Zookeeper的原理,什么情况下会使用zookeeper,zookeeper如何监听生成的节点,zk内部是如何实现的;
- Springcloud eureka是如何注册服务、如何监测心跳的,它注册的流程是怎么样的;
- Redis在项目中是如何使用的;
- 在分布式环境中如何快速发现某一台服务有问题;
- Mysql中如何设置一个字段为自增的;
- 分布式集群系统对外提供接口的时候如何验证对方的身份;
- Spring boot整合jsp的流程,需要注意哪些点;
- Eureka和zookeeper作为注册中心有什么区别(58);
- CAP理论:一致性(consistency)、可用性(Aviailability)、分区容错性(Partition tolerance)三者只能满足其二;
- CA:不是分布式架构,就使用这种,关系数据库按照CA进行设计,放弃分区容错性,因为没有分区;
- AP:加强可用性和分区容错性,放弃立即一致性(强一致性),追求最终一致性。比如eureka;比如微信提现,提示两小时到账,而不是马上到账;
- CP:强调强一致性和分区容错性,放弃可用性,比如zookeeper,master在宕机后进行选举leader期间服务不饿能提供;比如夸张转账,就是立即到账,你这边转出,那边收进,才任务一个事务完成;
- 由于ZK采用的时cp原则,所以其可用性降低,这是致命的问题,springcloud集成的eureka采用的是ap原则,牺牲了一致性,但是保证了可用性;
- Zookeeper0、zookeeper1、zookeeper2,三个节点的集群描述一下从zk启动,到zk对外提供服务的整个过程(58);
- Zookeeper集群leader的选举;
- 服务器初始化阶段和服务器运行期间leader挂掉情况选举机制大体相同,此处仅对服务器初始化启动期间进行说明;
- 先后启动两台服务器,启动后两台服务器进行通信,每台服务器都试图找到lead,于是进入leader选举过程,过程如下:
- 每个server发出一个投票,由于初始概况,server1和server2都会将自己作为leader服务器来进行投票,每次投票都会包含所推举的服务器的myId和ZXID,使用(myid,ZXID)来表示,此时server1的投票为(1,0),server2的投票为(2,0),然后各自将这个投票发给集群中的其他机器。
- 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票,是否来自lookiing状态的服务器。
- 处理投票:针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,pk规则如下:
优先检查ZXID。ZXID比较大的服务器优先作为leader。
如果ZXID相同,那么就比较myid。Myid比较大的服务作为leader服务器。 - 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受相同的投票信息,对于server1,server2而言,都统计出集群中已经有两台机器接受了(2,0)的投票信息,此时便认为已经选举出了leader;
- 改变服务器状态。一旦确定了leader,每个服务器就会更新自己的状态,如果是follower,就会变成Followiing,如果是leader,就会变成Leading。
- Zookeeper数据同步;
- Zookeeper对外提供服务;
- 有一个key,往zk写入,到写入成功它的大体过程是什么样的(58);
- 此处有一个客户端client和zookeeper服务器;
- Client向zookeeper的某一个server上写数据,发送一个写请求;
- 如果server1不是leader,那么server1会把接收到的请求进一步转发给leader,印美每个zookeeper集群里有一个是leader,这个leader会将写请求广播给各个server;各个server写陈工后就会通知leader;
- 当leader收到大多数server(超过一半)数据写成功了,那么就说明数据写成功了,如果是三个节点的话,只要有两个节点数据写成功了,那么就默认数据写陈工l ,写成功之后,leader会告诉server1数据写成功了。
- Server1会进一步通知client数据写成功了,这时就认为整个写操作成功;
- Zookeeper监听器的原理;
- 首先要由一个main()线程;
- 在main线程中创建zookeeper客户端,这是就会创建两个线程,一个负责网络连接通信,一个负责监听;
- 通过connect线程将注册的监听事件发送给zookeeper。
- 在zookeeper的注册监听器列表中将注册的监听时间添加到列表中。
- Zookeeper监听到有数据或路径变化,就会将这个消息发送给listener线程。
- listener线程内部调用了process方法;
- 排行榜功能的实现:使用redis的zset;zset的底层数据结构是什么样的;除了redis的zset还有什么其他的数据结构可以实现这个功能;
- Redis的zset底层实现是跳跃表,跳跃表的底层实现是链表+索引(如上图),具体详情请点 https://www.jianshu.com/p/dc252b5efca6
- Sychronized和ReentryLock的区别(重点:底层实现的区别);
区别:1、2、3、4:Sychronized底层是unsafe方法、ReentryLock底层是(AQS); - Redis集群种类:主从模式、cluster模式及其应用;
- Redis种数据类型及应用场景;
- Redis的使用场景及存储格式;redis的持久化;RDB与AOF的设置,redis种哪个版本开始可以进行分布式的使用;
- Redis默认持久化方式为RDB:有三个策略:save 900 1\save 300 10\save 60 10000;
- AOF默认是关闭的;
- Nginx如何做限流?令牌桶算法与漏桶算法;
- Tomcat调优;
- 为什么使用RPC框架,什么时候会使用http请求;
- 什么场景下会使用MQ;MQ的优势与劣势,什么时候不能用MQ(MQ做不到同步);
- Springcloud组件介绍;
Linux服务器:
- Linux如何查看应用占用内存情况;
- Linux脚本编写会么;
- 线上应用的debugger;
idea有插件,可以远程链接服务器的代码,并在本地debugger;
其他工具:pingpoint(分布式性能监测工具); - 服务器CPU数量及线程池数量的关系;
1、服务器cpu数量(n);
2、是IO密集型(2n个线程)应用还是计算密集型(n+1个线程)应用;
算法题:
- 将一个矩阵顺时针旋转90°,请写出伪代码;
A11,A12,A13, A31,A21,A11,
A21,A22,A23, ——顺时针旋转90°——》 A32,A22,A22,
A31,A32,A33, A33,A23,A13,
(行,列)
第i行第j列——》第(j)行第(n-i)列;
- 输入:a boy is good ,输出:good is boy a ;
- 链表:1->2->3->4->5;请写一个程序,将链表反转过来:5->4->3->2->1;
综合考察:
- 如何做一个秒杀系统;
1、MQ做限流:保证只有1000个人可以访问系统;
2、使用redis做缓存;
3、redis往mysql中进行持久化
如何实现高可用、高并发、高吞吐的技术方案?
高并发:应用缓存、HTTP缓存、多级缓存、池化、异步并发、扩容、队列;
高吞吐:分布式集群;
高可用:负载均衡与反向代理(nginx)、隔离(hystrix)、限流(MQ/nginx)、降级(hytrix)、超时与重试(hystrix)、回滚(hystrix);
- A给B发请求,B执行往数据库insert的操作;设计一个架构,保证能够提供最大的并发量,架构如下:
- 分布式锁:
Redis实现方式:
redis:为什么使用setnx,或者说set 和setNx有什么区别;
setNx:系统在10:05 设置一个值,并给出5分钟的过期时间,系统刚刚set完之后redis集群崩溃,10:11分系统重启成功,那么redis中set的值是否还存在?
考察点:
1、redis 的持久化:刚set完是否能够被持久化到快照或者binlog日志中;
2、假设redis被持久化,且系统重启时间超过了redis设置的过期时间,那么key是否会被清理;
zookeeper实现方式:
- 缓存数据如何同DB同步更新?(mysql读取redis的binlog,进行数据的更新操作)
其他:
- 处于什么目的考PMP;
- 一个项目启动大会,大概是一个什么过程?
1.介绍项目启动;
2.任命项目经理;
3.宣布项目正式启动; - 对于自己来说,最近接触的比较新的东西或者知识;JVM、python;
- Python2和python3的区别(因为我上一个回答了python,所以这里会问);
- 对自己开发的系统的服务器硬件的了解;
- 在什么应用场景下需要升级服务器配置,什么场景下需要扩充集群;