java⾯试题_有赞⼆⾯(1)_java⾯经汇总
题⽬来⾃⽜客,  题的答案都是我个⼈理解的或⽹上的参考,仅仅只作为复习⽤.因个⼈⽔平有限,不合理的地⽅请多多指正.
9.21 ⼆⾯
介绍实习情况
MySQL查询优化
建⽴合适的索引,  不要使⽤*来查询 .  使⽤limit来限制查数量  避免索引失效的查⽅式,  对联合索引使⽤最左匹配,. 尽量使⽤inner join 等......
查询不⾛索引有哪些情况,为什么
1 in, 2个及以上参数 ,单列索引a, where a in (xxxx) ,如果参数是1个会⽤到索引,如果参数是2个及以上不会⽤到索引(包括int和varchar类型的字段)
2  使⽤%前缀模糊查询 like '%abc' 或者 like‘%abc%’
3  where⼦句中对字段进⾏函数操作  where num/2=100 或者 substring(a,1,3)='ab'或者age+10=30
4 where id !=2 或者 where id <> 2
5 where name is null
6 not in ,单列索引a ,where a not in (xxxxx) ,不管⾥⾯是⼀个还是多个参数都⽤不到a的索引(包括int和varchar类型的字段)
7 字符类型的字段与数字⽐较
8 多列索引中没有最左匹配
9 在 where ⼦句中使⽤ or 来连接条件
索引数据结构介绍,和B+树区别
数据库索引,是数据库管理系统中⼀个排序的数据结构,主要有
B树索引、Hash索引两种
哈希索引就是采⽤⼀定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶⼦节点逐级查,只需⼀次哈希算法即可⽴刻定位到相应的位置,速度⾮常快。
哈希索引缺点  Hash索引只⽀持等值⽐较, Hash 索引⽆法被⽤来避免数据的排序操作,Hash 索引不⽀持多列联合索引的最左匹配规
则,Hash索引在任何时候都不能避免表扫描
mysql中⽤的最多是B+树,
B+树的特征:
1.有k个⼦树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只⽤来索引,所有数据都保存在叶⼦节点。
2.所有的叶⼦结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶⼦结点本⾝依关键字的⼤⼩⾃⼩⽽⼤顺序链接。
3.所有的中间节点元素都同时存在于⼦节点,在⼦节点元素中是最⼤(或最⼩)元素。
B+树的优势:
1.单⼀节点存储更多的元素,使得查询的IO次数更少。
2.所有查询都要查到叶⼦节点,查询性能稳定。
3.所有叶⼦节点形成有序链表,便于范围查询。
什么情况下可以不回表查询
这先要从InnoDB的索引实现说起,InnoDB有两⼤类索引:
聚集索引(clustered index)
普通索引(secondary index)
**InnoDB聚集索引和普通索引有什么差异? **
InnoDB 聚集索引 的叶⼦节点存储⾏记录,因此, InnoDB必须要有,且只有⼀个聚集索引:
(1)如果表定义了PK,则PK就是聚集索引;
(2)如果表没有定义PK,则第⼀个not NULL unique列是聚集索引;
(3)否则,InnoDB会创建⼀个隐藏的row-id作为聚集索引;
InnoDB 普通索引 的叶⼦节点存储主键值。
mysql执⾏sql前会执⾏sql优化、索引选择等操作,mysql会预估各个索引所需要的查询代价以及不⾛索引所需要的查询代价,从中选择⼀个mysql认为代价最⼩的⽅式进⾏sql查询操作。⽽在回表数据量⽐较⼤时,经常会出现mysql对回表操作查询代价预估代价过⼤⽽导致索引使⽤错误的情况。
回表查询 ,需要扫码两遍索引树 ,先定位主键值,再定位⾏记录,它的性能较扫⼀遍索引树更低。
怎么避免? 不是必须的字段就不要出现在SELECT⾥⾯。或者b,c建联合索引。但具体情况要具体分析,索引字段多了,存储和插⼊数据时的消耗会更⼤。这是个平衡问题。
MySQL事务隔离级别
SQL 标准定义了四个隔离级别:
READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻⽌脏读,但是幻读或不可重复读仍有可能发⽣。
REPEATABLE-READ(可重复读): 对同⼀字段的多次读取结果都是⼀致的,除⾮数据是被本⾝事务⾃⼰所修改,可以阻⽌脏读和不可重复读,但幻读仍有可能发⽣。
SERIALIZABLE(可串⾏化): 最⾼的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执⾏,这样事务之间就完全不可能产⽣⼲扰,也就是说,该级别可以防⽌脏读、不可重复读以及幻读。
隔离级别脏读不可重复读幻影读
READ-UNCOMMITTED√√√
READ-COMMITTED×√√
REPEATABLE-READ××√
SERIALIZABLE×××
为什么选择Redis做缓存
由于redis访问速度块、⽀持的数据类型⽐较丰富,所以redis很适合⽤来存储数据,另外结合expire,我们可以设置过期时间然后再进⾏缓存更新操作
数据库和缓存的数据⼀致性怎么保证
正常的缓存步骤是:
1、查询缓存数据是否存在
2、不存在即查询数据库
3、将数据添加到缓存同时返回结果,
4、下⼀次访问发现缓存存在即直接返回缓存数据。
先淘汰后写数据库vs先写数据库后淘汰
先写后淘汰,如果淘汰失败,cache⾥⼀直是脏数据
先淘汰后写,下次请求的时候缓存就会miss hit⼀次,这个代价是可以忽略的,(如果淘汰失败return false)
缓存淘汰级制保证⼀致性.先淘汰缓存再写数据库,下次请求直接从数据库取然后再写在缓存⾥。
Redis为什么是单线程的
1. 单线程编程容易并且更容易维护;
2. Redis 的性能瓶颈不再 CPU ,主要在内存和⽹络;
3. 多线程就会存在死锁、线程上下⽂切换等问题,甚⾄会影响性能。
4. 虽然说 Redis 是单线程模型,但是, 实际上,Redis 在 4.0 之后的版本中就已经加⼊了对多线程的⽀持。
5. 引⼊多线程主要是为了提⾼⽹络 IO 读写性能
Redis数据结构
1. string 数据结构是简单的 key-value 类型,⼀般常⽤在需要计数的场景,⽐如⽤户的访问次数、热点⽂章的点赞转发数量等等。
2. list 即是 链表。链表是⼀种⾮常常见的数据结构, 应⽤场景: 发布与订阅或者说消息队列、慢查询。
关系运算符有哪些3. hash 类似于 JDK1.8 前的 HashMap,内部实现也差不多(数组 + 链表) ,应⽤场景: 系统中对象数据的存储。
4. set 类似于 Java 中的 HashSet 。Redis 中的 set 类型是⼀种⽆序集合, 应⽤场景: 需要存放的数据不能重复以及需要获取多个数据
源交集和并集等场景
spring事务的实现5. sorted se:  和 set 相⽐,sorted set 增加了⼀个权重参数 score,使得集合中的元素能够按 score 进⾏有序排列 ,应⽤场景: 需要
对数据根据某个权重进⾏排序的场景。⽐如在直播系统中,实时排⾏信息包含直播间在线⽤户列表,各种礼物排⾏榜,
Redis持久化策略
Redis 的⼀种持久化⽅式叫快照(snapshotting,RDB),另⼀种⽅式是只追加⽂件(append-only file, AOF)
快照(snapshotting,RDB)
Redis 可以通过创建快照来获得存储在内存⾥⾯的数据在某个时间点上的副本。快照持久化是 Redis 默认采⽤的持久化⽅式
AOF(append-only file)持久化
与快照持久化相⽐,AOF 持久化 的实时性更好,因此已成为主流的持久化⽅案。默认情况下 Redis 没有开启 AOF(append only file)⽅式的持久化,可以通过 appendonly 参数开启:
Redis集模式
为了避免单台服务器故障,通常的做法是将数据库复制多个副本以部署在不同的服务器上,这样即使有⼀台服务器出现故障,其他服务器依然可以继续提供服务。为此, Redis 提供了复制(replication)功能,可以实现当⼀台数据库中的数据更新后,⾃动将更新的数据同步到其他数据库上。
  在复制的概念中,数据库分为两类,⼀类是主数据库(master),另⼀类是从数据库(slave)。主数据库可以进⾏读写操作,当写操作导致数据变化时会⾃动将数据同步给从数据库。⽽从数据库⼀般是只读的,并接受主数据库同步过来的数据。⼀个主数据库可以拥有多个从数据库,⽽⼀个从数据库只能拥有⼀个主数据库。
