1、char varchar使用场景?
char用于字段长度固定的数据,varchar用于长度不固定的数据
3、count(*) count(1) count(2) 的区别?
没有区别
explain可以解释sql有没有使用索引,也就是type
4、并发与并行?
并发不是同时
并行是同时
5、有了解过OAuth2.0么,说说你对OAuth2.0的理解?
OAuth引入授权层,分离两种不同的角色,客户端和资源持有者。资源所有者同意后,向客户端颁发令牌,客户端通过令牌请求数据。
OAuth2引入四种令牌:授权码,隐藏式,密码市,客户端凭证。
常用授权码:A网站携带网站ID请求B网站,B网站让用户登录,将授权码给A网站。A网站使用授权码向B网站获取令牌(需要携带客户端密钥),A网站获取到令牌。
6、RabbitMQ和其它消息队列,比如ActiveMQ,RocketMQ,Kafka有什么区别?
消息队列,主要用于解耦多个系统。异步,削峰(消费队列的速度是可控的)。缺点是系统复杂了,而且消息队列如果挂掉,整个系统都会卡住。
RocketMQ社区活跃度没有RabbitMQ高。
RabbitMQ延迟最低,吞吐量是W级,基于主从架构
RocketMQ延迟ms级,吞吐量10W级,分布式架构 ,mq功能较为完善。
Kafka 是大数据领域的实时计算、日志采集等场景。功能较为简单
7、Redis在你项目中的使用,为什么引入Redis?
性能极高 – Redis读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
8、谈谈Redis单线程模型和IO多路复用?
Redis使用单线程,可以避免上下文切换,效率最高。避免了线程切换、加锁等资源消耗
单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求。
使用epoll策略,实现哪些socket有通讯,处理那些socket、 高效。
9、Redis的大Key的问题,如果有个Value的大小是2M,会有什么问题么?最大支持的Value大小是多少?
没有问题,value最大是1G、
9.5 redis的事务操作?
redis使用Multi命令开启事物,使用exec命令提交事物。redis会在之后执行队列中所有的命令,并依次返回结果。
开启事务前,受用watch命令监视指定的key,如果key的值被其它redis客户端改变,则exec失败。
10、谈谈Redis集群,以及主从复制原理?
Redis主从复制可以根据是否是全量分为全量同步和增量同步。
全量复制:从服务器连接,发送同步命令,主服务器生成rdb文件并用缓冲区记录之后的写命令,rbd文件生成完后,向从服务器发送快照文件,从服务器接收到快照文件后删除旧数据,载入快照,接收主服务器缓冲区的写命令,从服务器完成快照载入,执行来自主服务器的缓冲区的写命令。
增量同步:从服务器正常工作时,接收主服务器的写操作。主服务器每执行一次写命令,就会向从服务器也发送写命令。
11、你知道Linux怎么查看当前的负载情况么?
uptime 1分钟,5分钟,15分钟
top查看实时负载。
12、你还知道其它的一些Linux命令么?cat、tail、vi、vim命令的区别,分别说一说?
cat filename 显示整个文件,创建文件。 cat f1 f2>f3
cat >f1
tail -f b.txt 实时刷新文件尾部,用于观察程序运行情况
vim一般用来编辑文件。vim是vi的升级版。
13、如果Linux下需要打开或者查看大文件,你会怎么做?
head和tail
14、谈谈Redis中缓存穿透的问题,以及解决的方法?
15、还有其它解决缓存穿透的方法么?布隆过滤器有了解过么?
布隆过滤器。
16、Redis中大面积的缓存失效,然后请求全部打到数据库,有什么解决方法?
离散时间
17、B Tree 和 B+ Tree的区别?
B+_TREE的非叶子节点没有指向数据的指针,这样可以将所有的非叶子节点载入内存。并且每个叶子节点都有指向下一个叶子节点的链接,方便从叶子节点遍历。便于根据索引排序。
B树每层都有数据。
B+的磁盘读写代价更低,B+tree的查询效率更加稳定。
B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效。
18、聊聊MySQL的底层索引结构,InnoDB里面的B+Tree?
为聚集索引(clustered index)和辅助索引。,聚集索引的B+Tree中的叶子节点存放的是整张表的行记录数据。辅助索引与聚集索引的区别在于辅助索引的叶子节点并不包含行记录的全部数据,而是存储相应行数据的聚集索引键,即主键。当通过辅助索引来查询数据时,InnoDB存储引擎会遍历辅助索引找到主键,然后再通过主键在聚集索引中找到完整的行记录数据。
19、MySQL中如果使用like进行模糊匹配的时候,是否会使用索引?一定不会用么?
mysql在使用like查询的时候只有使用后面的%,并且该字段的值区分度高的时候,才会使用到索引。
20、 #{}。因为 ${} 会导致 sql 注入的问题。
21、TCP和UDP区别?
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的
22、数据库三大范式?
每个列都不可拆分
非主键列完全依赖于主键而不是主键的一部分
非主键列只依赖于主键,不依赖于其他列。
23、mysql有关权限的表
user(允许连接到服务器的用户账号信息),db(账号在数据库的权限)
24、MyISAM索引与InnoDB索引的区别?
InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。
25、什么是脏读?幻读?不可重复读?
脏读是指一个事务读取到其他事务没有提交的数据。
不可重复读是指一个事务内多次根据同一查询条件查询出来的同一行记录的值不一致。
幻读是指一个事务内多次根据同一条件查询出来的记录行数不一致。
(读取未提交)读取已提交(可重复读)可串行化
Mysql 默认采用的 REPEATABLE_READ隔离级别
Read Uncommitted级别下,读取数据不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突
Read Committed级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
Repeatable Read级别下,读操作需要加共享锁,但是在事务提交之前并不释放共享锁,也就是必须等待事务执行完毕以后才释放共享锁。
SERIALIZABLE 是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。
26、MySQL数据库cpu飙升到500%的话他怎么处理?
当 cpu 飙升到 500%时,先用操作系统命令 top 命令观察是不是 mysqld 占用导致的,如果不是,找出占用高的进程,并进行相关处理。
如果是 mysqld 造成的, show processlist,看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行。找出消耗高的 sql,看看执行计划是否准确, index 是否缺失,或者实在是数据量太大造成。
一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降),等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。
也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等。
27、主从复制的作用?
主数据库出现问题,可以切换到从数据库。
可以进行数据库层面的读写分离。
可以在从数据库上进行日常备份。
28、MySQL主从复制工作原理?
在主库上把数据更高记录到二进制日志,记录了所有sql语句。
从库将主库的日志复制到自己的中继日志
从库读取中继日志的事件,将其重放到从库数据中。
29、事务?
事务是一组可靠操作的单元,具备ACID特性,原子性,一致性、隔离性和持久性。
30、分布式架构中,CAP定理?
C表示一致性,即用户看到的数据是一样的;A表示可用性,指总能找到一个可用的数据副本,P表示分区容错性,能容忍网络中断等故障。
只能选择 CP 或者 AP 架构。
31、分布式事务实现方式?
TCC:Try 阶段:尝试执行,完成所有业务检查(一致性),预留必需业务资源;Confirm 阶段:确认真正执行业务,不作任何业务检查;Cancel 阶段:取消执行,释放 Try 阶段预留的业务资源,Cancel 操作满足幂等性。
XA协议使用二阶段协议:第一阶段TM要求所有的RM准备提交对应的事务分支。第二阶段TM根据阶段1各个RM prepare的结果,决定是提交还是回滚事务。
MQ 事务:
基本流程如下:
第一阶段 Prepared 消息,会拿到消息的地址。
第二阶段执行本地事务。
第三阶段通过第一阶段拿到的地址去访问消息,并修改状态。消息接受者就能使用这个消息。
32、如何提升系统的并发能力?
垂直扩展:提升单机处理能力,增强单机硬件性能,提升单机架构性能,例如:使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间。
水平扩展:只要增加服务器数量,就能线性扩充系统性能。
图片服务器分离,HTML静态化。
33、水平拆分?
优点:不存在单库数据量过大、高并发性能瓶颈,提升系统稳定性
应用端改造小,不需要拆分模块
缺点:跨分片的事务性难以保证,数据扩展和维护难度加大
根据ID和时间区间划分。(缺点,热点数据成为瓶颈)
根据数值取模:有点,数据均匀,缺点:后期分片集群扩容时,需要迁移旧的数据。容易面临跨分片查询的复杂问题。容易面临跨分片查询的复杂问题。
跨分片事务难以保证,需要使用XA协议和二阶段提交。
跨节点关联查询 join 问题?
全局表,字段冗余,数据组装(二次查询),跨节点分页、排序、函数问题
升级配置和网络,读写分离、索引优化等,其次分库分表。
34、保证缓存和数据库的一致性?
先更新数据库,再更新缓存。
35、分布式数据库的主键?
UUID,或者结合数据库维护主键ID表
CREATE TABLE sequence
(
id
bigint(20) unsigned NOT NULL auto_increment,
stub
char(1) NOT NULL default ‘’,
PRIMARY KEY (id
),
UNIQUE KEY stub
(stub
)
)ENGINE = MyISAM;
36、在 Queue 中 poll()和 remove()有什么区别?
空队列remove会抛出异常。
37、哪些集合类是线程安全的?
hashtable ,vector,concorrectHashMap
38、守护线程?
守护线程不能用于去访问固有资源,比如读写操作或者计算逻辑。当线程只剩下守护线程的时候,JVM就会退出;
当主线程结束时,结束其余的子线程(守护线程)自动关闭,就免去了还要继续关闭子线程的麻烦。如:Java垃圾回收线程就是一个典型的守护线程
39、Callable和Runnable区别?
callable有返回值,可以抛出异常,runnable没有。
40、sleep和wait区别?
sleep有固定时间,wait可以没有,sleep不释放锁,wait释放。
41、创建线程池的方式?
Executors.newFixedThreadPool(3);Executors.newCachedThreadPool();
42、线程池都有哪些状态?
RUNNING、SHUTDOWN(不接受新任务)、STOP(不接收新任务,不处理已排队任务)、TIDYING、TERMINATED(彻底终止,执行完terminated方法后)。
43、线程池中 submit()和 execute()方法有什么区别?
submit方法有返回值,execute没有。
44、在 java 程序中怎么保证多线程的运行安全?
加锁。
45、ThreadLocal 是什么?有哪些使用场景?
线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。经典的使用场景是为每个线程分配一个 JDBC 连接 Connection。这样就可以保证每个线程的都在各自的 Connection 上进行数据库的操作,不会出现 A 线程关了 B线程正在使用的 Connection; 还有 Session 管理 等问题。
46、synchronized 底层实现原理?
47、synchronized 和 Lock 有什么区别?
synchronized是jvm层面实现的锁(非公平锁),Lock是一个接口,代码实现的(一段时间获取不到锁会超时)。
48、synchronized 和 ReentrantLock 区别是什么?
同上.ReentrantLock 唤醒需要使用signal和signalAll方法。
49、为什么使用克隆?怎么使用克隆?深拷贝和浅拷贝?
想对对象进行处理,又想保留原有数据。实现Cloneable接口,并重写clone方法。或者实现serializable接口。深拷贝复制对象值,浅拷贝复制对象引用。
50、tcp 为什么要三次握手,两次不行吗?为什么?
只有经过第三次握手,才能确保双向都可以接收到对方的发送的 数据。
51、网络层次?
物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。
52、spring? ioc?
IOC使用DI(依赖注入)方式实现。解耦合
53、spring 常用的注入方式有哪些?
resource,和autowire
54、spring 事务实现方式有哪些?
第一种:使用 TransactionTemplate 事务模板对象
第二种:使用 事务管理器 PlatformTransactionManager 对象
第三种:基于Aspectj AOP开启事务
第四种:基于注解的 @Transactional 的声明式事务管理
55、 spring 的事务隔离?
ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.另外四个与JDBC的隔离级别相对应
ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读
ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。
ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读外,还避免了幻像读。
56、如何实现跨域?
后端在接受到请求后确定响应后会在后端在接受到请求后确定响应后会在 Response Headers 中加入一个属性 Access-Control-Allow-Origin;
57、spring boot 有哪些方式可以实现热部署?
spring.thymeleaf.cache=false
spring-boot-devtools
58、spring cloud 的核心组件有哪些?
Eureka,服务注册中心
Ribbon,负载均衡器
Fegin,使用了动态代理,对ribbon中发现的服务提供者发起请求
Hystrix,断路器,服务不可用时,返回默认响应,防止雪崩。
Zuul,实现对微服务接口的拦截和校验。如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务。
59、rabbitmq 中 vhost 的作用是什么?
vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列、绑定、交换器和权限控制;
vhost通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据;
60、rabbitMQ如何避免消息丢失?
rabbitMQ消息可能丢失的情况:
1.发送方发出消息但没有进入队列。
2.接收者接到消息,但处理过程出现错误。
3.队列或者交换机宕机。
发送方确认模式、消息确认机制、持久化
61、rabbitmq 每个节点是其他节点的完整拷贝吗?为什么?
不是,原因有以下两个:
存储空间的考虑:性能的考虑
62、.rabbitmq 的消息是怎么发送的?
虚拟主机:一个虚拟主机持有一组交换机、队列和绑定,使用虚拟主机来进行权限控制;
交换机:Exchange用于转发消息,但是不会存储,会发送到对应的队列,根据路由;
绑定:交换机和队列的关系绑定;
队列:存储和传输消息
Direct模式:默认的模式,先匹配再投送,设置绑定的key
Topic模式:根据通配符来发送和消费消息;和配置logStash的时候类似
Headers模式:也是根据规则匹配,有自定义匹配规则的类型,也是在绑定的时候设置
Fanout模式:消息的广播模式,会发送给所有绑定的队列;
63、CMS收集器?
它是一种以获取最短回收停顿时间为目的的收集器。提升服务响应速度,用于B/S系统服务端。
使用标记-清除算法
初始标记
并发标记
重新标记
并发清除
64、并发包你了解那些?
ThreadPoolExecutor,ConcurrentHashMap,ReentrantLock,CountDownLatch,AtomicInteger,LinkedBlockingQueue。
65、hashmap出现死循环的原因,concurrenthashmap和hashmap区别?线程安全性,锁如何实现的?
hashmap线程不安全,并发操作下,resize时,rehash可能导致死循环。concurrenthashmap线程安全。通过cas原子锁实现。
66、Linux常用命令?
查看程序进程 ps -ef|grep zookeeper
查看端口号 netstat -anp|grep 2181
查看端口号 lsof -i:2181
67、索引在什么情况下不会被命中?
如果条件中有 or ,即使其中有条件带索引也不会使用
like查询是以%开头,索引不会命中
如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
采用 not in, not exist
B-tree 索引 is null 不会走, is not null 会走