自我java总结之基础

自我java总结之基础

一.java为什么具有跨平台原理
首先由于操作系统的指令集不同,所以就会让我们的程序在不同操作系统上执行不同的代码,
这时候java通过不同的系统,版本的虚拟机来提供相同的接口。
二,面向对象具有什么特征
四个特征,封装,继承,抽象,多态。
(封装:把客观的事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或对象进行操作,对不可信的进行信息隐藏。
抽象:就是把现实生活中的对象抽象为类
继承:子类继承父类的特征和行为,使得子类具有父类的各种属性和方法。或子类从父类继承方法,使得子类具有父类相同的行为。
多态:多态的特征是表现出多种形态,具有多种实现方式。或者多态是具有表现多种形态的能力的特征。或者同一个实现接口,使用不同的实例而执行不同的操作。)
三,装箱与拆箱(自我理解为包装类)
装箱就是integer(这就是自动装箱) 在实际调用时会调用integer.valueOf(i)来进行装箱
拆箱就是int(这就是自动拆箱) 在实际中会调用intValue()方法
1.有了普通数据类型为什么还要包装类型
因为java主要是面向对象编程,而普通类型不具有对象的性质,所以就创造出包装类,为基本类型添加属性与方法,使其成为一个对象。
也因为往集合中放数据时,基本数据类型是放不进去的。
四,= =与equals的区别是什么?(equals就是比较的意思)
首先= = 的意思是为了比较两个变量之间的值是否相等,变量是基本数据类型和引用数据类型组成的
如果是基本类型的变量直接比较的是值.而引用类型比较的是地址.
而equals比较的则是两个对象长得是否相同
注:引用数据类型就是在栈中分配一块内存,而对象的信息都储存在堆中,这时候就使用栈上面的引用,引用到堆中的对象地址了。
五,String,StringBuffer与StringBuilder的区别是什么?
首先我们知道Sting是内容不可变的字符串(String的底层代码是用final修饰的,也就是所谓的不可改变的字符数组),而StringBuffer和StingBuilder则是内容可变的字符串(StringBuffer和StringBuilder的底层代码是使用可改变的字符数组,并不是使用final修饰的了)。
public final class String
implements java.io.Serializable, Comparable, CharSequence {
@Stable
private final byte[] value;
//StringBuffer和StringBuilder
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
byte[] value;
StingBuffer是线程安全的,但是效率低一些,StringBulider的线程是不安全的,但是效率高一些。
//用String的方法进行拼接
String str=“abc”;
System.out.println(str);
str=str+“de”;
System.out.println(str);
//用StringBuilder的方法进行拼接
String str=“abc”+“de”;
StringBuilder stringBuilder=new StringBuilder().append(“abc”).append(“de”);
System.out.println(str);
System.out.println(stringBuilder.toString());
String的运行速度要比StringBuilder快很多
总结:
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
六,java中的集合
java中的集合分为两种Collection和Map两种
Map主要作用为key(键)-value(值)其中的映射.
注:一个键只可以映射一个值
Collection中具有重要的两个子接口List和Set,List有序可重复,Set无序不可重复
1.ArrayList和LinkedList有什么区别
ArrayList底层代码是数组,LinkedList底层代码是链表(数组在内存中是一块连续的内存,如果删除或插入时需要移动内存)
数组的查询速度比较快,而插入和删除速度比较慢(查询需要从头部开始一个一个的找,所以查询效率低,插入时不需要移动内存,只需改变引用指向即可,所以插入或者删除效率较高)
2.为什么LinkedList插入和删除快?
因为LinkedList它就添加了一个节点,然后保存该节点和前一个节点的引用关系。
那为什么他查询的慢呢?
则是因为他底层是链表,他只能从头开始遍历查询。
3.而为什么ArrayList插入和删除就慢呢?
因为他是基于数组的么,所以他是根据下标进行查询,所以查询快,但是插入和删除会有移动元素的时间,所以慢。
七,HashMap和HashTable有什么区别
1,首先HashMap和HashTable都可以用来修饰k-v的数据。
2,HashMap可以把null作为key或者value,但是HashTable不可以。
3,HashMap是线程不安全的,但是效率高一些,HashTable是线程安全的,但效率低。
1.想要线程安全,还想效率高怎么办
ConcurrentHashMap,把整个的Map分为N个数据,可以提供相同的线程安全同时可以将效率提升N倍,默认提升16倍。
八,拷贝文件时使用的工具类使用字符流还是字节流
拷贝的文件中,是不确定只包含字符流的,也有可能有字节流的东西(图片,音乐等),考虑到综合情况,还是使用字节流。
九,线程(Thread)
注:什么是线程?
线程就是是程序执行的最小单元,一个线程必定属于一个进程,一个进程可以有多个线程。
注:什么是线程池?
线程池就是多线程的一种处理形式。
注:线程池有什么用?
1、限定线程的个数,不会导致由于线程过多导致系统运行缓慢或崩溃。
2、线程池不需要每次都去创建或销毁,节约了资源。
3、线程池不需要每次都去创建,响应时间更快。
1.线程有几种实现方式?
线程是有两种实现方式的,第一种是继承Thread类(其实本身Thread也是实现Runnable接口),第二种是实现Runnable接口。
2.怎么启动线程?
使用Start方法,启动以后就会执行Run方法。
3.如何区分使用的哪个线程?
Thread.setName(”线程名字“)。
十,线程并发库
Java通过Exectors提供四个静态方法创建四种线程池:
方法名 作用
newFixedThreadPool(int nThreads) 创建固定数量的线程池
newCachedThreadPool() 创建缓存的线程池
newSingleThreadExecutor() 创建单个线程
newScheduledThreadPool(int corePoolSize) 创建定时器线程池
注:线程并发库的作用
1.提高资源利用率:线程池可以重复利用已经存在的线程。
2.提高了响应速度:因为线程池中有一些没有被调用的线程,等待任务到来的时候,不需要创建新的线程就可以被执行。
3.有可管理型:线程池会根据当前的系统来进行优化,减少线程的创建或者销毁。
十一,设计模式
1.设计模式都有什么?
1.单例模式
懒汉
在加载的时候不进行初始化,而且线程是不安全的。
饿汉
在加载的时候就进行了初始化,所以导致类的加载就变的慢一些,但获取对象的速度就变的快了。
2.工厂模式
属于创建型模式 ,提供了一种对创建对象最佳的方式。
3.代理模式
属于结构型模式,一个类使用另一个类的功能。
4.装饰器模式
结构性型模式,在一个现有的对象添加新的功能,并且不改变他的结构,也可以叫做包装。
十二,http get和post的区别是什么?
这两种都是http的请求方式
1.首先get请求提交的数据会在地址栏显示出来,post则不会。
2.get输出数据的大小被地址栏所限制。
3.post的安全性要比get高(第一条就能看出来)。
十三,Servlet
很多人有疑问,Servlet到底是干嘛用的
我自己解释一些,其实Servlet就是已经实现了Servlet接口的java程序。
Servlet是一门用于开发动态web资源的技术。
好比说你要开发一个像网页输出数据的程序,你就要使用Servlet接口来向网页输出数据,而完成这个程序,首先你要编写一个java类,实现Servlet接口,在把开发好的java类部署到web服务器上,就ok了。
1.Servlet的生命周期
首先加载Servlet的class–>实例化Servlet–>调用init方法完成初始化–>响应请求(也就是Servlet中的service方法)–>Servlet容器关闭(也就是调用Servlet中的destory方法(destory的意思是毁灭))
十四,jsp和Servlet的异同
jsp和Servlet相同的地方就是,所有的jsp文件最后都会被翻译成继承于Servlet的类。
不同的是,jsp主要侧重于视图,而Servlet主要侧重于控制逻辑
十五,jsp的九大内置对象
1.request对象,代表的是客户端的请求。(他的作用域为一次请求)
2.response对象,代表对客户端的响应(他只在jsp页面有效)
3.session对象,用于保存用户信息。(底层使用Map集合)
4.application对象,将信息保存在服务器中,比session的生命周期更长一些,会保存到服务器关闭的时候。(类似全局变量)
5.out变量,在web浏览器中输出信息。(也就是输出流,out.print()就是输出数据,out.close()就是关闭流)
6.pageContext 对象,获取参数.
7.config对象,获取服务器的配置信息。
8.page对象,就是代表jsp(只有在jsp页面才是合法存在的)
9.exception对象,显示异常信息。(只有在包含 isErrorPage=”true” 的页面中才可以被使用)
十六,jsp的四大作用域
1.pageContext 页面域
页面作用域仅限于当前页面对象
2.request 请求域
3.session 响应域
他的作用域是在一次会话内
4.application 应用域
他的作用域是最大的,只要会话不结束,他就会一直存在。
十七,session和cookie的区别
首先他们都是会话跟踪技术
他们的区别:1.session的数据存放在服务器上,而coolie的数据存放在浏览器上
2. 安全性session要比coolie高
3. session会在一定时间内将数据保存到服务器上,访问量大的时候,会占用服务器的性能
4. 单个coolie的储存量不能超过4k
十八,前端
1.html 超文本标记语言,定义页面的结构
2.css 层叠样式表,美化页面
3.javascript 验证表单做动态交互
十九,ajax
1.什么是ajax
Ajax是一种创建交互式、快速动态网页应用的网页开发技术(无需加载整个网页的情况下,能够更新部分网页的技术)
2.ajax的作用是什么
不加载整个页面的情况下,对一部分页面进行更新
3.怎么实现ajax
使用XMLHttpRequset可以异步向服务器发送请求,获取响应,完成更新。
二十,js和jQuery的区别
jq本身就是一个js框架,在jq里,封装了js 的方法,而且增强了js的功能,让用户使用的更便利
js本身有很多不兼容性,jq完美的解决了这个问题
二十一,jq的常用选择器
元素选择器 通过元素名选取元素
id选择器 通过id选取元素
.class选择器 通过类来选取元素
二十二,jq的ajax和原生js的ajax有什么关系
jq中的ajax是封装好了的,不存在不兼容的问题,而原生js的ajax是存在不兼容问题的
二十三,Html5
在html4的基础上添加了视频,画板,web储存等功能
二十四,Css3
css3在原先的css2的基础上增加了一些功能例如:盒子功能、盒子和文字阴影、渐变、转换、移动、缩放等动画效果。
二十五,bootStrap
bootsStrap是一个移动设备优先于ui的框架,我们不写css代码的情况下,就可以直接完成网页的美化。
二十六,框架
1.框架是干什么用的
特指为了解决开放性问题而设计的具有一定约束的支承结构,简单的说,就是为了更方便的解决问题。
二十六,MVC设计模式
MVC设计模式就是model(模型)+view(视图)+controller(控制器)的缩写。
使用的技术就是js+servlet+javaBean
1.MVC设计模式的流程
1.从浏览器发送请求,控制器(servlet)收到了请求
2.调用javaBean(模型)完成业务
3.跳转到jsp页面进行反馈信息
4.jsp给用户做出响应
注:在整个MVC中,Servlet是最核心的
二十七,Spring MVC的执行流程
1,用户向服务器发送请求,请求被spring前端控制器DispatcherServlet捕获。(捕获)
2,DispaerServlet对请求url进行解析,得到请求资源标识符(URI),然后根据该URI调用HandlerMapping获得该Handler配置的所有相关对象(包括Handler对象以及Handler对象对应的拦截器),最后用HandlerExecutionChain对象的形式返回。(查找Handler)
3,DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter,提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller),Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象。(执行Handler)
4,DispatcherServlet根据返回的ModelAndView,选择一个合适的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)
5,通过ViewResolver结合Model和View,来渲染视图,DispaerServlet将渲染结果返回给客户端。(渲染视图)
核心控制器捕获请求,查找handler执行handler,选择ViewResolver,通过ViewResolver渲染视图并返回。
二十八,Spring MVC 与struts2的异同
核心控制器:Spring MVC的核心控制器是Servlet,而Struts2是Filter。
控制器实例:Spring MVC会比Struts2快一些,Spring MVC是基于方法设计,而Struts2是基于对象设计,每发一次请求都会实例一个action。
管理方式:大部分的公司的核心框架中,就会使用到Spring,而Spring MVC又是Spring中的一个模块,所以Spring对于Spring MVC的控制管理更加简单方便。
参数传递:Struts2中自身提供多种参数接受,其实都是通过ValueStack进行传递和赋值,而Spring MVC是通过方法的参数进行接收。
学习难度:Spring MVC 相较于Struts2更易学习。
interceptor的实现机制:Struts2有自己的interceptor机制,Spring MVC用的是独立的AOP方式。
Spring MVC处理Ajax请求直接通过返回数据,自动帮我们对象转换为JSON对象。而Struts2通过插件的方式进行处理。
二十九,Spring
Spring是java2EE应用程序框架,是轻量级的IOC(控制反转)和AOP(面向切面)的容量框架,主要是针对javabean的生命周期进行管理的轻量级框架。
1.谈谈我自己对Spring的理解
所谓Spring,其核心就是IOC和AOP。
(1)何为IOC
所谓控制反转就是你想要获取对象的时候,通过反射来获取对象。底层就是使用依赖注入模式。
IOC的核心就是不使用控制资源的双方管理,而是使用不控制资源的第三方进行管理。这样就让资源可以更好的进行调配,也降低了耦合度。
(2)何为AOP
所谓面向切面的编程,也就是说,它会把相对独立的功能抽取出来,然后在使用Spring的配置文件(XML)进行插入,可以说是实现了重复利用,而且大大减少了重复的代码量,并且使得以后的维护和管理更加方便了。
Aop中的jdk动态代理是通过反射机制实现的。(还有一个CGLIB的动态代理)
注:java中jdk的动态代理只能实现接口,而新型的CGLIB可以实现类的动态代理
三十,Spring事物的传播特性
PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW
新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED
以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作。
三十一,ORM(对象关系映射)
首先要了解持久化与持久层
所谓持久就是将数据永久保存于磁盘或者储存设备中。持久化,就是把数据永久保存于关系性数据库中。
而持久层就是专注于实现持久化的一个逻辑层面。
ORM就是在关系型数据库和对象之间做一个映射
而使用ORM对象关系映射的好处就是解耦和。
好比说MVC的设计模式,其中Model(模型)和view(视图)就是实现了表现层的解耦和
而其中最为重要的Controller(控制层)就使用了持久化的ORM对象关系映射,也就是对象与数据之间的映射技术。

  1. 简单:以最基本的形式建模数据。
  2. 传达性:数据库结构被任何人都能理解的语言文档化。
  3. 精确性:基于数据模型创建正确标准化了的结构。
    三十二,MyBatis和Hibernate有什么异同
    1,首先他们两个都是java中ORM框架。
    2,不同点是Mybatis不可以自动生成SQL语句,Hibernate是可以自动生成SQL语句的。
    3,mybits是我们自己在xml文件中配置sql语句,而Hibernate是不可以的,也就是说,缺少了灵活性。
    4。Mybatis是面向sql的,不需要考虑映射关系,相对HIbernate要简单的多。
    三十三,WebService
    WebService是一个SOA(面向服务编程),他是一个不依赖语言,不依赖平台,可以实现不同语言之间的相互调用。
    WebService他的用处就是通过http协议在客户端与服务端之间传输数据。他使用了XML来把数据进行封装,而XML最大的有点就是具有跨平台性。
    他最大的作用就是,他可以实现不同的语言之间,不同客户端之间的整合。
    它遵从了SOAP(简单对象访问协议),然后通过http来进行传输。
    三十四,activiti
    activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和管理员,其核心是超快速、稳定的BPMN2流程引擎,它易于与spring集成使用。
    主要用于在OA中,把线下流程放到线上来,把现实生活中一些流程图定义到系统中,然后通过输入表单数据完成业务。
    它主要用在OA系统的流程管理中。
    例:请假流程:小于三天–>一级主管审批,大于三天–>二级主管审批。
    三十五,Linux
    Linux是一个长时间运行并且稳定的操作系统,他可以对C语言进行编译。
    1.Linux的常用命令
    pwd 获取当前路径
    cd 跳转到指定目录
    su 切换用户身份
    ls 列举当前目录的文件和文件夹
    文件操作命令
    cat 查看
    rm -rf 删除
    vi 修改
    文件夹的操作
    mkdir 创建文件夹
    三十六,数据库的分类和常用的数据库
    1.数据库的分类
    关系型数据库(mysql,oracl,sql service)
    非关系性数据库(redis,mogodb,hadoop)
    2.数据库的三范式(也就是三个规范)
    第一范式:数据表中每个字段都必须是不可拆分的最小单元,也就是确保每一列的原子性;
    第二范式:满足一范式后,表中每一列必须有唯一性,都必须依赖于主键;
    第三范式:满足二范式后,表中的每一列只与主键直接相关而不是间接相关(外键也是直接相关),字段没有冗余。
    (1).第一范式(无重复的列)
    他的要求就是数据库表每一列都是不可分割的原子项。
    (举个例子:就是比如你说你的家庭信息里有3口人,杭州。这就不满足一范式,你要把他变成家庭人口和居住地点两个列,这样才满足第一范式)
    表一不满足,表二满足
    (2).第二范式(属性必须依赖于主键)
    首先要满足第一范式的前提,但是有两个属性的主键的时候,就不可以了。
    通俗的解释:一张表里面的所有字段,只可以依赖一个主键。
    (下面的表里面的学生证和借书证这两个字段就没有关系,所以把他分成两个表)
    eg:比如不符合第二范式
    学生证名称 学生证号 学生证办理时间 借书证名称 借书证号 借书证办理时间
    改成2张表如下
    学生证表
    学生证名称 学生证号 学生证办理时间
    借书证表
    借书证 借书证号 借书证把你拉时间
    (3)第三范式(属性不能依靠传递来依赖于主属性)
    首先要满足第二范式的前提
    打个比方说,你的表里面主键是爸爸,跟爸爸有关的有女儿和儿子,而后面还有别的字段是女儿的小熊,这个时候,女儿的小熊这个字段就属于通过女儿连接到爸爸这个主键上的,也就是所谓的靠传递来依赖于主属性,这就是不行的。
    eg:爸爸资料表,不满足第三范式
    爸爸 儿子 女儿 女儿的小熊 女儿的海绵宝宝
    改成 爸爸信息表:
    爸爸 儿子 女儿
    女儿信息表
    女儿 女儿的小熊 女儿的海绵宝宝
    注:反三范式:有时候为了效率,可以设置重复的字段
    三十七,事物的四大特征
    首先我们要了解到什么是事物:简单来说,就是处理一些数据时用到的操作,这些操作要么都做,要么都不做,是一个不可分割的工作单位。
    事物的用处:主要是为了处理数据操作量大,且复杂度高的数据。
    原子性:不可再分,要么都成功,要么都失败
    一致性:要么都成功,要么都失败,如果前面的成功了,后面的失败了,要对前面的数据进行回滚
    隔离性:一个事物开始后,就不会受到干扰
    持久性:一旦事物开始了,就不可以终止
    三十八,mysql数据库的默认最大连接数
    首先我们要知道为什么需要这个mysql的最大链接数
    因为特定的服务器上的数据库只能支持一定数目的链接,mysql的默认最大连接数是100.
    三十九,mysql和oracle的分页语句
    首先我们要了解为什么需要分页这个功能
    因为我们在查询很多的数据时,不可能在一页内完全显示出来。
    mysql的分页是使用关键字limit
    oracle的分页是使用关键字rownum
    四十,触发器的使用场景
    触发器是通过事件来触发的,并不是手动启动或者是有程序调用的。
    触发器的作用:写入数据表之前,强制检验或转换数据。
    触发器发生错误时,异动的结果会被撤销。
    部分数据库管理系统可以针对数据定义语言(DDL)使用触发器
    可依照特定的情况,替异动的指令。
    1.触发器的分类
    DML触发器
    DDL触发器
    登陆触发器
    2.触发器的使用场景
    触发器需要触发条件,当条件满足以后做什么操作。
    四十一,JDBC(数据库链接)
    这是一种用于执行SQL语句的java API
    它是由java语言编写的类或接口组成,他的作用就是用于连接数据库。
    四十二,JDBC中prepareStatement相比Statement的好处
    1,prepareStatement是预编译的,要比Statement快
    2,prepareStatement的安全性高,他可以防止sql注入攻击
    四十三,数据库连接池的作用
    1.资源复用
    由于数据库连接得到了重用,就避免了频繁的创建新的链接,极大的减少了系统的消耗。
    2.更快的系统响应速度
    数据库连接池在初始化时,就创造了很多链接以作备用。一旦有请求的业务,就可以直接调用已经创造好的链接,
    如此就是提高了系统响应速度。
    3.避免资源泄露
    四十四,数据库优化方面的事情
    1.查找,定位慢查询并优化
    2.创建索引:先创建一个合适的索引,在索引中先进行查询,查询后直接找到对应的记录
    3.分表:当一张数据库表中的字段比较多而且很少使用的时候,就可以通过分表来进行优化。
    4.读写分离:当一台服务器不能满足需求时,采用读写分离来进行集群
    5.缓存:通过redis来进行缓存
    四十五,查找慢查询,并定位慢查询
    在项目运转时,总有的sql语句执行的会比较慢,我们把执行慢的语句通过日志记载下来,然后找到慢查询的语句来进行优化。
    四十六,选择合适的数据库引擎
    首先我们要知道什么是数据库引擎,
    引擎就是一个程序或者系统的核心组件
    1.innoDB存储引擎
    innoDB给mysql数据库提供了事物处理,回滚,崩溃修复等功能。
    它的优势就在于可以提供良好的事物处理,崩溃修复能力和并发控制。缺点就是读写效率要差一些,占用数据的空间要大一些。
    如果对事物的要求高的话,就是用innoDB,来保存数据之类的
    2.myisam存储引擎
    它的优势是占用空间小,处理速度快。缺点是不支持事物的并发性和完整性。
    如果对事物的要求不高,都是添加和查询一类的就使用myisam
    3.memory存储引擎
    这个使用的很少,因为每次关机或者重启,他的所有数据都会消失,只适用于一次性的。
    数据变化量较大,不需要存储入库,同时又频繁的查询修改,就会使用memory,他的速度极快。
    拓展:myisam和innoDB的区别有什么
    1.myisam不支持事物,而inniDB支持事物
    2.myisam不支持事物就不需要考虑同步锁
    3.myisam支持全文索引,innoDB不支持
    4.myisam是表锁,innoDB是行锁(事物)
    5.Myisam不支持外键,innoDB支持(很少用到)
    四十七,选择合适的索引
    首先我们要知道什么是索引
    好比说你要在图书馆找一本书,而索引就是图书馆的目录,能让你快速准确的找到这本书。
    官方说法是:索引是帮助DBMS(数据库管理系统)高效获取数据的数据结构。
    他分为:
    普通索引:允许重复的值出现
    唯一索引:除了不能有重复的记录以外,和普通的索引一样
    主键索引:当你设置主键时,就会给该列设置主键索引,并且唯一和不能有null值。
    全文索引:用来对表中的文本域进行索引。
    四十八,索引的使用小技巧
    他的使用场景:
    1.经常使用where条件查询,
    2.该字段的值不是唯一的值
    3.表的字段变化不能太频繁
    索引的弊端:
    1.占用磁盘空间
    2.对dml(数据库操作语言 增删改查的操作)有影响,会变慢。
    四十九,数据库优化之分表
    首先你要了解为什么要有分表这个技术,换句话说就是他能做什么?
    你要知道,有很多时候你存放的数据过多,一张表有很多数据量,这个时候你把表进行拆分,来提高数据库的性能
    分表分为水平分表和垂直分表。
    水平分表,好比说你有一个表里面存放了400w用户,为了提高查询效率,你把他分为4张表。
    1.按时间分表
    2.按区间范围分表
    3.hash分表
    五十,数据库优化之读写分离
    首先我们简单的解释一下读写分离到底是干什么的。
    我们都知道,现在很多时候,我们都是进行读取数据,少部分才会进行写入数据,
    所以读写分离就是把读取操作和写入操作分离开来,让这两种操作去访问不同的数据库。也就是我们口中的mysql集群处理技术。
    但是这时候我们就要考虑到数据库有一个特性,他的数据必须保持一致性,我们怎么能保持数据一致性呢?
    这时候就提到了一个新技术
    1.主从同步
    把可以改变的数据库的操作都往主数据库上写,其他的数据库再去主数据库进行数据同步。这就是主从同步。
    接下来我们要介绍另一种技术
    2.负载均衡
    四层(转发)他根据修改客户端传来的目标地址,来分配给不同的服务器
    七层(代理)他使得网络更加“智能化“
    还是这个问题,首先我们要知道什么才是负载均衡和他是干嘛用的。
    我们都知道,用户通过浏览器进行访问服务器,在访问人数少的时候,一台服务器完全可以处理的来,但是访问量大的时候,一台服务器处理不了了,就会产生负载(排队)的现象。这个时候你就需要服务器集群(多台服务器)来处理这些访问量,但是你又没办法将访问量平均的分给每一台服务器,这时候就要用到Load Balancer(负载均衡)这个中间层了。
    以上是load Balancer(负载均衡)的用处,下面了解一下他底层使用的算法。
    首先第一个是Round Robin(轮询):
    他就是很简单的一个,从排序为第一个的服务器进行选择,依次往下直到最后一个服务器,然后重新进行循环。
    注:而这时候就要考虑到一个点,如果说你的所有服务器都是一样的性能的情况下,上面的这个方法是可以的,但是,你总会有的服务器好一些,有的就要差一些,那你要是这样进行平均轮询分配,那么就不是那么合理了嘛。
    于是我们又有了一个好的处理办法,他的名字是:
    加权轮询。
    那什么是加权轮询呢?那就是给每一个服务器加一个权重,每一个服务器的权重满了,才会去下一个服务器,然后在进行轮询。
    同时这个时候我们又有一个问题出现了,每次这么进行轮询的时候他第一个服务器总会在运行,只有满了才会去第二个,我们就想让那些连接数少的服务器进行链接,那要怎么办呢?
    于是我们有了另一个好的办法
    最小连接
    他的作用就是在多个服务器中选择连接数最少的一台服务器进行连接。
    还有什么hash算法,ip地址算法啊。。。。、
    五十一,sql语句优化小技巧
    1.DDL(数据库定义语言)优化
    1.通过禁用索引来提供导入数据性能,这个操作主要针对有数据库的表追加数据。
    2.关闭唯一校验:set unique_check = 0 //关闭
    3.修改事务提交方式(导入)变多次提交为一次提交:set autocommit = 0 //关闭
    2.DML(数据库操纵语言)优化
    insert into test values(1,2);
    insert into test values(1,3);
    insert into test values(1,4);

    //合并多条为一条
    insert into test values(1,2) (1,3) (1,4);
    3.DQL(数据库查询语言)优化
    order的优化:
    1.多用索引排序
    2.普通结果排序
    五十二,JDBC批量插入几百万条数据怎么实现?
    1.变多次提交为一次
    con.setAutoCommit(false);
    2.使用批量操作。
    preparedStatement.executeBatch()
    五十三,redis
    还是那个问题,我们首先要知道什么是redis?
    首先redis是一个nosql数据库,也就是非关系型数据库,key-value
    他是一个开源的,基于内存的数据结构存储器,可以用做数据库,缓存和消息中间件
    1.目前redis支持五种数据类型
    1.String(字符串)
    2.list(字符串列表)
    3.set(字符串集合)
    4.sorted set(有序字符串集合)
    5.hash(哈希)
    而关于key,有几个点要提醒大家:
    1.key不要太长,尽量不要超过1024字节,这不仅消耗内存,而且会降低查找的效率;
    2.key也不要太短,太短的话,key的可读性会降低;
    3.在一个项目中,key最好使用统一的命名模式,例如user:10000:passwd。
    2.如果面试官询问在同一时间有大量的KEY要过期,一般要注意什么?
    如果大量的Key在同一时间过期,redis可能会出现卡顿现象,我们可以在时间上加一个随机值,使得过期的时间变的分散一些。
    3.你使用过Redis分布式锁么?他是干什么的?
    先使用setnx来争抢锁,在使用expire给锁加一个过期的时间防止锁忘记释放。
    4.使用Redis做过异步队列么?你是怎么使用的?
    一般使用list结构做队列,rpush生产消息,lpop消费消息,当lpop没有消费消息的时候,要sleep一会在重试。
    5.Redis雪崩,缓存穿透,缓存击穿
    在一个时间段里,key刚好都失效的时间段,突然进入了一个高峰,不停的请求会直接跳过缓存,直接请求数据库,数据库必然扛不住,DBA(数据库管理员)会报警,然后重启数据库,然而刚启动的数据库又一次直接被请求打死,这就是我理解的雪崩。
    解决:给你的每一个key加一个随机时间,这样子就不会所有的key同一时间失效,就不会出现雪崩的现象了。
    缓存穿透则是你的数据库和缓存中都没有的数据被一直请求,导致数据库的压力变大,就会打垮数据库。
    解决:我会在接口层增加校验,比如用户鉴权校验,参数做校验,不合法的参数直接代码Return,比如:id 做基础校验,id <=0的直接拦截等。
    缓存击穿就是一直访问你一个点,这个点就一直扛着大并发,直到他扛不住了,失效了的瞬间,就会直接对数据库进行请求,这就是缓存击穿。
    解决:设置热点数据永远不过期。或者加上互斥锁就能搞定了。
    五十四,redis储存对象的方式
    通过json字符串:把对象转换成json字符串,直接使用set,get来这只或者获取。
    通过字节:需要做序列化,把对象序列化成字节保存
    五十五,redis数据淘汰
    Question: 为什么要淘汰?
    Answer: 内存有限,需要保存有效的数据。
    • volatile-lru:使用LRU算法进行数据淘汰(淘汰上次使用时间最早的,且使用次数最少的key),只淘汰设定了有效期的key
    • allkeys-lru:使用LRU算法进行数据淘汰,所有的key都可以被淘汰
    • volatile-random:随机淘汰数据,只淘汰设定了有效期的key
    • allkeys-random:随机淘汰数据,所有的key都可以被淘汰
    • volatile-ttl:淘汰剩余有效期最短的key
    五十六,java访问redis和redis集群
  4. 使用jedis java客户端来访问redis服务器,有点类似于jdbc访问mysql一样。
  5. 如果是Spring进行集群时,可以使用Spring data 来访问redis,spring data是对jedis的二次封装,类似于jdbcTemplate 和JDBC之间的关系
    redis集群:当一台数据无法满足需求时,可以使用redis集群来处理,类似于mysql的读写分离。
    五十七,缓存怎么保证和数据库的数据一致性
    1.搞一个缓存的失效时间,尽可能的保证数据一致
    2.先将缓存删除掉,然后去更新数据库,在去更新缓存(有可能造成访问到了数据库的旧数据,引发脏读的问题,使用强一致可以进行处理,只不过会稀释一些性能)

注:以上仅代表个人意见,如果大家发现问题欢迎指正,本人只是小白一名,跟大家一起进步。
–甜橙棒棒糖

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值