一、mybatis
1、什么是 MyBatis?
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
2、MyBatis加载mapper方式
4种方式 package、url、resource、class。其中package优先级最高
源码:
package优先级最高,只能有一种加载方式,不然会抛出最下面的异常
3、MyBatis缓存的作用?
提高性能、减少对数据库的依赖,可以通过jvm的内存,在硬件层面就是硬盘和内存的区别。
4、一级缓存默认开启还是关闭?生成原理是什么?什么是二级缓存?
一级缓存默认开启,源码里面cacheEnabled属性默认为true 一级缓存作用域Sqlsession 二级缓存跨作用域的。
原理: org.apache.ibatis.executor.CachingExecutor#createCacheKey
id会去访问mapper文件里面的select id,sql里面的offset,limit,和sql语句。组成了缓存。
第一次访问之后会有一个缓存,下一次如果sql语句一样就访问缓存,否则就去查询数据库
二、并发
1、什么是死锁?如何排查死锁?
多个线程持有相互资源,并且等待对方资源进行释放的前提下。
排查:idea中运行栏左侧有一个拍照,可以打印出堆栈信息,
cmd命令可以用java提供的命令,先用jps查看进程的进程号
再使用jstack8480也可以看到哪里发生了死锁。 Jstack pid
2、如何保证多线程执行顺序?
join底层被synchronized修饰,还调用了wait方法,一个native方法,让主线程进行等待
原理:除了thread1、2、3还有一个main线程,正常并发的不能保证顺序,如果加入了join代码,会让主线程等待第一个线程执行完再执行下一个线程的方法。
三、 zookeeper
1、集群中的机器角色都有哪些?
3个 leader、 follwer、observer 集群角色
Leader:负责读和写、选举投票权
Follwer:负责读、选举投票权
Observer:负责读、没有任何的投票权
2、zookeeper有哪几种节点类型?
4种类型:持久(有序)、临时(有序)
持久节点:客户端断开,此节点不会自动删除
临时节点:客户端断开之后,此节点会自动删除(killSession)
org.apache.zookeeper.CreateMode
3、集群支持动态添加机器吗?
水平扩展机器 zk是支持的,但是他支持并不是很好。
Conf/Zoo.cfg server.1 server.2 server.3 相关服务的配置,这一个集群要有多少节点是先配置好的
配置不好的原因是需要停机器 加配置才可以
全部重启:集群最低要求配置(2n+1)大于半数以上
挨个重启:zab zookeeper原子广播协议
4、有哪几种集群方式:
单机(单机)、集群(多台机器)、伪集群(在一台机器)
高可用:集群(多台机器上)
容灾:
假如一个一个机房挂掉了,还有4个大于1/2,不管哪个机房挂掉了都可以容灾。
下面这种容灾性就很差了,中间的5个挂掉了,就超过1/2了
四、Redis
1、单线程的Redis为什么这么快?
IO 复用、内存key value的nosql数据库
没有复用的话每一次请求都是一次IO操作
如果IO复用的话,就不用再新建一个IO,用原先的I别人用过的O去请求,放入队列中保证并发的问题,还有一个事件派发器
多个socket有一个很大的池一样的IO复用,里面每个socket都会有一个队列,通过类似于事件的方式去请求的,叫做文件事件分派器,命令请求处理,队列是有限的,可能多个请求拿到同一个socket。
2、Redis有哪些适合的场景?
1、分布式session (业务场景,分布式会话是短连接,无状态的,必须要在服务端存储session,tomcat支撑不了全局网站的session数据可以使用redis去做)
2、接口幂等性(第一次请求和第二次、第三次请求结果是一样的)、唯一性 (分布式的自增)
3、缓存
4、排行榜
5、队列、订阅
3、redis相比memcached有哪些优势?
1、memcached中全是字符串 redis有其他类型的
2、redis有持久化
3、redis速度比memcached快,redis是单线程单进程的,memcached是并发的
4、什么是缓存击穿、什么是缓存雪崩?如何避免
缓存雪崩:redis中存在的缓存不是持久的,失效时间。
缓存key在同一时间失效,(缓存挂掉、失效),并发同事请求到数据库。
1、失效时间随机、避免集体失效
2、多级缓存 多了一层保护
3、限流 降低并发数量。
缓存击穿:恶意请求
1、对缓存 null 的失效时间
2、布隆过滤器 guava
五、Rocketmq
1、为什么要用消息中间件?
解耦、异步、削峰
应用程序需要垂直拆分,依赖调用增多。
2、消息中间件的优缺点
缺点: 1、降低系统可用性
2、系统的复杂度提高
3、数据一致性
4、消息路由
3、如何保证rocketmq顺序消费?
生产消息是一个队列和我们消费消息是一个队列
源码 rocketmq 取模 一个订单状态
创建订单、支付订单、完成订单、失败订单
六、sharding-sphere
1、说下proxy和jdbc优缺点?
jdbc支持跨数据库但是不支持跨语言
proxy支持跨语言但是不支持跨数据库
proxy:mycat
jdbc:sharding-phere
七、分布式唯一主键保证
雪花算法实现 snowflake
总结
面试题