李弘宇-2022.9.7 武汉超星
- 简单介绍一下你的项目?你做了哪些功能?
使用Elasticsearch实现多条件课程查询高亮显示,使用canal同步Elasticsearch实现增量更新
对首页的广告进行优化,通过Lua脚本操作openresty服务器和redis进行缓存预热,使用XXL-JOB定时实现广告数据的同步
使用JWT Gateway springsecurity 实现单点登录
使用第三方微信支付API实现微信支付功能,通过死信队列查看确认订单状态,使用Seata实现分
布式事务。
使用Netty网络通信服务器实现视频弹幕的广播
- 刚刚听到你提到了Tomcat服务器,介绍一下Tomcat服务器?你知道哪一些Tomcat服务器的配置?
是阿帕奇公司开发的开源的是Apache软件基金会项目中的一个核心项目
服务器在任何给定时间接受和处理的最大连接数。 一旦达到限制,操作系统仍然可以根据“acceptCount”属性接受连接。
当所有可能的请求处理线程都在使用时,传入连接请求会被放进队列中等待,等待队列的最大队列长度。
服务器在给定时间能接受的连接数为server.tomcat.max-connections, 但并不是同时在工作,最大工作线程数。
任何 HTTP POST请求中表单内容的最大大小。理论上POST请求的大小是无限制的,但是tomcat设定了请求大小为两兆,如要取消限制,则应该将值设为 -1。
请求正文的大小。
- 你们课程搜索功能是怎么实现的?Elasticsearch用到了那些分词器?如何进行分词的?
课程搜索首先在第一次启动搜索微服务时调用课程微服务的查询接口得到所有课程,将所有课程信息写入elasticsearch内 ,用户搜索时只是调用搜索微服务直接走elasticsearch不需要再进行mysql的查询,使用canal监视mysql中与课程相关的数据库和表,当他们发生改变时将修改的部分通过Rabbitmq发送给搜索微服务 ,在搜索服务里对elasticsearch进行更新
使用的自带的lucene分词器
- 你知道Elasticsearch的分片吗?
ES底层使用的是Lucene库,ES的分片(shard )是Lucene的索引,ES的索引是分片的集合,Lucene的索引是由多个段(segment)组成
- 简单介绍一下订单服务的分库分表?你的分库分表是怎么实现的,具体实现做了哪些配置?
,当单表的数据量过大到千万级 ,或者并发访问量过大,读写数量不平衡时将原本的一张表通过垂直或者水平拆分开来,每次只操作其中一部分减少数据库压力,使用shardingsphere实现,
配置有:数据源,逻辑表名,分表的节点名,主键生成器(雪花算法)
- ShardingSphere为什么要用分库分表?你们的数据量有多大?
因为订单或者日志都是不会删除的,当程序运行时间长后,订单表数据会非常大,在千万级以后索引都无法提高速度,所以需要分库分表增加mysql速度,目前只有小万,但会考虑到未来很长时间因为是学校的系统会使用很久。
- 为什么要使用ShardingSphere的读写分离?使用ShardingSphere之后进行查询会有哪一些问题?
读写分离用于优化数据库的查询效率因为订单查询并发会较高,使用shardingsphere 问题有 分页难以完成,事务保持一致问题,关联查询表不在同一个数据库,主键无法自增必须使用随机id
1. 首页优化流程?问项目里 nginx里面放的什么东西,nginx起到什么作用?(原话大概就是他说nginx不就是起到一个反向代理的作用吗?你是在nginx里存放数据了吗?大概就是问你在项目里是怎么用nginx的)
Nginx里放lua脚本去操作redis和mysql,里面还有数据缓存区,配置跨域。
2. 微服务体系里有哪些核心组件,起的作用是什么?
注册中心,配置中心,熔断器,远程调用接口,路由,负载均衡器,
3. 微服务之间是怎么调用的 ?追问Feign的底层是通过什么实现的?提示我了比如实现了一个怎么样的通讯协议,报文之类?
通过openfeign相互调用,底层通过IOC,动态代理,http协议实现的,
请求报文由请求方法 URL 请求请求协议版本号,请求头 如果是post 还有请求包体
响应:http版本,200,响应状态码,响应头,响应报文。
4. Redis使用了哪些数据类型?应用到哪些应用场景?
使用了String类型,在消息幂等,避免重复消费的业务逻辑里,setnx
5. Redis从哪些方面来提高它的效率,或者说怎么达到高性能?(redis为什么高效)
redis基于C语言编写,基于内存,支持网络传输 ,支持可持久化,高性能体现在基于内存,不需要进行磁盘的IO效率极好
6. 数据库的调优经验?索引怎么去建,有什么原则? 怎么确定这条sql语句使用了索引?
索引不能是经常被修改,或者大量重复空值的列,最好选择经常被排序,where的条件,
为经常出现在关键字order by、group by、distinct后面的字段,建立索引。
在查询语句前加explain 观察 type的值可以得知是否走索引
你在使用过程中遇到过哪些数据库的问题?比如说一条sql语句很慢,你会怎么去排查它? 慢sql查询
确认是否命中索引 ,避免索引失效,避免返回不必要的数据链,根据查询的分析器适当做SQL优化 比如是否是全表扫描避免子查询,单表超大数据量,并发连接数过高 分库分表,读写分离 ,读多写少保证写的数据库承受更少的压力
8. 主键索引和非主键索引有什么区别?
主键索引保存的是整个行的数据,非主键索引保存的是主键索引的信息
9. 数据库varchar和char有什么区别?
varchar是可变长度的,char是不可变长 ,如果长度超过会出错 ,如果长度不够mysql会自动补全
10. SpingAOP怎么实现?
AOP基于动态代理,在被注解切中就动态创建该类的代理对象,否创建原对象,
实现接口的类用JDK动态代理 没实现接口的创建CGLIB代理对象,需要引入依赖,动态生成被代理类的子类
11. 对JAVA集合类型的了解?各自的特点,底层原理是什么,怎么实现的?
集合顶层有两个接口一个,collection和Map
collection下面有List,set接口 List下面有Arraylist 底层是可变长度数组,初始长度16扩容1.5倍,方便查,有序可重复
LinkList双向链表,方便插入和删除,无序可重复
vector 如果不指定初始容量就是10 默认扩容两倍 但可以自己设定扩容倍数,大部分方法是synchronized修饰的读写只能单线程
set 单项链表类似hashmap的key 无序不可重复
map接口下 有hashmap 数组链表红黑树entry默认16扩容1.5倍负载因子0.75, concurrenthashmap增加锁的粒度实现读写不同entry互不影响。
12. ConcurrentHashMap怎么(通过存放去)实现锁的?实现原理
开始 结构类似HashMap CAS乐观锁 + synchronized
前 使用分段锁 Segment
13. JRE和JDK有什么区别?
JRE是java运行环境 JKD是开发环境
14. JAVA的内存模型?
15. Jsp和servlet的区别?
本质上没有区别,jsp是servlet技术的拓展,JSP侧重视图servlet侧重逻辑,jsp是java和HTML组成的后缀为jsp的文件
16. JAVA设计模式了解吗?追问单例模式是线程安全的吗?
单例模式,工厂模式,修饰器模式, 不安全所以使用volatile关键字以及DLC双检锁来保证
17. 对threadlocal有了解吗?
通过操作不同的数据来解决线程并发问题,每一个线程只操作自己的threadlocalmap ,以空间换时间
18. JVM的垃圾回收机制有了解吗?Java里面对象啊,内存啊是怎么回收的?
通过可达性算法 ,GC判断哪些对象不可达就是垃圾对象需要被回收,基本是采用分代的方式
新生代,通过标记清除,老年代通过复制删除,最后的是GC认为永远不用被清除的,不进行回收
19. 知道线程池或者连接池是怎么配的?有哪些关键参数?
初始化连接数,表示启动的时候初始多少个连接保存到连接池里面。
最大连接数,表示同时最多能支持多少连接,如果连接数不够,后续要获取连接的线程会阻塞。
最大空闲连接数,表示没有请求的时候,连接池中要保留的最大空闲连接。
最小空闲连接,当连接数小于这个值的时候,连接池需要再创建连接来补充到这个值。
rsa算法,如何生成密钥?
社区项目,物业缴费支付流程
公司后台生成订单 调用微信的接口 ,微信后台返回code-URL ,商户将code-url转化成二维码发给用户,待用户完成操作后将支付信息异步发回给商户,商户确认收到,商户也可以发送请求查看订单的支付状态来进行下一步的逻辑操作
你数据库用到了sharding-jdbc,依据什么分库分表,(分片)?
数据量大,或者并发数多,读和写比例差距过大
看你项目写了gateway鉴权,这个鉴权是什么作用?
在gateway里拦截请求 获取请求头里的token进行JWT解析,如果解析失败返回错误让他重新登录,如果解析成功拿到该用户的权限,网关只引导用户去到他的权限所拥有的接口
抽象类和接口的区别
抽象类:有构造方法,单继承,可以不实现方法,可以有任何类型,方法的类型可以是任意,定义的关键字不同
接口:没有构造方法,多实现,实现接口必须实现其方法,只有静态常量,方法都是public
遍历map集合的集中方式
getkey getentry map.value map.entryset.iterator
缓存雪崩
redis宕机,大量热点数据同时过期 导致所有访问直接打到数据库使服务器宕机,可以配置redis集群,键的过期时间随机
rabbitmq里面过期的消息怎么处理
当消息被拒绝或者超时会配置死信队列 发送给死信监听器,专门创建一个消费者,消费积压的信息
vue生命周期
创建前 创建后 挂载前 挂载后 更新前 更新后 销毁前销毁后
docker常用命令
docker images docker pull docker push docker run
介绍下openfeign
openfeign 是feign技术的延伸 可以支持springMVC的注解 是基于IOC 动态代理 和http协议的 只需要编写接口 就可以调用 接口的远程通信方式, 当接口上加了@EnableFeignClient后 会将 接口交给容器 然后使用JDK动态代理创建代理对象 最后通过http协议发送请求 得到结果,
openfeign = fegin + RestTemplate + Ribbon + Hystrix
说下gateway的作用
geteway网关 作用是 路由鉴权 流量控制等 gateway使用的是netty服务器 ,当在网关上配置了断言后 前端直接访问暴露在外的 网关接口 网关会帮助请求找到对应的接口 请求通过网关时会经历前置和后置过滤链 前置过滤可以做JWT解析 等 后置 可以用于给响应携带token等
线程的创建方式
继承Thread类 重写run方法 实现runnable接口 实现 run方法 将runnable对象 放入 Thread中
实现callable接口 实现call方法 创建futureTask对象 传入callable对象 创建thread对象传入futureTask对象
线程池创建线程
序列化和反序列化是什么
序列化是将java对象转换成二进制码方便其储存和在网络上传输 ,反序列化是将二进制码转化为对象方便读取
linux查看进程的命令
ps aux ps -elf pstree -aup
linux查看日志的命令
tail -100f test.log 实时监控100行日志
head -n 10 test.log 查询日志文件中的头10行日志;
nginx里面配置路由之类的文件叫什么?
nginx.conf
mysql的一个查看sql的命令(explain)
explain
mybatis里#和$的区别
#预编译 减小数据库计算压力 防止sql注入攻击 类似pS的?
$字符串替换可以用作动态表名
你的搜索功能是单独的一个模块吗?里面是调用了其他服务吗?
不是 里面还调用了 课程微服务 目的是将课程表里的数据 同步到Elasticsearch中实现初始化
介绍一下项目
播放这一块用的什么服务器
小程序使用的什么方式嵌入?H5?
说一下你们这个权限模型
RBAC权限模型,一个用户可能对应一个角色,而每个角色又对应着不同的权限,数据库中是通过中间表的方式进行连接
数据级权限怎么做
数据库建模有没有参与,谁来建库建表
AB表关联,对A表修改(要求B表中有数据才修改)关联修改语句
java开发这一块用的什么框架
SSM开发框架
开发中使用到一个第三方的软件包,怎么加入到自己的项目中
通过maven导入pom文件
idea中输出日志,怎么修改默认的日志输出级别
Excel导入导出怎么做的
使用的easyExcel 它有一个注解可以在实体类上选择需要哪些属性和忽略哪些属性
导出多个sheet页怎么做
//第一个Sheet页数据
List<List<Object>> dataList = new ArrayList<>();
List<Object> headList = new ArrayList<>(Arrays.asList(new Object[]{"表头1", "表头2", "表头3"}));
dataList.add(headList);
//第二个Sheet页数据
List<List<Object>> dataList2 = new ArrayList<>();
List<Object> headList2 = new ArrayList<>(Arrays.asList(new Object[]{"表头1", "表头2", "表头3", "表头4"}));
dataList2.add(headList2);
String fileName = new String("文件名称.xls".getBytes(), "UTF-8");
response.addHeader("Content-Disposition", "filename=" + fileName);
//设置类型,扩展名为.xls
response.setContentType("application/vnd.ms-excel");
//将数据写入sheet页中
ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
WriteSheet writeSheet1 = EasyExcel.writerSheet(0, "sheet1").build();
WriteSheet writeSheet2 = EasyExcel.writerSheet(1, "sheet2").build();
excelWriter.write(dataList, writeSheet1);
excelWriter.write(dataList2, writeSheet2);
excelWriter.finish();
不规则表格导出怎么做
redis的使用场景
String类型可以用于存键值分布式锁分布式id hash用于存放对象, list 用于模拟栈 队列 数组 set 无序不可重复 点赞数共同的关注,zset排行榜 有序不可重复
怎么启动定时任务
springboot自带的 @EnableScheduling 给方法上加@Scheduling 然后配置cron表达式
或者使用xxlJOB 给方法上加上@xxl注解 然后配置切中的方法名 运行后直接在xxl调度中心配置
开机启动加载
测试接口的工具用的什么
swagger APIPOST jmeter
lambda表达式使用场景
集合遍历 , netty网络编程时配置通道后的重写的匿名内部类,学习创建线程的时候
数组转集合,集合转数组
assList to Array
使用过的设计模式
单例模式、工厂方法模式、抽象工厂模式、代理模式、装饰器模式
工作流workflow
工作中有没有遇到有挑战性的问题,怎么解决的
讲一下项目ArrayList初始容量和扩容机制,HashMap的呢?
ArrayList 16 1.5倍 HashMap 16 2倍
线程和进程的区别1
线程归程序员控制,进程被操作系统调度,一个进程起码有一个线程,进程之间通信复杂,线程可以通过公共区域进行通信,进程重量级,线程轻量级。
java中的线程状态,以及怎么转换的
创建 初始化 运行阻塞 运行 销毁
sleep和wait方法的区别
sleep是theread的方法不会释放锁不需要被唤醒时间到了自动唤醒 wait是object的方法会释放锁并加入到等待队列 ,需要手动唤醒
线程池的参数
核心线程数 最大线程数 存活时间 任务队列 时间单位 线程工厂 拒绝策略
为什么不推荐使用线程池工具类创建线程池
阿里规范手册为了让开发人员更了解线程池的原理
内存溢出和内存泄漏有什么区别
内存溢出指在申请的内存空间下放了更多的数据
泄漏是内存空间无法被正常回收导致内存减少降低了系统的运行速度
怎么避免内存泄漏
避免一次从数据库取出太大量的数据
清空集合类中有对对象的引用
避免递归或者死循环
调高内存的启动参数
JVM的内存模型
什么情况下会触发FullGC
1. 旧生代空间不足
2. Permanet Generation空间满
4. 统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间
加入生产环境中报了一个内存溢出情况怎么排查
检查错误日志查看outofmemory错误前是否有其他错误
对代码进行走查和分析找出可能溢出的位置
synchronizd 和 reentrentLock的区别
synchronizd是java1.0就有的 reentrentlock是6以后的 他更灵活轻量他是可重入锁,支持公平和非公平竞争锁
spring Bean的生命周期
spring声明式事务在那些情况下会失效
出现的报错不是runtime或者error 且没有指定回滚的异常类型
非事务方法通过this直接调用本类的方法
spring的拦截器和过滤器
过滤器是servlet的,在进入容器后在进入servlet之前进行预处理 基于回调函数
拦截器是SpringMVC的 在进入servlet后进入controller前进行处理 基于反射和动态代理
spingBoot配置文件加载顺序
springboot启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件
–file:./config/
–file:./
–classpath:/config/
–classpath:/
乐观锁悲观锁怎么实现
悲观锁 任务线程并发问题一定出现 使用上锁的机制 如同步方法 同步代码块
乐观锁 任务并发问题不会出现,采用CAS 对比交互 根据内存偏移量在执行时得到一个预期值,结果与预期值相符 就交换提交否则不提交
mysql聚簇索引和非聚簇索引
聚簇索引为主键索引 保存的是整行信息
非聚簇索引保存的是聚簇索引的信息
sql优化
查看是否走了缩影防止索引失效的情况
避免返回不需要的数据链
避免进行全盘扫描或者子查询
如果是因为数据量过大 考虑分库分表
读写分离
MySQL中的binlog,undolog,redolog有什么作用
redolog重做日志 确保事务的持久性 防止在发生故障的时间点 尚有脏页未写入磁盘在重启mysql时根据redolog进行重做 从而达到事务的持久性
binlog归档日志 用于复制 从库利用主库上的binlog进行重播 实现主从同步
UNdolog 回滚日志 保存了事务未发生前的版本 ,可用于回滚
redis持久化的方式
AOF每秒保存次少量数据丢失 RDB在特定的时间内操作次数到达触发保存对数据的准确性没那么大要求 也可以两个都开启
缓存穿透、雪崩、击穿
雪崩 redis大量数据过期 或者 redis宕机 请求直接打到mysql导致宕机 热点数据随机过期时间,配置redis集群
击穿 高并发时前面的线程还没将数据储存到redis后面的线程就判定redis里没 而访问数据库 DLC双检锁
穿透 大量查询数据库里不存在的数据 布隆过滤器
分布式锁
数据库中间件
redis Sharding-JDBC
消息中间件的使用场景
用于对数据同步要求不那么高的场景 比如 广告同步 搜索数据同步 异常的处理 秒杀服务的死信队列
canal怎么监听数据库的改动
canal伪装成mysql的从服务器读取主服务器对表的修改信息
rabbitMQ的工作模式
五种
一对一
工作队列
发布订阅
路由
主题
osi网络七层模型
物理层 端对端比特流
数据连路层 管理数据链路
网络层 IP寻址路由
传输层 TCP UDP
会话层 创建会话
表示层 数据加密处理数据格式
应用层 http协议
TCP和UDP的区别
都是全双工
TCP 面相连接 传输文件 三次握手四次挥手
UDP面相数据报 发消息 性能强
三次握手和四次挥手,为什么挥手需要四次
给服务器释放资源的时间
Linux中删除一个文件有哪些方式
rm -f +文件名 rm-rf递归删除所有文件
怎么通过端口号找到应用
ps -ef |grep 端口号
vim使用过吗
用过vi wq 保存退出 q!强行退出 i 输入模式 / 类似Ctrl f搜索
mysql优化
建索引 如果有索引要用explan看是否走了索引,避免索引失效
避免返回不必要的数据链
优化并发 可以进行分库分表读写分离
分库分表 水平分库分表 读写分离 使用主从架构 加入缓冲区 redis
查看开启慢查询提示,设置慢查询时间,出现慢查询会有记录,查看慢查询解决
mysql事务隔离级别
读未提交 读已提交 解决脏读 可重复读解决不可重复读 序列化 解决所有
怎么处理脏读现象
innodb默认的隔离级别是可重复读
数据库的表锁
从对数据操作的类型分法(读或写)
读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响。
写锁(排它锁):当前写操作没有完成前,它会阻断其他写锁和读锁。
从对数据操作的粒度分法
表级锁:表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁(MyISAM引擎默认表级锁,也只支持表级锁)。比如说更新一张10万表数据中的一条数据,在这条update没提交事务之前,其它事务是会被排斥掉的,粒度很大。
行级锁:行级锁是Mysql中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁(基于索引实现的,所以一旦某个加锁操作没有使用索引,那么该锁就会退化为表锁)
页级锁:页级锁是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁,一次锁定相邻的一组记录
innodb的底层原理
innodb和myisam在存储这块有什么区别
支持事务方面 表锁行锁方面 外键方面 保存行数方面 自增id保存的位置
redis使用场景
数据库的缓冲区,消息队列的防止重复消费 set可能认识的人,点赞 zset排行榜
缓存穿透
大量并发访问数据库里没有的数据 ,全部请求打到mysql里 可以使用布隆过滤器排除掉没有的数据 ,或者将没有的数据以默认数据传回
redis的持久化策略
AOF快照持久化 每秒保存一次少量数据丢失 RDB条件触发持久化 允许数据丢失 也可以两个都用
redis的过期策略
定期删除+惰性删除
每隔100ms 随机检查
获取 key 的时候,如果此时 key 已经过期,就删除,不会返回任何东西。
ES用了几个节点
Elasticsearch本身就是分布式的,因此即便你只有一个节点,Elasticsearch默认也会对你的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡
登录认证这一块怎么实现的
使用的rsa加密算法 访问登录时在用户微服务里 网关放行 通过公钥加密,在网关里放私钥进行解密
怎么保证rabbitMQ的数据不丢失
提供者到交换机 事务 (同步效率低)回调机制手动确认收到数据(异步)
交换机到队列 采用return 消息丢失后进行补偿
队列到消费 还没被取走 可以进行持久化 被取走了 可以在消费者业务完成后 手动确认
怎么使用线程池
可以使用创建线程池的工具类 不过阿里规范更倾向手动创建
核心线程数 最大线程数 最大存活时间 时间单位 队列类型 线程工厂 拒绝策略
拒绝策略有哪几种
队列满了 丢弃任务抛出异常
丢弃任务不抛异常
舍弃最前面的任务 重新提交
让消息线程来执行
线程队列有多少种
blockqueue
讲一下CAS
乐观锁机制 通过内存偏移量得到一个预期结果 再将运行后的结果与预期值对比 如果相同就交换提交 如果不同就放弃提交
SpingIOC和AOP
IOC控制反转 将对象的创建交给容器完成 不同于传统手动创建对象 由容器来管理对象的创建和销毁 起到降低代码耦合度的问题 实现方式是 工厂模式和反射机制
AOP 面相切面编程 在不修改原本代码的条件下 对代码功能进行增强 将公共的功能 如 日志等切入到程序中 避免写过多重复代码 让开发人员只需要专注本身的业务逻辑 也是降低耦合度 实现方式是动态代理 JDK CGLIB
创建对象的方式
new 反射 clone 序列化和反序列化
一个方法不希望被重写使用什么关键字
final
static private 修饰的方法可以被重写吗
不行 static 是在编译时绑定的 而重写是在运行时
讲一下服务的雪崩
redis宕机导致大量并发访问mysql宕机 配置redis集群 redis里大量热点数据同时过期过期时间随机
Hystrix的原理
redis支持的数据类型
String 分布式锁分布式id 二进制 图片 json hash 存储对象 list 模拟数组栈队列 set 可能认识的人 点赞 zset排行榜
集合转数组
toarray
map是集合吗
是 map 下面的实现有hashmap hashtable concurrenthashmap
hashMap和HashTable的区别
hashmap 线程不安全 初始容量16 扩容2倍 value可以为空 且存在索引0出
hashtable 线程安全 且锁整个数组 读写效率很低不过很多方法都 11 扩容2n+1 key和value不能为空
垃圾回收的算法
GC 有可达性算法 解决相互引用的问题 进行GC时停掉整个JVM
引用计数法 实时性高 不用等到内存不足 在垃圾回收过程中无需挂起 每次引用对象都会更新计数器 有时间小消耗 无法解决循环依赖
数据库的分库分表
水平分库分表和垂直分库分表
垂直分顾名思义 竖着切 表中的数据量还是不变 不过将不同的字段放在了不同的表里 避免一次返回过多数据导致效率降低
水平分表 把一张表的数据存储在多张表上 使用例如雪花算法 生成id后取模来判定存进哪张表里
分表的索引怎么查找数据
水平分表了,表里面的索引还是能起作用的,只不过相当于原来的大索引分成了几个小的
首页为什么加载慢
因为首页是并发的高发服务 如果通过传统的 走Tomcat 和 mysql进行磁盘io速度很慢 而且 不能承受高并发 会导致数据库或服务器宕机 就算加入了redis作为缓冲加上锁的机制 本质都是上锁 一旦上锁必将影响效率
视频存在哪里
mybatis的工作原理,xml怎么绑定mapper层接口
ORM 数据库映射框架 通过 namespace绑定的
$和#有什么区别,你有用过$吗,具体场景是什么
# 是预编译 类似 的? 可以有效防止sql注入 减轻数据库的计算压力
$是 字符串替换 可以用作动态的表名
mysql索引类型有哪几种
主键 唯一 普通 全文 组合
组合索引中的最左前缀原则知道吗,能不能举个例子
MySQL 建立联合索引的规则是这样的,它会首先根据联合索引中最左边的、也就是第一个字段进行排序,在第一个字段排序的基础上,再对联合索引中后面的第二个字段进行排序,依此类推。
综上,第一个字段是绝对有序的,从第二个字段开始是无序的,这就解释了为什么直接使用第二字段进行条件判断用不到索引了(从第二个字段开始,无序,无法走 B+ Tree 索引)!这也是 MySQL 在联合索引中强调最左前缀匹配原则的原因
三大范式
属性不可分割 每一个属性都是不可再分的原子项
非主属性必须完全依赖主属性
非主属性之间不可以相互依赖
mysql优化
建索引 如果有索引要用explan看是否走了索引,避免索引失效
避免返回不必要的数据链
优化并发 可以进行分库分表读写分离
分库分表 水平分库分表 读写分离 使用主从架构 加入缓冲区 redis
查看开启慢查询提示,设置慢查询时间,出现慢查询会有记录,查看慢查询解决
线程安全的集合
vector Hashtable(不建议使用) concurrenthashmap copyonwritearraylist
HashTable和ConcurrentHashMap的区别
hashtable 每次读写操作会锁住整个数组 效率低下 11 2n+1
增加了锁的力度 每次上锁只锁其中的一个entry 一个entry的写操作不会 另一个entry的读 效率更高 CAS 16 2倍
介绍项目技术
说一下你常用的框架
springboot的自动装配流程
说一下你学习了哪些Java基础
线程的返回值(没听明白问题,没答上来)
Java8新特性有哪些,介绍一下stream流
介绍集合
.吗