1、nginx的负载均衡策略
轮循: 循环负载,有多少个服务器就会轮流分配到服务器上,如果服务器出现问题就会down掉,就会自动剔除 (被标识down以后服务器不会访问)
权重: 可以指定各后端服务器节点被轮循到的机率,用weight来设置访问几率,设置权重越高几率越大
IP_HASH: 负载不均,将前端的访问IP进行hash操作,然后将结果分配到不同的后端服务器节点,就会使得每个前端访问的IP会固定访问一个后端服务器节点上
需要在配置upstream中添加ip_hash。
upstream tomcats {
ip_hash;
server 127.0.0.1:8091; #down; #weight=6
server 127.0.0.1:8092; #weight=3
server 127.0.0.1:8093; #weight=1
2、Nginx的工作原理
反向代理:
用户访问被Nginx代理去访问服务器
是一个高性能的Web和反向代理服务器
作用:
1.反向代理,将多台服务器代理成一台服务器
2.负载均衡,将多个请求,均匀的分配到多台服务器上,减轻每台服务器的压力,提高服务
3.可以提高访问速度
1.优秀的数据持久层框架
2.mybatis是一个轻量级的半ORM映射框架,封装了JDBC,简化了CRUD的操作
3.特点:
(1)本质也是通过对象的行为操作数据库表是把Sql语句写在XML配置文件当中,执行完Sql语句之后可以以对象形式返回。
(2)要写定制sql
(3)支持复杂存储过程、复杂查询
(4)灵活性高
(5)开源
4.Mybatis中的一二级缓存:
二级缓存: SqlSessionFactory对象,由同一个SqlSessionFactory生产的SqlSession实现数据的共享,多线程操作。 注意事项: 对象必须序列化
一级缓存: SqlSession对象,由同一个SqlSession查询数据,实现数据共享,单线程
5.Mybatis中Mapper接口与映射文件的关系
(1).Spring管理Mapper接口时,为其创建JDK的动态代理对象.之后交给Spring容器管理
(2).映射文件中要求namespace必须与Mapper接口的路径一致.
(3).Mapper接口中的方法必须与映射文件中的ID一致.
(4).如果单表查询,并且字段与属性一致使用resultType,否则使用resultMap(万能操作)
4、SpringMVC的工作原理
前端控制器 DispatcherServlet: 接收请求,响应结果
处理器映射器 HandlerMapping:根据请求的url找到处理器
处理器适配器HandlerAdapter:负责执行处理器
处理器(Handler):处理业务逻辑
视图解析器(ViewResolver):进行视图的解析
视图(view)
流程:
1.用户发送请求到前端控制器(DispatcherServlet)
2.收到请求后,调用处理映射器(HandlerMapping)(调用时返回处理器执行的链接)
3.(根据xml配置文件或者注解查找)找到具体的处理器后,生成处理器对象及处理器拦截器,然后返回给前端控制器(DispatcherServlet)
4.前端控制器 调用 处理适配器(HandlerAdapter)
5.处理适配器(HandlerAdapter)去调用具体的处理器类(Controller类,也叫后端控制器)
6.将得到的参数处理并返回给处理器适配器(HandlerAdapter),再将结果返回给前端控制器(DispatcherServlet)
7.前端控制器(DispatcherServlet)将数据传给视图解析器(ViewResolver)进行解析,然后返回具体的视图(view)
8.前端控制器(DispatcherServlet)调用视图(view)进行渲染并反回给用户
5、Spring的优点
轻量级的j2ee框架,可以整合其他优秀框架
Spring-IOC:控制反转
将对象创建的权利,交给Spring容器管理,由Spring容器管理对象的声明周期
高内聚,低耦合
Spring-DI注入: 对象的注入 @Autowired Spring @Resource JavaX
根据对象的属性,查找Spring容器中的对象 进行注入.
注入方式: 1. 根据类型注入@Autowired 2.根据名称注入 @Qualifier
set注入方式
SpringAOP:面向切面编程
原则:开闭原则 OCP原则:
面向切面编程 利用动态代理技术,在不修改源码的条件下,对方法进行扩展.
切入点表达式:四种
1.Bean、2.within粗粒度
3.excution细粒度、4.@annotation 只拦截注解
通知:五种:前置、后置、返回、异常(这四种只能记录程序的运行状态)
环绕(控制目标方法是否执行)
代理模式:jdk代理(接口,兄弟关系),CGLIB代理(继承,父子关系)
每一个URI代表1种资源,也就是对url进行规范
客户端使用GET、POST、PUT、DELETE 4个表示操作方式的动词对服务端资源进行操作
Post:新建资源
Put:修改资源
Get:获取资源 /{id}/{name}
Delete: 删除资源
7、什么是SpringBoot?
是一个spring的脚手架,没有整合ssm,已经整合springmvc,内嵌了tomcat,web
可以整合mybatis,yml:配置数据源
SpringBoot可以理解为框架的框架, 或者可以理解为框架的高级API.
核心思想: “开箱即用” 只要引入特定的jar包.进行少量(不用)配置.即可以使用该功能
关于Spring中主启动类说明: 主启动类的包路径,就是未来包扫描的路径.写代码的时候,必须在主启动类的同包和子包中编辑
.
8、VUE的常用指令:
v-if:显示与隐藏
v-else-if 必须和 v-if 连用 v-else 必须和 v-if 连用 不能单独使用 否则报模板编译错误
v-on:click 给标签绑定函数
v-for:动态渲染
v-model:用于表单元素实现双向数据绑定
v-bind:动态绑定,作用:及时对页面的数据进行更改
v-show:显示内容
v-html和v-text 解析文本
v-text和{undefined{}}表达式渲染数据,不解析标签。
v-html不仅可以渲染数据,也可以解析标签
9、什么是MVVM
是mvc模式的一种。v是view ,m是model,vm是虚拟dom对象,中转站,绑定和监听
10、MYSQL
1、事务的四大特性:ACID 原子性 一致性 隔离性 持久性
2、事务的隔离级别:读未提交 读已提交 可重复读、串行化
3、Mysql的默认的隔离级别是:可重复读 - innodb
4、Mysql分为哪几种语言;DDL、DCL DQL DML
DDL:(Data definition language)数据库的定义语言 作用:对数据库和表的create alter drop
DCL:(Data control language)数据库的控制语言 作用:用来设置或更改数据库用户或角色权限的语句
DQL:(Data query language)数据库的查询语言: 作用:对表数据进行select
DML:(Data manipulation language) 数据库的操纵语言:作用:对表进行update insert delete
5、什么是左外关联,右外关联
左:A表的全部数据和B表的交集
右:B表的全部数据和A表的交集
6、什么是笛卡尔积?
两张表里面获取一条记录,也就是第一张表里面取出一条记录跟第二张表里面的一条记录综合成为一条新的记录,结果数等于两张表的记录数的乘积叫笛卡尔积
主键、外键、非空、唯一
8、SQL语句的执行顺序: from、on 、join、where、group by 、
(sum、max 、 min 、average、count)、having、select、
order by,limit
group by 和having 不能一起使用
11、JDBC的步骤:
注册驱动
获取连接
获取传输器
执行sql,获取结果集
遍历结果集
关闭资源
12、statement和preparedstatement 的区别
statement 效率高,容易出现sql注入
preparedstatement 有预编译的功能,sql骨架,可以防止sql注入攻击
13、$和#的区别
#是占位符,防止Sql注入攻击
$是做字符串的拼接
14、CSS的三种表现形式:
内部样式表 ,外部样式表,行内样式表
CSS常用的选择器;
1.标签选择器h1{ }
2.id选择器 #h1{ }
3.类选择器 .h1{ }
4.组合选择器 h1,h2,h3{ }
5.通配符选择器 *{ }
16、八大基本类型: byte short boolean、int、long、float、double、char、
18、this. 和 super.的区别:
this()指向本类
super()指向父类
19、重写和重载的区别:
重写:两同两小一大
两同:方法名 参数类型相同
两小:子类返回类型小于等于父类方法返回类型,子类抛出异常小于等于父类方法抛出异常
一大:子类访问权限大于等于父类方法访问权限
重载:同一个类中,方法名相同参数列表不同
20、final和static的区别:
final :1.被final修饰的类,不能继承
2.被final修饰的方法,不能被重写
3.被final修饰的字段是常量,值不能被修改
static : 静态资源随着类的加载而加载,并且只加载一次,一般用项目的初始化
21、接口和抽象类的区别:
接口:
1.接口是一种用interface定义的类型
2.接口中的方法都是抽象方法,还有默认方法与静态方法
3.接口中的都是静态常量
4.接口没有构造方法,不可实例化
5.接口可以多继承
抽象类:
1.抽象类是一种用class定义的类型
2.抽象类中的方法不做限制
3.抽象类中可以写普通的成员变量
4.抽象类有构造方法,但是也不可以实例化
5.抽象类只能单继承
int length() 获取字符串的长度
char charAt() 获取特定位置的字符 (注意角标越界问题)
int indexOf() 获取特定字符的位置
int lastIndexOf() 获取最后一个该字符的位置
boolean isEmpty()是否长度为0
Boolean contains() 是否包含指定序列
Boolean equals()是否相等
String replace() 替换
String[] split() 切割
String substring()截取字串
String toUpperCase() 转大写
String toLowerCase() 转小写
String trim() 去除空格
23、自动装箱和拆箱
Integer int
24、StringBuffer 和StringBuilder的区别
StringBuffer:线程安全,StringBuilder:线程不安全。
因为 StringBuffer 的所有公开方法都是 synchronized 修饰的,而 StringBuilder 并没有 synchronized 修饰
StringBuilder 的性能要远大于 StringBuffer
25、反射三种方式
1.Class.forName(“包名,类名”);
2.类名.class;
3.对象.getClass();
26、集合的体系结构
collection : 接口层次中的跟接口
list数据有下标,有序,允许存放重复的元素
list分为:
ArrayList :
1.内部是用数组结构,封装数组的操作,每个对象都有下标
2.内部数组默认的初始容量是10,如果不够会以1.5倍的容量增长
3.查询快,增删数据效率会低
LinkedList :
1.底层维护的是链表的结构,有下标,从0开始(头结点)查询慢,增删快
2.内存地址是不连续的,靠着节点的地址连接起来的
3.普通节点保存的是上一个与下一个节点的地址
4.头结点保存的只有下一个节点的地址,尾节点保存的是上一个
set:数据无下标,无序,不可重复
Map:
Map 接口:【键值对的方式存数据】
键不能重复,值可以重复
hashmap 数组+链表 entry
Map存放的都是无序的数据
Map的初始容量是16,默认的加载因子是0.75
存到75%开始扩容,按照2的次幂进行扩容
27、数组:length 属性
数组创建过程:
数组在创建过程中开辟了连续的内存空间,用来存放长度是x,
给数组完成初始化的过程中,给每个元素赋予默认值,int类型的为0,
完成初始化后会分配一个唯一的地址值,把值个地址值交个引用变量
(变量名)来保存
注意:1.数组名是一个引用类型的变量,保存的是地址值,不是数组中的数据
2.一旦创建,长度不可改变,允许长度为0
有两种创建方式:静态 2种
动态 1种
数组工具类有:
Arrays.toString
Arrays.sort(数组排序)
把数组定义一个新的长度:(扩容缩容)
Arrays.copyOf(数组新的长度)
数组的截取:copyOfRange
截取的元素包含开始下标处的元素,不包含结束下标处的元素
含头不含尾(指的是下标)