varchar和nvarchar区别
1、varchar是非Unicode编码,nvarchar是Unicode编码;
2、varchar的最大值是8000,nvarchar是4000;
3、varchar能存储的字节数是它的长度,nvarchar能存储的字节数是它长度的2倍;
4、varchar比nvarchar更省空间。
表单重复提交解决办法?
前端:设置按钮只触发一次,提交按钮变灰。
后端:使用token+session
第一步,用户调用后台接口;
第二步,后台生成sessionToken传到前端;
第三步,前端将sessionToken传到后台;
第四步,后台将第一次生成的sessionToken和前端传来的sessionToken进行对比,如果一致就可以提交表单,不一致就表示表单重复提交了。
mysql大数据量存储
按规则进行分库分表
JDK1.8中HashMap的变化
1.8之前:HashMap处理“碰撞”的时候,都采用链表来存储,当碰撞的节点很多时,查询时间是O(n).
1.8中:HashMap处理“碰撞”增加了红黑树数据结构,当碰撞节点较少时,采用红黑树存储,当较大时(>8个),采用红黑树存储。
Redis缓存的优势
1、读写性能很高;
2、redis支持多种数据类型。存储的是key-value格式的数据,其中key是字符串,value的数据类型有String、list、set、有序集合zset(sorted set);
3、非关系型数据库;
4、持久化:redis的持久化方式有rdb和aof两种;rdb是将内存中的数据压缩后写入到硬盘上,aof是将日志整理写到硬盘中,并设置不同的持久化方式,有效的额减轻了服务器的压力,同时在很大程度上防止了数据的丢失。
SpringCloud
组件:
Eureka(注册中心):各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里。由服务端和客户端组成;服务端:做服务注册中心,客户端:用来处理服务注册与发现;在应用启动时,客户端向服务端注册自己的服务信息,同时将服务端的服务信息缓存到本地,客户端会和服务端周期性的进行心跳交互,以更新服务租约和服务信息。
Ribbon(客服端负载均衡):服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台。
Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
Hystrix(断路器):起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题。
Netflix Zuul(服务网关):如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务。
Spring Cloud Config(分布式配置):配置管理,提供服务器端和客户端。
详细讲解可以查看:https://blog.csdn.net/yeyazhishang/article/details/84344402
表结构及索引优化
1、分库分表、读写分离;
2、为字段选择合适的数据类型;
3、将字段多的表分解成多个表,增加中间表;
4、混用范式和反范式,适当冗余;
5、为查询创建必要索引,但避免滥用;
6、列字段尽量设置为not null。
SQL优化
1、寻找最需要优化的语句:分析满查询日志;
2、利用分析工具:explain、profile;
3、避免使用select * ,只取需要的列;
4、使用索引扫描排序;
5、避免where子句对字段进行null值判断;
6、避免where子句使用 !=、<>操作符和or连接条件;
7、连续的数值,能用between就不要用in
建表三范式:原子性、主键唯一性、减少表与表之间的字段冗余
补充:
创建索引注意事项
1、增删改操作较多的表不要创建索引;
2、不要在大的文本字段或超长字段建立索引;
3、不要在取值朝一个方向增加的字段(如:日期)上创建索引
索引何时失效
1、like未使用最左前缀,如where A like "%China";
2、搜索一个索引而在另一个索引上做order by;
3、or会使索引失效;
4、若列是字符串类型,要使用引号
JDBC连接数据库的步骤
1、加载驱动;
2、创建数据库连接;
3、创建Statement对象,执行SQL语句;
4、获取结果集,遍历结果集;
5、关闭资源,关闭数据库。
Servlet生命周期
首先:加载servlet的class,实例化servlet;
然后:初始化servlet调用init()方法;
其次:调用服务的service的方法处理doGet()和doPost()方法;
最后:关闭容器时调用destroy()销毁方法。
JAVA特性
封装:将对象的属性私有化,对外提供get,set方法,隐藏具体的实现
继承:子类继承父类的属性和方法,并根据需要扩展新的属性和方法,提高了代码的复用性
多态:一种事物的不同表现形态。例如:重写和重载
Throwable
Throwable继承自Object类,子类主要是Error和Exception类。
Error:程序无法处理的错误,只能重启系统。
Exception:运行时异常和非运行时异常;
运行时异常:只有运行时才会出错,所以不需要try catch捕获,由虚拟机帮我们捕获;
非运行时异常:写代码的时候出错会提醒我们try catch或throws;
常见的运行时异常:
1、ClassCastException;
2、ClassNotFoundException;
3、IndexOutBoundsException;
4、NullPointerException;
5、ArrayStoreException;
6、SQLException;
7、ArithmeticException;
8、NumberFormatException
常见的非运行时异常:
1、IOException;
2、FileNotFoundException
Nginx(负载均衡器)
是一个高性能的WEB服务器和反向代理服务,最常用的软件负载均衡器。(网易、淘宝、腾讯、新浪等等互联网公司)
核心概念:用户请求先到Nginx,再由Nginx转发请求到后面的应用服务器(如:Tomcat)
Nginx常用作Http反向代理(接收和转发请求)
Http请求的处理包括解析和封装Http内容
负载均衡算法:1、轮循均衡,2、权重轮循均衡,3、随机均衡
LVS-负载均衡器
核心概念:原本是请求LVS服务器的数据包,被LVS软件篡改了数据包的目的地,将流量转移到了Nginx所在的机器IP,从而实现负载均衡
LVS属于七层协议中的第四层-传输层,使用的协议(如TCP)内容比Http简单,解析和组装所消耗的CPU、内存等资源比Nginx要低,所以LVS比Nginx快,另外Nginx支持1W~10W并发,而LVS支持10W~50W并发
常用组合:Nginx+Tomcat或者LVS+Nginx+Tomcat
Dubbo
dubbo是一个由阿里巴巴开源的、分布式的RPC(Remote Procedure Call Protocol-远程过程调用)和微服务架构,现为Apache顶级项目
Dubbo提供了三个关键功能:
- 基于接口的远程调用;
- 容错和负载均衡;
- 服务自动注册与发现
Dubbo结构图:
Container:服务运行容器;
Provider:暴露服务的服务提供方;
Registry:服务注册与发现的注册中心;
Consumer:调用远程服务的服务消费方;
Monitor:统计服务的调用次数和调用时间的监控中心
SpringMVC
请求处理流程图:
①:DispatcherServlet是springmvc中的前端控制器(front controller),负责接收request并将request转发给对应的处理组件.
②:HanlerMapping是springmvc中完成url到controller映射的组件.DispatcherServlet接收requ