面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试)

2023-05-16

YY欢聚时代一年多前去面试过一次,当时鄙视了,在现在的公司呆了1年半了,感觉做得很不爽,而且薪资又不满意,所以想找个新工作,就想去YY面试。

下面将两次YY面试的经历写出来,包括一次初试和一次复试的面试题目。

一、2015年11月21日上午初试的面试题如下:

 

1.   做一下自我介绍

画出正在做的B2B平台的架构图,包括各子系统(ec,buyer,seller,message,order)、SOA(dubbo)、缓存redis、消息rabbitmq、单点登陆CAS、负载均衡nginx,mysql数据库读写分离,邮件服务器postfix

2.   单点登陆的原理

https://blog.csdn.net/brushli/article/details/50612096

TGT(cookie)+ST

两种方式确保安全性

2.1 使用HTTP传输

2.2 设置http-only属性,防止通过JS脚本读取cookie信息,防止XSS脚本攻击。

https://www.cnblogs.com/ziyoublog/p/11389695.html

3.   如何防止cookie被盗用

3.1 重点信息最好不要保存在cookie中

比如密码,如果实在要存放在cookie,则可以对值进行加密,字段名称可以不要显示出有意义的字段,比如username=XXX,改成param1=md5(username)。

3.2 加密的内容可以与本地IP地址绑定

4.   Cookie和Session的区别

cookie保存在浏览器,在客户端;session保存在服务器。

Cookie类的setMaxAge( int expiry )

 * //expiry默认值为 -1;

 *      1.如果expiry大于0,则保存有效期为expire时间长度,单位毫秒;
 *      2.如果expiry等于0,则指示浏览器删除当前cookie;
*      3.如果expiry小于0,则指示浏览器不保存该cookie到硬盘,就保存在内存中,浏览器关闭就消失;  

5.   Session共享及其好处

集中式部署,数据共享,减少单点故障。

6.   Mysql主从数据同步的方式

binlog,MySQL 主从复制主要有以下几种方式:

6.1 基于 SQL 语句的复制(statement-based replication, SBR);

 SBR 的优点:历史悠久,技术成熟 binlog 文件较小

binlog 中包含了所有数据库更改信息,可以据此来审核数据库的安全等情况

binlog 可以用于实时的还原,而不仅仅用于复制

主从版本可以不一样,从服务器版本可以比主服务器版本高

6.2 基于行的复制(row-based replication, RBR);

6.3 混合模式复制(mixed-based replication, MBR);

基于 SQL 语句的方式最古老的方式,也是目前默认的复制方式,后来的两种是 MySQL 5 以后才出现的复制方式。

https://blog.csdn.net/ztianming/article/details/72876609

主从同步存在的问题:延时

存在的原因:存在大事务,比如数据归档任务

解决办法:监控参数Seconds_Behind_Master,当成是主从同步的延时时间,单位是秒。

7.   Spring 控制器的加载过程

web.xml--》context-param(加载配置文件applicationContext.xml)--》listener(监听对象,比如创建session)--》filter(监听编码和权限,针对url)--》Servlet(加载Controller)

8.   Spring 实例是单例还是多例?会不会有线程问题

spring默认是单例,可以配置是多例,在单例的情况下,会有多线程问题,比如在Controller中定义一个时间转换的全局变量。

9.   如何进行跨机房数据同步?如何保证数据访问的一致性

基于binlog,使用SQL进行数据同步,但会存在延时,网络延时可以达到20~30ms,执行SQL的时间依赖于是否存在大事务, 要做好监控。

10. 数据库索引有什么好处?

提高查询速度,避免全表扫描。

Mysql的innodb存储引擎使用B+树索引

B-树索引和B+树索引的主要区别是

(1)B-树索引可能不需要搜查到叶子结点就结束,但B+树索引一定是查找到叶子结点才结束。

(2)B+树索引的叶子结点存在一个指向相邻叶子结点的指针,方便做范围查找,提高区间查询效率。

聚簇索引和非聚簇索引

(1)聚簇索引的主索引文件和数据文件为同一份文件,聚簇索引主要用在Innodb存储引擎中。

(2)非聚簇索引就是指B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。

Mysql 索引:https://blog.csdn.net/brushli/article/details/39677387

11. Mysql如何查看执行计划?

sql前面添加explain,看是否中索引以及预估的扫描行数。

12. Mysql执行计划的的顺序