哨兵模式
  第⼀种主从同步/复制的模式,当主服务器宕机后,需要⼿动把⼀台从服务器切换为主服务器,这就需要⼈⼯⼲预,费事费⼒,还会造成⼀段时间内服务不可⽤。这不是⼀种推荐的⽅式,更多时候,我们优先考虑哨兵模式。
  哨兵模式是⼀种特殊的模式,⾸先Redis提供了哨兵的命令,哨兵是⼀个独⽴的进程,作为进程,它会独⽴运⾏。其原理是哨兵通过发送命令,等待Redis服务器响应,从⽽监控运⾏的多个Redis实例。
哨兵挂了怎么办(所以哨兵应该也是集)
mysql面试题sql优化哨兵是redis集架构中⾮常重要的⼀个组件,主要功能如下:
1. 集监控:负责监控redis master和slave进程是否正常⼯作
2. 消息通知:如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
3. 故障转移:如果master node挂掉了,会⾃动转移到slave node上
update是什么意思哦4. 配置中⼼:如果故障转移发⽣了,通知client客户端新的master地址
哨兵的核⼼知识
1. 故障转移时,判断⼀个master node是宕机了,需要⼤部分的哨兵都同意才⾏,涉及到了分布式选举的问题
2. 哨兵⾄少需要3个实例,来保证⾃⼰的健壮性
3. 哨兵 + redis主从的部署架构,是不会保证数据零丢失的,只能保证redis集的⾼可⽤性
及时部分哨兵节点挂掉了,哨兵集还是能正常⼯作的,因为如果⼀个作为⾼可⽤机制重要组成部分的故障转移系统本⾝就是单点,那么就不靠谱。
Redis集选举master过程(这个不会,说了MySQL集的选主过程)
当slave发现⾃⼰的master变为FAIL状态时,便尝试进⾏Failover,以期成为新的master。由于挂掉的master可能会有多个slave,从⽽存在多个slave竞争成为master节点的过程, 其过程如下:
1.slave发现⾃⼰的master变为FAIL
2.将⾃⼰记录的集currentEpoch加1,并⼴播FAILOVER_AUTH_REQUEST信息
3.其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每⼀个epoch只发送⼀次ack
4.尝试failover的slave收集FAILOVER_AUTH_ACK
5.超过半数后变成新Master
6.⼴播Pong通知其他集节点。
MQ是怎么防⽌消息丢失的
消息丢失分为三种情况  ⽣产者丢失  mq⾃⼰丢失    消费则丢失
A:⽣产者丢失消息
①:可以选择使⽤rabbitmq提供是事物功能,就是⽣产者在发送数据之前开启事物,然后发送消息,如果消息没有成功被rabbitmq接收到,那么⽣产者会受到异常报错,这时就可以回滚事物,然后尝试重新发送;如果收到了消息,那么就可以提交事物。
try{
//发送消息
web开发三大主流框架}catch(Exection e){
//重新提交
}
缺点:rabbitmq事物已开启,就会变为同步阻塞操作,⽣产者会阻塞等待是否发送成功,太耗性能会造成吞吐量的下降。
②:可以开启confirm模式。在⽣产者哪⾥设置开启了confirm模式之后,每次写的消息都会分配⼀个唯⼀的id,然后如何写⼊了rabbitmq 之中,rabbitmq会给你回传⼀个ack消息,告诉你这个消息发送OK了;如果rabbitmq没能处理这个消息,会回调你⼀个nack接⼝,告诉你这个消息失败了,你可以进⾏重试。
B:rabbitmq⾃⼰弄丢了数据
设置消息持久化到磁盘。设置持久化有两个步骤:
①创建queue的时候将其设置为持久化的,这样就可以保证rabbitmq持久化queue的元数据,但是不会持久化queue⾥⾯的数据。
②发送消息的时候讲消息的deliveryMode设置为2,这样消息就会被设为持久化⽅式,此时rabbitmq就会将消息持久化到磁盘上。
必须要同时开启这两个才可以。
⽽且持久化可以跟⽣产的confirm机制配合起来,只有消息持久化到了磁盘之后,才会通知⽣产者ack,这样就算是在持久化之前rabbitmq 挂了,数据丢了,⽣产者收不到ack回调也会进⾏消息重发。
C:消费者弄丢了数据
使⽤rabbitmq提供的ack机制,⾸先关闭rabbitmq的⾃动ack,然后每次在确保处理完这个消息之后,在代码⾥⼿动调⽤ack。这样就可以避免消息还没有处理完就ack。
介绍⼀下线程池,线程池的线程数量取值应该怎么取,有使⽤过哪些线程池
线程池就是⾸先创建⼀些线程,它们的集合称为线程池。使⽤线程池可以很好地提⾼性能,线程池在系统启动时即创建⼤量空闲的线程,程序将⼀个任务传给线程池,线程池就会启动⼀条线程来执⾏这
个任务,执⾏结束以后,该线程并不会死亡,⽽是再次返回线程池中成为空闲状态,等待执⾏下⼀个任务。
降低资源消耗。
提⾼响应速度。
提⾼线程的可管理性。
线程数取值有两个⽅⾯:
1.CPU密集型
第⼀种是 CPU 密集型任务,⽐如加密、解密、压缩、计算等⼀系列需要⼤量耗费 CPU 资源的任务。
最佳线程数 = CPU 核⼼数的 1~2 倍
2.IO密集型
第⼆种任务是耗时 IO 型,⽐如数据库、⽂件的读写,⽹络通信等任务,这种任务的特点是并不会特别消耗 CPU 资源,但是 IO 操作很耗时,总体会占⽤⽐较多的时间。对于这种情况任务最⼤线程数⼀般
会⼤于 CPU 核⼼数很多倍
英语连读的英文3.通⽤公式
线程数 = CPU 核⼼数 * (1+ IO 耗时/CPU 耗时)
⽬前⽤的最多的是ThreadPoolExecutor线程池
如果使⽤⽆界等待队列会有什么问题
当线程在执⾏任务时需要调⽤远程服务,当调⽤远程服务异常时,就会导致线程处理每个任务都需要等待很长的时间;
处理任务的速度慢,产⽣任务的速度快,⽽任务队列是没有边界的,就会导致队列变得越来越⼤,从⽽导致内存飙升,还可能导致OOM内存溢出。
介绍⼀下锁

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。