使用main()启动SpringBoot的时候,只有一个@SpringBootApplication,我们可以点击进去@SpringBootApplication注解中看看,可以发现有三个注解是比较重要的:
@SpringBootConfiguration:标记当前类为配置类
@EnableAutoConfiguration:开启自动配置
@ComponentScan:扫描主类所在的同级包以及下级包里的Bean
什么是线程池?
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序
都可以使用线程池。合理地使用线程池可以降低资源消耗、提高响应速度、提高线程的可管理性。
线程池的的四种创建方式:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
sql优化策略有哪些?
SQL优化策略适用于数据量较大的场景下,对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。(全表扫描的意思就是要把表中所有数据过一遍才能显示数据结果)
应尽量避免在 where 子句中对字段进行 null 值判断。优化方式:可以给字段添加默认值0,对0值进行判断。
应尽量避免在 where 子句中使用!=或<>操作符。
应尽量避免在 where 子句中使用 or 来连接条件。优化方式:可以用union代替or。
应尽量避免在字段开头用模糊查询,会导致数据库引擎放弃索引进行全盘扫描。
in 和 not in 也要慎用,否则会导致全表扫描。
任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
SpringMVC是单例还是多例?
SpringMVC默认都是单例,如果你bean配置多例了,依赖这个bean的bean也需要多例。
变量是在方法中写的,在类中写,controller层会有线程问题,所以都是在方法中写的
为什么是单例的?
减少实例生成的系统消耗,效率会高
gc垃圾回收,就不会回收,因为没有生成实例
可以更快的获取到bean ,第一次生成之后 ,就不会再次生成,每次取都是缓存中取
负载均衡:
1.轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、指定权重
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
项目管理用了什么?
比如,用了maven;是一个项目管理和构建自动化工具,核心功能便是合理叙述项目间的依赖关系,通俗来讲,通过pom.xml文件的配置获取jar包
怎么用IDEA向Git上传项目
点击commit,选中更新过的java文件,填一下项目描述。点commit按钮,最后点击push上传
Mysql函数:max;查询指定列的最大值
min;查询指定列的最小值
count;统计查询结果
sum;求和
if;判断
Mysql数据类型:int、long、float、double、varchar、bit、text、data
Redis使用场景:商品信息做缓存 数据高并发的读写(详细可看此篇博客:(6条消息) Redis的各种用途以及使用场景_L_Icea的博客-CSDN博客)
SSO(单点登录)
在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统的保护资源单点登录原理;有一个独立的认证中心,只有认证中心才能接受用户的用户名和密码等信息进行认证,其他系统不提供登录入口,只接受认证中心的间接授权
单点注销:在一个子系统中注销,全局会话也会被注销,所有子系统的会话都会被注销
RDB和AOF的区别
Redis默认RDB;
通过保存数据库中的键值对来记录数据库的状态,它是以快照的形式保存到硬盘中的
AOF:通过保存Redis服务器所执行的写命令来记录数据库状态
Shiro主要功能:
身份认证/登录:验证用户是不是拥有相应的身份,一般会使用用户名和密码作为认证信息。
授权,即权限验证:判断某个已经认证过的用户是否拥有某些权限访问某些资源,一般授权会有角色授权和权限授权;
会话管理:即用户登录后就是一次会话,在没有退出之前,它的所有信息都在会话中;会话可以是普通JavaSE环境的,也可以是如Web环境的,web 环境中作用是和 HttpSession 是一样的;
加密:保护数据的安全性,如密码加密存储到数据库,而不是明文存储
Elasticsearch
是一个开源的分布式、restful风格的搜索和数据分析引擎,它的底层是开源库Apache Lucene;一个分布式的实时文档存储;
每个字段可以被索引与搜索
一个分布式实时分析搜索引擎;
能胜任上百个服务节点的扩展,并支持PB级别的结构化或者非结构化数据;
比如:维基百科、卫报
ES应用场景
例如,一个网上商店,搜索你卖的产品,可以使用ES来存储整个产品目录和库存,并为它们提供搜索和自动完成建议;
或者,收集日志或事务数据,并希望分析和挖掘这些数据,以查找趋势,统计,汇总或异常,在这种情况下,可以使用loghide来收集,聚合和解析数据,让loghide将这些数据输入到ES中
RabbitMQ
消息中间件,实现应用程序的异步和解耦,起到消息缓冲,消息分发的作用,实现了高级消息队列协议(AMQP)的开源信息代理软件(面向消息中间件)
线程的实现方式
1.内核线程;直接由操作系统内核支持的线程(一般不会直接使用内核,而是轻量)
优点:保证了每个轻量级进程都成为了一个独立的调度单元,即使有一个轻量级进程在系统调用中阻塞,也不会影响整个进程
缺点:系统调用代价高,需要在用户态和内核状态来回切换;一个系统支持轻量级进程的数量是有限的
2.使用用户线城实现:
完全建立在用户空间的线程库上,系统内核不能感知线程存在的实现
优点:不需要切换内核态,效率高,低消耗
缺点:没有系统内核的支援,所有线程操作都需要用户程序自己处理,也会有阻塞问题
3.使用用户线程加轻量化级进程混合实现
用户线程和轻量级的优点,支持大规模的用户线程并发,大大降低了整个进程被完全阻塞的风险
SpringMVC执行流程
第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找 Handler
可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括Model和view
第八步:前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染
视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
额外知识点:
-
sql优化(11个)
(1)尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描
(2)尽量避免使用in 和not in,会导致引擎走全表扫描,如果是连续数值,可以用between代替
(3)尽量避免使用 or,可以用union代替or
(4)尽量避免进行null值的判断,可以给字段添加默认值0,对0值进行判断
(5)尽量避免在where条件中等号的左侧进行表达式、函数操作, 可以将表达式、函数操作移动到等号右侧
(6)当数据量大时,避免使用where 1=1的条件,用代码拼装sql时进行判断,没 where 条件就去掉 where,有where条件就加 and
(7)查询条件不能用 <> 或者 !=
(8)where条件仅包含复合索引非前置列
(9)隐式类型转换造成不使用索引
(10)order by 条件要与where中条件一致,否则order by不会利用索引进行排序
(11)正确使用hint(提示)优化语句
redis适用场景
对商城的商品信息进行缓存
-
不用redis做缓存会造成什么后果
会造成缓存击穿、缓存穿透、缓存雪崩
-
redis数据类型
-
Dubbo的超时机制
在配置文件中Timeout 属性 默认1000ms
接口安全性如何保证
(1).签名
根据用户名或者用户id,结合用户的ip或者设备号,生成一个token。在请求后台,后台获取http的head中的token,校验是否合法
(2)加密
客户端和服务器都保存一个秘钥,每次传输都加密,服务端根据秘钥解密
10.线程池的创建方式
11.mybatis 和 hibernate的区别
12.es常用命令以及流程
(1)常用命令
1、获取索引 curl -XGET 'http://localhost:9200/{index}/{type}/{id}' 2、索引数据 curl -XPOST 'http://localhost:9200/{index}/{type}/{id}’ -d’{“a”:”avalue”,”b”:”bvalue”}' 3、删除索引 curl -XDELETE 'http://localhost:9200/{index}/{type}/{id}' 4、设置mapping curl -XPUT http://localhost:9200/{index}/{type}/_mapping -d ‘{ “{type}” : {
13.HashMap
HashMap是根据键的hashcode值存储数据的,它具有很快的访问速度,但遍历的顺序无法确定,HashMap是线程不安全的,这可能会导致数据的不一致。打方向上HashMap里面是一个数组,然后数组里每个元素都是一个单向链表。java8之后做了一些修改,最大的不同就是利用了红黑树,当链表中的元素超过8个以后,会将链表转为红黑树,可以降低查找的时间
14.线程池创建方法
1.newCachedThreadPool 创建一个无限大小的线程池,这个线程池是可缓存的线程池,如果线程池的长度超过了护处理的需求,可以灵活的回收线程
2.newFixedThreadPool 创建出一个定长的线程池,可以控制最大的线程并发数量,超出的线程会在队列中等待
3.newScheduledThreadPool 支持定时及周期性的任务执行
4。 newSingleThreadExecutor 创建一个单线程的的线程池,只会用唯一的线程执行任务,所有的任务都按照顺序来执行
15.rabbitMq
(1) 是一种采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需要确保提供方存在,实现了服务之间的高度解耦
(2)如何避免消息重复投递或重复消费
在消息生产时,MQ 内部针对每条生产者发送的消息生成一个 inner-msg-id,作为去重的依据(消息投
递失败并重传),避免重复的消息进入队列;在消息消费时,要求消息体中必须要有一个 bizId(对于同一业务全局唯一,如支付 ID、订单 ID、帖子ID 等)作为去重的依据,避免同一条消息被重复消费
(3)优点
1、服务间高度解耦
2、异步通信性能高
3、流量削峰
(4)缺点
系统可用性降低
系统复杂性提高
一致性问题
16.jvm
17.SpringCloud的核心(我答的五大组件的一部分)
服务中心—— Eureka
网关——Zuul
负载均衡—— Ribbon(瑞本)
熔断器——Hystrix(哈斯转克斯)
分布式配置——Spring Cloud Config
18.spring的核心
IOC 依赖注入 和 AOP 面向切面编程
IOC典型的工厂模式,通过sessionfactory注入实例。
aop是典型的代理模式,是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术,其是纯java实现的
19.stringBuffer、StringBuilder 和 String的区别(2家问)
三者共同之处:都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用。
stringBuffer是线程安全的
StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了
String反而是三者中运行最慢的,因为他是字符串常量
20.反射机制(问道说没了解过转移了)
21.垃圾回收机制(问道说没了解过转移了)
22.jwt
23.bug有什么处理方式
24.工厂模式,还有什么别的应用,别的设计模式还有什么了解 单例,别的没了解
25.如何在高并发的时候实现订单号的唯一性
(1)时间戳+用户id+随机数+乐观锁
(2)用redis的原子递增,做高可用集群
(3)java自带的UUID