13. 如何查看Mysql中SQL执行的快慢?

14. SQL执行过程net和wait for table的区别?

15. IO与NIO的区别?NIO中select的原理?NIO缓冲区的默认大小?

IO面向数据流,并且是阻塞的;NIO面向缓冲区,并且是非阻塞的。

NIO先从Channel读取数据到缓冲区Buffer,随后在缓冲区中Buffer中处理数据。

Channel类型包括FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel

Buffer类包括JAVA七大数据类型,包括ByteBuffer、CharBuffer、DoubleBuffer、FloatBuffer、IntBuffer、LongBuffer、ShortBuffer、MappedByteBuffer,除了Boolean。

创建Selector--》向Selector注册通道--》注册事件SelectionKey(Connect、Accept、Read、Write)--》选择通道--》--》选择事件KEY

16. 使用什么数据库连接池?连接池的工作原理?常用连接池C3PO,proxool与JNDI的区别?

使用连接池:HiKariCP

阿里Druid:CopyOnWriteArrayList

DBCP:LinkingBlockingQueue,无论是空闲连接还是已使用的连接,都是存放加锁的ConcurrentHashMap或LinkedBlockingDeque中,并发量低,性能不好,适用于小型系统。从数据库获取连接的过程中还加了synchronized同步锁,如果网络容易中断的场景下,一旦与数据库建立的网络出现问题,容易导致死锁。

HikariCP:ThreadLocal、CAS、CopyOnWriteArrayList

17. 缓存redis如何应对系统崩溃后的快照问题?

redis提供两种将内存数据导出到硬盘实现数据备份的方法:

(1)RDB方式(默认)

save 300 10   # 300秒内有至少10个键被更改则进行快照

将内存数据通过压缩后写入dump.rdb文件中,redis重启后,会从快照文件dump.rdb中读取数据进入内存。

生成快照时,是会阻塞redis其他操作的。如果redis挂掉,最后一次快照之后的数据会丢失,需要通过AOF方式补充。

(2)AOF方式(append only file)

# appendfsync always   # 每次执行写入都会执行同步,最安全也最慢
# appendfsync everysec   # 每秒执行一次同步操作
# appendfsync no       # 不主动进行同步操作,而是完全交由操作系统来做(即每30秒一次),最快也最不安全
Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易。此时重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少

18. Redis的默认键大小是多少?

redis的key和string类型value限制均为512MB。

19. 线程中sleep与wait的区别?

(1)属于不同的两个类,sleep()方法是线程类(Thread)的静态方法,wait()方法是Object类里的方法。

(2)sleep()方法不会释放锁,wait()方法释放对象锁。

(3)sleep()方法可以在任何地方使用,wait()方法则只能在同步方法或同步块中使用。

(4)sleep()使线程进入阻塞状态(线程睡眠),wait()方法使线程进入等待队列(线程挂起),也就是阻塞类别不同。

20. Restful与dubbo的对比?

(1)Restful

(2)Dubbo

Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况。集群方式包括Mutilcast、Zookeeper、Redis和Simple,负载均衡方式包括随机、按权重、最少活跃优先和一致性Hash。

缺点:只支持JAVA、不适合传数据量大的服务调用,比如传文件。

dubbo 支持不同的通信协议

1)默认就是走 dubbo 协议,单一长连接,进行的是 NIO 异步通信,基于 hessian 作为序列化协议。

2)rmi 协议

走 Java 二进制序列化,多个短连接,适合消费者和提供者数量差不多的情况,适用于文件的传输,一般较少用。

3)hessian 协议

走 hessian 序列化协议,多个短连接,适用于提供者数量比消费者数量还多的情况,适用于文件的传输,一般较少用。

4)http 协议

走 json 序列化。

5)webservice 协议

走 SOAP 文本

6)Thrift 协议

TCP、HTTP

https://blog.csdn.net/oBuShanQing/article/details/89816304

7)memcached 协议

8)redis 协议

9)rest ( 就是 RestFull)

https://blog.csdn.net/xiaojin21cen/article/details/79834222?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

二、2015年11月25日下午复试的题目

1.IO和NIO的区别和原理?

(1)    IO是面向流的,NIO是面向缓冲区的

Java IO面向流意味着每次从流中读一个或多个字节,直至读取所有字节,它们没有被缓存在任何地方。此外,它不能前后移动流中的数据。如果需要前后移动从流中读取的数据,需要先将它缓存到一个缓冲区。 Java NIO的缓冲导向方法略有不同。数据读取到一个它稍后处理的缓冲区,需要时可在缓冲区中前后移动。这就增加了处理过程中的灵活性。但是,还需要检查是否该缓冲区中包含所有您需要处理的数据。而且,需确保当更多的数据读入缓冲区时,不要覆盖缓冲区里尚未处理的数据。

(2)    阻塞与非阻塞IO

Java IO的各种流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。 Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,但是它仅能得到目前可用的数据,如果目前没有数据可用时,就什么都不会获取。而不是保持线程阻塞,所以直至数据变的可以读取之前,该线程可以继续做其他的事情。 非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不需要等待它完全写入,这个线程同时可以去做别的事情。 线程通常将非阻塞IO的空闲时间用于在其它通道上执行IO操作,所以一个单独的线程现在可以管理多个输入和输出通道(channel)。

(3)    使用单线程Selector来管理多个通道,减少系统开销

2. NIO中select的实现机制

(1)  创建Selector

(2)  向Selector注册通道

(3)  SelectionKey

(4)  通过Selector选择通道

(5)  wakeup

(6)  close()

3.多线程中syschronize、volitile、lock的区别和应用

1ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了锁投票,定时锁等候和中断锁等候
     线程AB都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定,
     如果使用 synchronized ,如果A不释放,B将一直等下去,不能被中断
     如果使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情
 
    ReentrantLock
获取锁定与三种方式:
    a)  lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
    b) tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false
    c)tryLock(long timeout,TimeUnit unit)   如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false
    d) lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断
 
2
synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}
 
3
、在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;

4.乐观锁和悲观锁的区别?

悲观锁是认为读取数据时别人会去修改数据,因此需要给数据加锁,直到 当前对数据的操作完成,才释放锁,数据再给其他人使用。悲观锁适用于数据修改比较频繁场景,但悲观锁的并发量小。在JAVA程序中,通常使用synchronized同步关键字来实现悲观锁,在数据库比如MYSQL、ORACLE中通常使用行级锁、表锁来实现悲观锁。

乐观锁是认为读取数据时别人不会去修改数据,因此不会给数据加锁,在修改数据时,通过版本号来判断数据是否已修改过,如果未修改过,则直接修改,否则不修改,重做或直接失败。乐观锁适用于读多写少的场景,并发量大,但失败重试的成本高。在JAVA程序中,通常使用CAS(Compare and swap比较并交换)来实现乐观锁,在数据库比如MYSQL、ORACLE中通常使用版本号或时间戳而非加锁的方式来实现乐观锁。

5.数据库中事务的级别

1.    读未提交

2.    读已提交

3.    可重复读

4.    读序列化

6. 数据库行级锁的应用,修改一条记录时是否会加上行级锁

行级锁的优点有:
 在很多线程请求不同记录时减少冲突锁。
 事务回滚时减少改变数据。
 使长时间对单独的一行记录加锁成为可能。

行级锁的缺点有:
 比页级锁和表级锁消耗更多的内存。
 锁是计算机协调多个进程或线程并发访问某一资源的机制,不同的数据库的锁机制大同小异。由于数据库资源是一种供许多用户共享的资源,所以如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。了解锁机制不仅可以使我们更有效的开发利用数据库资源,也使我们能够更好地维护数据库,从而提高数据库的性能。

上述三种锁的特性可大致归纳如下:
1) 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
2) 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
3) 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

     三种锁各有各的特点,若仅从锁的角度来说,表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用,如WEB应用;行级锁更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用,如一些在线事务处理(OLTP)系统。

/* ==================== MySQL InnoDB 锁表与锁行 ======================== */

由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。

7.Spring事务的实现方式和实现原理

(1)事务实现方式

          a.配置文件中配置要添加事务的Service和方法

          b.在方法的头部添加注解@Transactional

          c.写代码实现

(2)事务实现原理

动态代理+ThreadLocal变量

代理:A对象通过代理对象B控制对象C,但每个对象都要去生成一个代理对象。

动态代理:动态调用

Java实现动态代理模式有两种方法:

1)实现接口InvocationHandler

2)使用cglib

8.Spring AOP的实现

AOP实现原理:aop是通过cglib的动态代理实现的。

jdk动态代理:利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。

区别:JDK动态代理只能对实现了接口的类生成代理,而不能针对类 。CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法 。因为是继承,所以该类或方法最好不要声明成final ,final可以阻止继承和多态。

9.HTTP长连接和短连接的区别

TCP/IP

TCP/IP是个协议组,可分为三个层次:网络层、传输层和应用层。

在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。

在传输层中有TCP协议与UDP协议。

在应用层有:TCP包括FTP、HTTP、TELNET、SMTP等协议

                 UDP包括DNS、TFTP等协议

短连接

连接->传输数据->关闭连接

HTTP是无状态的,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。

也可以这样说:短连接是指SOCKET连接后发送后接收完数据后马上断开连接。

 

长连接

连接->传输数据->保持连接 -> 传输数据-> 。。。 ->关闭连接。

长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差。

 

http的长连接

HTTP也可以建立长连接的,使用Connection:keep-alive,HTTP 1.1默认进行持久连接。HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的。

 

什么时候用长连接,短连接?

 长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况,。每个TCP连接都需要三步握手,这需要时间,如果每个操作都是先连接,再操作的话那么处理速度会降低很多,所以每个操作完后都不断开,次处理时直接发送数据包就OK了,不用建立TCP连接。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。

 

而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。

 

总之,长连接和短连接的选择要视情况而定。

10.Spring事务的种类和各自的区别

 propagation传播属性的值

(1)REQUIRED:默认值,业务方法需要在一个事务中运行。如果方法运行时,已经在一个事务中,那么加入到该事务,否则自己创建一个新的事务。一般spring默认都是这种事务,像保存,删除,修改等都是这种事务。

(2)SUPPORTS:如果方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。

(3)MANDATORY:该属性指定业务方法必须在一个事务中运行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器会抛出例外。

 (4)REQUIRES_NEW:属性不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先事务才会恢复执行。内部事务独立于外部事务。外部事务如果在执行过程中出现异常,不会影响内部事务回滚;内部事务如果执行过程中出现异常导致回滚,看程序中是否会抛出让外部事务回滚的异常,如果有抛出,外部事务会回滚,否则不会影响外部事务的执行。

 (5)NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会执行。

 (6)NEVER:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。

 (7)NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中,如果没有活动事务,则按Required属性执行,它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务是外部事务的子事务,外部事务结束了,内部事务才能提交,如果外部事务出现回滚,则内部事务也会进行回滚;如果内部事务出现异常导致回滚,则要看有没抛出让外部事务回滚的异常,如果有抛出,则外部事务也会回滚,如果没抛出,则外部事务不会回滚。

REQUIRES_NEW与NESTED的区别在于,REQUIRES_NEW的内部事务独立于外部事务,但外部事务可能会受内部事务的影响;NESTED是内部事务受外部事务影响,外部事务回滚会导致内部事务也出现回滚,外部事务也可能受到内部事务的影响。

11.Redis的集群方式,主点挂掉后如何将备点切换成主点

(1)主从集群

主点挂掉后修改备点的配置,

slaveof 127.0.0.1 6379 

哨兵模式
当主服务器中断服务后,可以将一个从服务器升级为主服务器,以便继续提供服务,但是这个过程需要人工手动来操作。 为此,Redis 2.8中提供了哨兵工具来实现自动化的系统监控和故障恢复功能。哨兵的作用就是监控Redis系统的运行状况。它的功能包括以下两个。

1)监控主服务器和从服务器是否正常运行。    

2)主服务器出现故障时自动将

(2)Redis Cluster 虚拟槽分区集群

key--》CRC16--》对16384取余数--》找到对应的slot下标--》找到slot对应的节点--》跳转到对应的节点。

redis的哨兵模式基本已经可以实现高可用,读写分离 ,但是在这种模式下每台redis服务器都存储相同的数据,很浪费内存,所以在redis3.0上加入了cluster模式,实现的redis的分布式存储,也就是说每台redis节点上存储不同的内容。
Redis-Cluster采用无中心结构,它的特点如下:
所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。
节点的fail是通过集群中超过半数的节点检测失效时才生效。
客户端与redis节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
工作方式:
在redis的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是cluster,可以理解为是一个集群管理的插件。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
为了保证高可用,redis-cluster集群引入了主从模式,一个主节点对应一个或者多个从节点,当主节点宕机的时候,就会启用从节点。当其它从节点ping一个主节点A时,如果半数以上的从节点与A通信超时,那么认为主节点A宕机了。如果主节点A和它的从节点A1都宕机了,那么该集群就无法再提供服务了。

Redis Cluster是一种服务器Sharding技术,3.0版本开始正式提供。Redis Cluster中,Sharding采用slot(槽)的概念,一共分成16384个槽,这有点儿类pre sharding思路。对于每个进入Redis的键值对,根据key进行散列,分配到这16384个slot中的某一个中。使用的hash算法也比较简单,就是CRC16后16384取模。Redis集群中的每个node(节点)负责分摊这16384个slot中的一部分,也就是说,每个slot都对应一个node负责处理。当动态添加或减少node节点时,需要将16384个槽做个再分配,槽中的键值也要迁移。当然,这一过程,在目前实现中,还处于半自动状态,需要人工介入。Redis集群,要保证16384个槽对应的node都正常工作,如果某个node发生故障,那它负责的slots也就失效,整个集群将不能工作。为了增加集群的可访问性,官方推荐的方案是将node配置成主从结构,即一个master主节点,挂n个slave从节点。这时,如果主节点失效,Redis Cluster会根据选举算法从slave节点中选择一个上升为主节点,整个集群继续对外提供服务。这非常类似前篇文章提到的Redis Sharding场景下服务器节点通过Sentinel监控架构成主从结构,只是Redis Cluster本身提供了故障转移容错的能力。Redis Cluster的新节点识别能力、故障判断及故障转移能力是通过集群中的每个node都在和其它nodes进行通信,这被称为集群总线(cluster bus)。它们使用特殊的端口号,即对外服务端口号加10000。例如如果某个node的端口号是6379,那么它与其它nodes通信的端口号是16379。nodes之间的通信采用特殊的二进制协议。对客户端来说,整个cluster被看做是一个整体,客户端可以连接任意一个node进行操作,就像操作单一Redis实例一样,当客户端操作的key没有分配到该node上时,Redis会返回转向指令,指向正确的node,这有点儿像浏览器页面的302 redirect跳转。Redis Cluster是Redis 3.0以后才正式推出,时间较晚,目前能证明在大规模生产环境下成功的案例还不是很多,需要时间检验。

(3)一致性哈希集群

jedis客户端取哈希映射到节点。

(4)Twemproxy代理

12.Mysql的集群方式,主备的数据同步方式,主库挂掉后如何切换从库为主库,有没做过两主两备的集群?

(1)主从,主库挂掉后,人工操作备库切换成主库

(2)哨兵,主库挂掉后,从库自动切换成主库

(3)redis Cluster,去中心化,主结点挂掉后,选举产生一个从节点成为主节点。

13.如何分析一条慢查询的SQL,MYSQL执行计划的类别(all Table,using index,using where)

explain select * from ....

explain执行计划包含的信息

这里写图片描述

其中最重要的字段为:id、type、key、rows、Extra

1)id

id相同:执行顺序由上至下 ;

id不同:如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 

id相同又不同(两种情况同时存在):id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行 

2)type
访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,好的sql查询至少达到range级别,最好能达到ref

https://blog.csdn.net/weixin_41558728/article/details/81704916

14.线程挂掉后,如何在虚拟机上分析。

(1)查看JVM参数 -XX:+HeapDumpOnOutOfMemoryError 和 -XX:HeapDumpPath及是否产生相关dump

使用JDK自带的工具jhat进行分析,查出占用内存比较多的对象。

(2)

15.CAP一致性、可用性、分区容忍性,系统中是牺牲了哪一种。

(1)一致性

没有即时一致性,但追求数据的最终一致性

样例:主从读写分离

(2)可用性

几十台服务器提供服务。

(3)分区容忍性

数据库是主从。

16.Freemarker的缓存机制

17. Zookeeper的实现原理

https://www.cnblogs.com/look-look/p/12739008.html

 

三、HR面试

1.   个人的未来规划,偏技术还是偏管理?

2.   现在薪酬的组成,基本工资+补贴

3.   想离职的原因?

4.   期望的薪酬情况

个人问题

5.   社保和公积金的基数

基数按工资基数交,公积金的比率是公司交10%,个人交10%~12%

另外公司有四百多补贴

6.   入职后进入哪个团队?从事什么项目的开发?

 

四、个人面试总结

 

感觉很多技术问题答不上来,最终被鄙视了

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试) 的相关文章

随机推荐