java面试84讲

    面试84讲

 

02.java跨平台原理

    java通过不同的系统、版本、位数的java虚拟机(jvm),来屏蔽不同的系统指令集差异而对外提供统一的接口(java API),对于普通的java开发而言,只需按照接口开发即可。当系统需要部署到不同的环境时,只需在系统上面安装对应版本的虚拟机即可。

 

03.搭建一个java的开发环境步骤

    java开发环境需要什么?

        1.适用于开发环境的jdk

        2.对应开发环境eclipse

        3.web服务器(tomcat)

    步骤:

        1.下载对应组件

        2.安装

            jdk按照正常流程安装即可,配置JAVA_HOME,因为后面的eclipse和tomcat会依赖于这个变量。

            eclipse正常解压即可,设置workspace的默认编码。

            tomcat正常解压即可,把tomcat集成到eclipse中,安装插件。

            ...   

            svn/git

 

04.java中int占几个字节

    int 占4个字节,32位

    boolean 1位

    

05.java面向对象的特征

    四大特征:封装,继承,多态,抽象

    封装:将对象封装成一个高度自治和相对封闭的个体,对象状态(属性)由对象自己的行为(方法)来读取和改变。如张三这个人就是对象,他的名字等属性,要有自己提供的方法来操作。private name  setName getName

    继承:在定义和实现一个类时,可以在一个已经存在的类的基础上来进行。如遗产继承

    多态:父类引用指向子类对象

    抽象:找出一些事物的相似共性之处,然后将这些事物归为一个类。就是把现实生活中的对象,抽象为类。

 

06.装箱和拆箱

    有了基本数据类型,为什么还要包装类型?

        java是一个面向对象的语言,而基本数据类型,不具备面向对象的特性。没有封装一些好用的方法。也没有缓存值。如使用Integer和int分别表示Person这个类的id,当要判断Person存不存在就通过id来判断,如果int的话不仅不能用null来判断还要判断是否为0,Integer只需判断它是否为空即可。

        基本数据类型:byte short int long float double char boolean

        引用数据类型:每一个基本的数据类型都会一一对应一个包装类型,Byte Short Integer Long Float Double Character Boolean

    装箱和拆箱:

        装箱:把基本数据类型转换成对应的包装类型。如Integer i=1;//自动装箱,jdk1.5后的新功能,实际上在编译时会调用Integer.valueof()方法来装箱。

        拆箱:把包装类型转换为型基本数据类。如:基本数据类型 名称 = 对应的包装类型;   Integer i = 1;int j=i;//自动拆箱。(int j = i.intValue();//手动拆箱)

        自动拆箱实际上会在编译时调用intValue方法

 

07.==和equals的区别

    ==用来判断两个变量之间的值是否相等,变量分为基本数据类型和引用类型,基本数据类型的变量直接比较值,引用类型的变量要比较对应的引用内存的首地址。

    equals用来比较两个对象长得是否一样。判断两个对象的某些特征是否一样。实际上就是调用对象的equals方法进行比对。

 

08.String和StringBuilder的区别?StringBuffer和StringBuilder的区别?

    在java中提供了三个类String,StringBuilder,StringBuffer来表示和操作字符串。字符串就是多个字符的集合。

    String和StringBuilder的区别:

        String是内容不可变的字符串。String底层使用了一个不可变的字符数据(final char[])(final修饰的类不能被继承,修饰的变量不能改变是常量)

        

        StringBuilder,StringBuffer是内容可变的字符串。底层使用的是可变的字符数组(没有使用final来修饰)底层判断容量够不够,不够就扩展。它们都继承自抽象类AbstractStringBuilder。

        

        最经典的就是拼接字符串:

            1.String进行拼接 String c="a"+"b";

            2.StringBuilder或StringBuffer:StringBuilder sb =new StringBuilder(); sb.append("a").append("b");

        所以拼接字符串不能使用String进行拼接,要使用StringBuilder或StringBuffer。因为String的时候要创建很多的中间对象。

 

        StringBuilder是线程不安全的,效率较高;而StringBuffer是线程安全的,效率较低。

        

 

            

 

09.讲一下java中的集合

    java中的集合分为两种:Collection(存值)和Map(存键值对)。

    Collection分为List和Set。List有序可重复。Set无序不可重复, Set判断两个对象相同不是使用==运算符,而是根据equals方法,根据equals和hashCode判断,也就是如果一个对象要存储在Set中,必须重写equals和hashCode方法

    Map

 

10.ArrayList和LinkedList

    ArrayList底层使用的是数组,数组具有索引,查询快,插入删除慢,因为数组在内存中是连续的,插入和删除需要移动内存。

    LinkedList使用的是链表,插入删除快,查询慢。链表不要求内存连续,在当前元素存放下一个或上一个元素的地址。查询时从头部开始一个一个的找,效率低。插入删除时不需要移动内存,只需改变引用指向即可。

 

11.HashMap和HashTable的区别?HashTable和ConcurrentHashMap的区别?

    相同点:HashMap和HashTable都可以用来存储key-value的数据。

    区别:

        1.HashMap可以把null作为key或value;HashTable不可以。

        2.HashMap是线程不安全的,效率高;HashTable是线程安全的,效率较低。

    但我想线程安全又想效率高?

        把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但效率提升N倍,默认提升16倍。

 

12.实现一个拷贝文件的类使用字节流还是字符流?

    使用字节流。因为字节流只支持字符,不支持图片,声音等格式。

 

13.线程的实现方式,怎么启动线程,怎么区分线程?

    线程实现方式:

        1.通过继承Thread类实现一个线程,重写run方法

        2.通过实现Runnable接口实现一个线程,重写run方法

        继承扩展性不强,java只支持单继承,如果一个类继承Thread就不能继承其他类了。

    怎么启动线程?

        Thread thread = new Thread(继承了Thread的对象/实现了Runnable的对象)

        thread.start();

        注:启动线程使用start方法,启动线程以后执行的是run方法。

    区分线程?如在一个系统中有很多线程,每个线程都会打印日志,我想区分是哪个线程打印的怎么办?

        在代码里写,thread.setName("线程名");在创建线程完成后,设置名称。获取名称用Thread.currentThread().getName();

        设置线程名称:   

            1.thread.setName("线程名");

            2.new的时候选两个参数的构造方法                

 

14.线程并发库和线程池的作用

    有没有使用过线程并发库?

        简单了解过。jdk1.5中增加了java.util.current包,提供了对线程的优化、管理等各项操作。使线程的使用更得心应手,该包提供了线程的运行,线程池的创建,线程生命周期的控制。

    java当中怎么创建线程池?

        java通过Executors这个类提供四个静态方法创建四种线程池:

            newCachedThreadPool:创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

            newFixedThreadPool:创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

            newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行。

            newSingleThreadExecutor:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。

    线程池的作用:

        1.限定线程的个数,不会由于线程过多导致系统运行缓慢或崩溃。

        2.线程池不需要每次都去创建或销毁,节约了资源。

        3.线程池不需要每次都去创建,响应时间更快。

 

15.设计模式和常用的设计模式

    设计模式:经过前人无数次的实践总结出的,设计过程中可以反复使用,解决特定问题的设计方法。

        单例模式:(饱汉、饥汉)一个对象成为系统的唯一实例。

            1.构造方法私有化

            2.在类中创建一个单实例(饱汉一出来就创建,饥汉需要时才创建)

            3.提供方法获取该实例对象(饥汉创建时需要进行方法同步)

            

                      

        工厂模式:对象的创建交给一个工厂。如Spring IOC使用了工厂模式。

        代理模式:通过接口或抽象类声明真实角色的实现。Spring AOP使用的动态代理。

        观察者模式:定义对象间的一对多模式,当一个对象的状态改变,依赖它的对象都得到通知并更新。

        装饰模式:不改变原类文件和使用继承的情况下动态的扩展一个对象的功能。如BufferedReader

        适配器模式:将一个类的接口转换成客户希望的另一个接口。如InputStreamReader。

 

16.http的get和post请求的区别?

    get和post请求都是http的请求方式,用户通过不同的http请求方式完成对资源(url)的操作。GET,POST,PUT,DELETE对应着这个资源的查,改,增,删操作,具体来讲GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。

    区别:

        1.get请求提交的数据会在地址栏显示出来,post不会。get提交,请求的数据会附在URL之后,以?分割URL和传输数据,多个参数用&连接;post提交,把提交的数据放在http包的包体中,地址栏不会改变。

        2.传输数据大小:由于浏览器对地址长度的限制而导致get传输的数据有限,post请求不会因为地址长度限制而导致传输数据限制。

        3.安全性:post比get安全性高。get请求参数会在地址中呈现,所以会暴露密码等信息。

    

17.说说你对Servlet的理解

    Servlet(Server Applet),全称Java Servlet,是用java编写的服务器端程序。这些程序(Servlet)都要直接或间接实现Servlet接口。主要功能是交互式的浏览和修改数据,生成动态web(网页)内容。Servlet运行于支持java的应用服务器中。

    实际在编写时,继承HttpServlet重写doGet和doPost方法或者重写service方法完成对get和post请求的响应。它是一种服务器端的请求,客户端通过http请求发送请求给服务器,然后服务器找到对应的Servlet,通过service方法或者doGet,doPost方法响应请求。

    Servlet容器会将所有的请求发送到service方法,这个方法默认会将请求转发给doXXX方法,如果重载了改方法,默认操作被覆盖,不再进行转发操作。

 

18.Servlet的生命周期

    Servlet有良好的生命周期的定义,包括加载、实例化、初始化、处理请求、服务结束。这个生命周期由javax.servlet.Servlet接口的init,service,destory方法表达。

    加载Servlet的class -- 实例化Servlet -- 调用Servlet的init方法完成初始化 -- 响应请求(Servlet的service方法) -- Servlet容器关闭(Servlet的destory方法)。

    Servlet启动时,Servlet生命周期开始,Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动运行与请求对应的doGet或doPost方法,当服务器决定将实例销毁的时候(服务器关闭)调用其destory方法。

 

19.Servlet API中forward()和redirect()的区别?

    1.一次请求一次响应;两次请求两次响应

    2.服务器端的转向,效率高;客户端的跳转

    3.浏览器地址不发生改变;发生改变

    4.请求转发路径不带工程名,重定向需要带工程名路径

    注意:如果需要使用request进行值传递,需要通过请求转发完成。

 

20.jsp和Servlet的相同点和不同点?

    相同点:jsp是Servlet的扩展,所有的jsp文件都会被翻译为一个继承HTTPServlet的类,也就是说jsp最终也是一个Servlet,这个Servlet对外提供服务。

    不同点:jsp侧重于视图,Servlet用于控制逻辑

        Servlet如果要实现html功能,要使用Writer输出对应的html,比较麻烦。jsp是java和html组合成的文件,做界面展示很方便而嵌入逻辑复杂。

 

21.内置对象、四大作用域和页面传值

    九大内置对象:

        1.request:用户端请求,包含来自GET/POST请求的参数。

        2.response:网页传回用户端的回应

        3.pageContext:管理网页的属性

        4.session:与请求有关的会话

        5.application:Servlet正在执行的内容

        6.out:用来传送回应的输出

        7.config:Servlet的构架部件

        8.page:jsp网页本身

        9.exception:针对错误网页,未捕捉的例外

    四大作用域:pageContext、request、session、application,可以通过jstl从四大作用域中取值。

    jstl:开源的jsp标签库。

    jsp传递值:request、session、application、cookie都能传值。

 

22.session和cookie的区别?哪些地方使用?

    共同点:session和cookie都是会话跟踪技术。

    session的实现依赖于cookie,session的唯一标识sessionId需要存放在客户端。

    区别:

        1.cookie数据存放在浏览器上,session数据放在服务器上。

        2.cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。

        3.session会在一定时间内保存在服务器上,当访问增多,会比较占用服务器性能,考虑减轻服务器压力,使用cookie。

        (cookie不安全,session占内存)

        4.单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。

    使用场景:

        登录等重要信息放在session中,其他不重要的放cookie。如:购物车最好使用cookie,但cookie是可以在客户端禁用的。这时要使用cookie+数据库的方式实现,当从   cookie中不能取出数据时,就从数据库获取。

 

23.mvc模式和mvc各部分的实现

    M(model)模型:JavaBean

    V(view)视图:jsp,html,volicity,freemarker

    C(controller)控制器:Servlet,Action

    最经典的mvc模式:jsp+Servlet+JavaBean,实际上就是model2的实现方式,就是把视图和逻辑隔离开来。

    model1的方式:jsp+service+dao

    model2的方式:jsp+Servlet+service+dao

    使用struts2和springmvc这样的mvc框架后,jsp+核心控制器+action+javabean

 

24.数据库分类和常用数据库

    关系型数据库:mysql,oracle,sqlserver,db2,SyBase。存放的是实体之间的关系。

    非关系型数据库:redis,memcache,mongodb

    memcache:开源的分布式的高速缓存系统,被许多网站使用以提升网站访问速度,对于一些大型的,频繁访问数据库的网站访问速度提升效果十分显著。

    mongodb:基于分布式文件存储的数据库,为web应用提供可扩展的高性能数据存储。是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库中功能最丰富最像关系数据库的,可以存储比较复杂的数据类型,查询语言强大,还支持索引。具体特点:

        面向集合存储,模式自由,支持动态查询,支持索引,支持复制和故障恢复,使用高效的二进制存储,支持多种语言,文件存储格式为BSON

        场景:存大量无关紧要的数据,没事务,存查都比mysql快,存的是json格式。

 

25.关系型数据库三范式

    范式:规范,就是关系型数据库在设计表时要遵循的规范。

    满足了第一范式才能满足第二范式,满足了第二范式才能满足第三范式。

    1NF:列数据的不可分割。

    2NF:表中的每一行都是唯一的。主键

    3NF:不能有冗余数据。表中不包含已在其它表中已包含的非主关键字信息。(外键)

    反三范式:有的时候为了效率,可以设置重复或者可以推导出的字段。如订单(总价)和订单项(单价)。

 

26.事务的四大特征

    事务是逻辑上的一组操作,组成这组操作的各个单元,要么全部成功要么全部失败。

    原子性(Atomic):指数据库事务是不可分割的。

    一致性(Consistency):事务执行的前后数据的完整性保持一致。

    隔离性(Isolation):每个事务都有各自的完整数据空间。

    持久性(Durability):只要事务成功结束,它对数据库所做的更新就永久保存下来。

    

27.mysql数据库默认最大连接数 (100)

    为什么需要最大连接数?特定服务器上面的数据库只能支持一定数目同时连接,所以要设置最大连接数(最多同时服务多少连接)。在数据库安装时都会有一个最大默认连接数。

    在mysql的配置文件中找最大连接数:mysql安装目录 -- my.ini -- max_connection可以找到。

    

    但100一般都满足不了需求,所以会修改这个值。    

 

28.mysql和oracle的分页语句(着重说思路)

    为什么需要分页?很多数据不可能完全显示,要进行分页显示。

    mysql是使用关键字limit来进行分页的,limit offset,size表示从offset索引取size位。

    oracle的分页是使用了三层嵌套查询。

 

29.触发器的使用场景

    触发器:数据库触发器是一个与表相关联的、存储的 PL/SQL 程序。每当一个特定的

数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle 自动地执行触发

器中定义的语句序列。

         需要有触发条件,当条件满足时做一些操作。

    触发器用处:如微博,当发一个动态,自动通知好友。其实就是在增加日志时做一个后触发,再向通知表中写入条目。触发器效率高,不用触发器,效率和数据处理能力都很低。如:每插入一个帖子,都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,用触发器效率就很高。

 

30.存储过程的优点

    存储过程:一组为了完成特定功能的sql语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过存储过程的名字并给出参数来执行它

    优点:

        1.存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般的sql语句每执行一次就编译一次,因此使用存储过程可以大大提高数据库执行速度。

        2.通常复杂业务逻辑需要多条sql语句,这些语句要分别从客户端发送到服务器,将产生大量的网络传输,将这些操作放在存储过程中,客户端和服务器之间的网络传输就大大减少,降低了网络负载。

        3.存储过程创建一次可以重复使用,减少数据库开发人员工作量。

        4.安全性高。存储过程可以屏蔽对底层数据库对象的直接访问,使用EXECUTE权限调用存储过程,无需拥有访问底层数据库对象的显式权限。

    定义存储过程:

 

31.jdbc调用存储过程

    加载驱动

    获取连接

    设置参数

    执行

    释放连接(释放连接要从小到大,必须放到finally)

 

32.简单说一下你对jdbc的理解

    java database connection:java数据库连接。数据库管理系统是很多的,每个数据库管理系统支持的命令是不一样的。java只定义接口,让数据库厂商自己实现接口,对于开发者而言,只需要导入对于厂商开发的实现(如mysql驱动)即可,然后以接口方式进行调用。(mysql+mysql驱动(实现)+jdbc)

 

33.写一个jdbc访问oracle的例子

      加载驱动(com.mysql.jdbc.Driver;oracle.jdbc.driver.OracleDriver)

      获取连接(DriverManager.getConnection(url,username,password))

      设置参数  先创建对象,Statement,PreparedStatement

                        cstmt.setXXX(index,value);

      执行 executeQuery()查询  ; executeUpdate()更新

      释放连接(释放连接要从小到大,先释放ResultSet,在释放Statement,最后释放Connection,必须放到finally)

    Connection用来获得执行sql语句和设置参数的对象PreparedStatement。//预编译sql: pstmt = conn.prepareStatement(sql);

 

34.jdbc中prepaerdStatement相比于Statement的好处

    1.PreparedStatement是预编译的,比Statement速度快

    2.代码的可读性和可维护性比Statement好的多。

    3.安全性,PreparedStatement可以防止SQL注入攻击,而Statement不能。

 

35.数据库连接池的作用

    1.限定数据库连接的个数,不会因为数据库连接过多导致系统运行缓慢或崩溃。

    2.数据库连接不需要每次都去创建或销毁,节约了资源。

    3.数据库连接不需要每次都去创建,响应时间更快。

    

36.说下html,css,JavaScript在网页开发中的定位?

    HTML(超文本标记语言):定义网页的结构

    CSS(层叠样式表):修饰html页面,美化页面

    JavaScript:控制页面特性展示,做动态交互(ajax),如验证表单

 

37.简单介绍一下ajax

    ajax:异步的JavaScript和xml。是一种创建交互式网页应用的网页开发技术。

    作用:通过ajax与服务器进行数据交换,可以使网页实现局部更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

    怎么实现:区别于传统的用浏览器来发送请求,ajax用XMLHTTPRequest对象异步向服务器发送请求,获取响应,完成局部更新。open(打开),send(发送),responseText/responseXML(接收请求),局部响应。

    使用场景:登录失败时不跳转页面,注册时提示用户名是否存在,二级联动等。

 

38.js和jQuery的关系

    jQuery是一个js框架,封装了js的属性和方法,增强了js的功能,让用户使用起来更加便利。下面举两个例子:

    1.原来使用js要处理很多兼容性问题(注册事件等),但jQuery封装了底层,就不用处理兼容性问题了。

    2.原生的js的dom和事件绑定和ajax等操作非常麻烦,jQuery封装以后操作非常方便。

 

39.jQuery中的常用选择器

    id选择器:通过id获取一个元素

    class选择器:通过类(css中的类)获取元素。.类名{}

    标签选择器:通过标签名获取元素,又叫元素选择器。标签名{}

    通用选择器(*):获取所有的元素

    div.myCls:获取有myCls这个类的div

    层次选择器:

        儿子选择器:>  获取下面的子元素

        后代选择器:空格  获取下面后代,包括儿子,孙子等后代。

    属性选择器:

        Tag[attrName='test'] 获取属性名为XXX且属性值为test的所有XXX标签。如

        <input type="checkbox" name="hobby"/>吃饭<br/>

        <input type="checkbox" name="hobby"/>睡觉<br/>

        input[name='hobby'] 表示获取属性名为name且属性值为hobby的所有input标签元素。

 

40.jQuery中页面加载完毕事件

    很多时候需要获取元素,但必须等到该元素被加载完成后才能获取,可以把js代码放到该元素的后面,但是这样会造成js在body中存在,不方便管理,等页面加载完毕后所有的元素也加载完毕。一般获取元素做操作都要在页面加载完毕后操作。

    第一种:$(document).ready(function(){

                    });

            $(document)把原生的document这个dom对象转换为jQuery对象,转换完成后才能调用ready方法。

            ready(fn),表示的是页面结构被加载完毕后执行传入函数fn。

    第二种:$(function(){

                });当页面加载完毕后执行里面的函数。这种相对简单,用的多。

    上述两种与window.onload的区别:

        1.jQuery中的页面加载完毕事件,表示的是页面结构被加载完毕。

        2.window.onload表示的是页面被加载完毕。

        <img src="http://baidu.com/1.jpg"/>onload必须等页面中的图片,声音, 等远程资源都加载完毕后才调用而jQuery中只需要页面结构被加载完毕。

 

41.jQuery中ajax和原生js实现ajax的关系

    jQuery中的ajax也是通过原生的js封装的。封装完成后让我们使用起来更加便利,不用考虑底层实现或兼容性等问题。

    如果用原生js实现ajax是非常麻烦的,并且每次场景都是一样的。如果不使用jQuery,也是需要封装ajax对象的方法和属性的。有像jQuery这样的开源的已经封装完成的框架,比较方便,直接使用jQuery即可。

 

42.简单说一下html5

    html5是最新版本的html,是在原来html4的基础上增强了一些标签。

    html5增加了一些像面板,声音,视频,web存储等高级功能。但html5太强调语义了,导致开发者不知道选择哪个标签。如:以前在做页面布局时,无论头部,主题,导航等模块都使用div来表示,但html5的规范,需要使用不同的标签来表示(header,footer等)。

 

43.简单说一下css3

    css3是最新版本的css,是对原理css2的功能增强。

    css3中提供一些原来css2中实现起来比较困难或者不能实现的功能。如:

        1.盒子圆角边框

        2.盒子和文字的阴影

        3.渐变

        4.转换 移动 缩放 旋转等

        5.过渡,动画都可以实现动画

        6.可以使用媒体查询实现响应式网站

    css3最大缺点是要根据不同的浏览器处理兼容性,但也对应有一些处理兼容性的工具。

 

44.bootstrap是什么?

    bootstrap是基于html、css、JavaScript开发的前端开发框架,使得web开发更快捷。可以不用写任何css,js代码就能实现比较漂亮的有交互性的页面。如:

        1.模态框

        2.表单

        3.布局

        4.栅格系统

    bootstrap还支持响应式开发。

    响应式布局:一个网站的展示可以兼容多个终端(手机,ipad,pc等),而不需要为每个终端单独做一个展示版本。

 

45.什么是框架

    框架(framework):是一个框子--约束性;是一个架子--支撑性。

    IT中的框架,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构。在此结构上可以根据具体问题扩展,安插更多组成部分,从而更迅速和方便的构建完整的解决问题的方案。

    1.框架本身不能解决特定问题,但可以帮我们快速解决问题。

    2.框架就是为扩展而设计的。

    3.框架里面可以为后续扩展的组件提供很多辅助性,支撑性的方便易用的实用工具。

 

46.简单介绍下mvc模式

    mvc全名是Model View Controller,是模型(model)- 视图(view)- 控制器(controller)的缩写,一种软件设计规范,用一种业务逻辑,数据,界面显示分离的方法组织代码。

    最简单最经单的是mvc模式是jsp+Servlet+JavaBean

    

    控制器(Servlet)是核心

    1.控制器收到来自用户的请求

    2.控制器调用JavaBean完成业务

    3.完成业务后通过控制器跳转jsp页面的方式给用户反馈信息

    4.jsp给用户做出响应

 

47.简单说一下对mvc框架的理解

    MVC框架:解决传统MVC模式(jsp+servlet+JavaBean)问题而出现的框架。

    传统MVC模式问题:

        1.所有的Servlet和Servlet映射都要配置在web.xml中,如果项目太大,web.xml太庞大,不能实现模块化管理。

        2.Servlet的主要功能是接收参数,调用逻辑,跳转页面。像字符编码,文件上传等功能也要写在Servlet中,就不能让Servlet完成主要功能而需要处理一下特例。

        3.接收参数比较麻烦(String name = request.getParameter("name"); User user = new User(); user.setName(name)),不能通过model接收,只能单个接收,接收完成后转换封装model。

        4.跳转页面方式比较单一(forword,redirect),并且当我的页面名称发生改变时需要修改Servlet源代码。

    常用的MVC框架:struts2,springmvc,webwork

 

48.struts2的执行流程,struts2的原理?

    

    拦截:核心控制器拦截请求

    判断:判断是否需要action的处理

    寻找:寻找对应的Action类

    执行:执行得到结果集

    响应:通过结果集进行响应

    1.浏览器发送请求,经过一系列的过滤器,到达核心过滤器(StrutsPreparedAndExecuteFilter)

    2.StrutsPreparedAndExecuteFilter通过ActionMapper判断当前的请求是否需要某个Action处理,如果不需要,则走原来流程,如果需要则把请求交给ActionProxy来处理。

    3.ActionProxy通过Configuration Manager询问框架的配置文件Struts.xml,找到需要调用的Action类

    4.创建一个ActionInvocation实例,来调用Action对应方法获取结果集的name,在调用前后会执行相关拦截器。

    5.通过结果集的name找到对应结果集来对浏览器进行响应。

 

49.Struts2的拦截器是什么?都用它来干什么?

    java里的拦截器是动态拦截Action调用的对象。

    Struts2中的功能(参数处理,文件上传,字符编码等)都是通过系统拦截器实现的。

    我们也可以自定义拦截器,可以在执行Action方法前后,加入相关逻辑完成业务。

    使用场景:

        1.用户登录判断,在执行Action的前面判断是否已经登录,没登录跳转到登录页面。

        2.用户权限判断,在执行Action的前面判断是否具有,如果没有权限给出提示信息。

        3.操作日志。。。

        

50.springmvc的执行流程

 

51.springmvc和strut2的不同

    1.核心控制器,springmvc是Servlet,struts2是filter。核心控制器的作用是处理所有的请求。

    2.控制器实例:springmvc基于方法设计的,struts2是基于类开发的,每次发一个请求都会实例一个action,而springmvc只有一个实例,每次请求执行对应方法即可。

    3.管理方式:springmvc是spring中的一个模块,所有spring对于springmvc的控制器管理更加简单方便,且提供了全注解的方式进行管理。struts2采用xml很多的配置参数来管理。

    4.参数传递:springmvc通过方法的参数进行接收,struts2是通过ValueStack进行传递和赋值

    5.struts2有很多的技术点,如拦截器,值栈,ognl表达式,学习成本比springmvc高。

    6.interceptor的实现机制:struts2有自己的interceptor机制,springmvc用的是独立的AOP方式,这样看来struts2的配置文件比springmvc的大,springmvc效率高。

    7.springmvc处理ajax请求,直接返回数据,方法中使用注解@ResponseBody,自动把对象转换为json数据,而struts2是通过插件的方式进行处理。

 

52.spring的两大核心

    spring是j2ee应用程序框架,是轻量级的ioc和aop的容器框架,主要针对JavaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和struts框架,ibatis框架等组合使用。

    1.IOC或DI

        ioc控制权反转

            原来service需要调用dao,service就需要创建dao

            现在,spring发现service依赖dao,就给dao注入

            核心原理:配置文件+反射(工厂也可以)+容器(map)

        aop面向切面编程

            核心原理:使用动态代理的方式在执行前后或出现异常后做相关逻辑。

        使用aop做:

            1.事务处理:执行方法前,开启事务,执行完成后关闭事务,出现异常回滚事务。

            2.权限控制:在执行方法前,判断是否具有权限。

            3.日志:在执行前进行日志处理。

 

53.AOP是什么,都用它做什么?

    aop面向切面编程

         核心原理:使用动态代理的方式在执行前后或出现异常后做相关逻辑。

    使用aop做:

         1.事务处理:执行方法前,开启事务,执行完成后关闭事务,出现异常回滚事务。

         2.权限控制:在执行方法前,判断是否具有权限。

         3.日志:在执行前进行日志处理。

    aop相关术语:

        目标对象target:就是需要被增强的对象。

        连接点join point:指被拦截到的点,在spring中指的是方法。

        切入点pointcut:指对哪些连接点进行拦截的定义。

        通知advice:指拦截到连接点之后要做的事情,分为前置通知,后置,异常,最终,环绕通知。

        引介introduction:是一种特殊的通知,在不修改类代码的前提下,introduction可以在运行期为类动态地添加一些方法或属性。

        切面aspect:是切入点和通知的结合。

        织入weaving:是一个过程,将切面应用到目标对象从而创建出AOP代理对象的过程。spring采用动态织入,而aspectj采用静态织入。

        代理proxy:一个类被AOP织入增强后,就产生一个结果代理类。

    AOP底层实现:aop分为静态aop和动态aop。静态AOP是指AspectJ实现的aop,它是将切面代码直接编译到java类文件中。动态AOP是指将切面代码进行动态织入实现的aop。spring的aop为动态aop,实现的技术为:jdk提供的动态代理技术和CGLIB(动态字节码增强技术)。

 

传统Spring aop开发总结:

    1.编写目标对象(target)

    2.编写通知(advice)

    3.配置切面(切面=切点+通知)

    以上三步都在xml中配

 

spring整合AspectJ框架实现的aop-开发中多用这种方案    

    基于xml配置方案:

        1.创建目标(target)

        2.创建通知(advice)

        3.在xml配置文件中配置切面

    基于annotation方案:

        1.编写目标,在配置文件中配置扫描注解。

        2.编写增强,在配置文件中开启Aspectj注解自动代理功能。

            @Aspect来声明切面

            @Before来声明前置通知

            @AfterReturning声明后置通知

            @Around声明环绕通知

            @AfterThrowing异常抛出通知

            @After最终通知

            @Pointcut用来定义切点

        3.测试

 

单元测试的注解:

@RunWith:指定使用的单元测试执行类

@ContextConfiguration:指定Spring配置文件所在的路径,可以同时指定多个文件。

@TestExecutionListeners:指定在测试类执行之前,可以做的一些动作。

@Transactional:和@TestExecutionListeners配合使用,保证插入的数据库中的测试数据在测试完成后,事务回滚,保证数据库的干净。如果没有此注解,那么插入的数据就保存在数据库中了。

       

54.Spring事务的传播特性和隔离级别

    传播特性:

        1.required 需要 如果存在一个事务,则支持当前事务,没有事务就开启。

        2.supports 支持 如果存在一个事务,支持当前事务,如果没有事务,就非事务的执行。

        3.mandatory 必要的 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

        4.requires_new 总是开启一个新的事务,如果事务已经存在,则将其挂起。

        5.not_support 总是非事务地执行,并挂起任何存在的事务。

        6.never 绝不 总是非事务地执行,如果存在一个事务,抛出异常。

        7.nested 嵌套的 如果有就嵌套,没有就开启事务。

    隔离级别:

        read uncommitted:脏读,不可重复读,虚读都可能发生。

        red committed:避免脏读,可能发生不可重复读和虚读。

        repeatable-read:避免脏读和不可重复读,可能发生虚读。(mysql默认隔离级别)

        serializable:避免脏读,不可重复读,虚读。

    脏读:一个事务读到了另一个事务未提交的数据。

    不可重复读:一个事务读到了另一个事务已经提交的update数据。

    虚读:一个事务读到了另一个事务已经提交的insert数据。

 

    

55.ORM是什么?ORM框架是什么?

    对象关系映射:是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。它可将程序中的对象自动持久化到关系数据库中,采用硬编码的方式(jdbc操作sql方式),为每一种可能的数据库访问操作提供单独的方法。

    这种方案存在不足:

        1.持久化层缺乏弹性,一旦出现业务需求的变更,就必须修改持久化层的接口。

        2.持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,都要修改持久化层的相关代码,增加了软件的维护难度。

    ORM提供了实现持久化层的另一种模式,采用映射元数据来描述对象关系的映射,使得ORM中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。

    java典型的ORM框架有hibernate,mybatis

    ORM方法论基于三个核心原则:

        1.简单:以最基本的形式建模数据

        2.传达性:数据库结构被任何

        3.精确性:基于数据模型创建正确标准化了的结构

 

56.mybatis和hibernate区别

    相同点:

        都是java中orm框架,屏蔽jdbc api的底层访问细节,使我们不用与jdbc api打交道,就可以完成对数据库的持久化操作,jdbc api编程流程固定,将sql语句和java代码混在一起,经常需要拼接sql语句,细节繁琐。

        mybatis的好处:屏蔽jdbc api的访问细节;将sql语句与java代码分离;提供了将结果集自动封装成为实体对象和对象集合的功能。queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。

        hibernate的好处:hibernate是一个全自动的orm框架,可以自动生成sql语句,并执行,返回结果。

    不同点:

        1.hibernate比mybatis的功能强大很多,因为hibernate自动生成sql语句。

        2.mybatis需要我们自己在xml文件中写sql语句,可以写出复杂的sql语句,而hibernate不能。在SQL语句优化方面,mybatis要比hibernate好。

        3.mybatis要比hibernate简单,不用考虑对象间一些复杂的映射关系。

 

57.hibernate映射对象状态及其转换

    临时状态/瞬时状态(transient):刚刚用new语句创建,无OID,不处于session中(没有使用session的方法去操作临时对象)。OID:是与数据库中表的主键对应的属性。

    持久化状态/托管状态(persistent):具有持久化标识OID,由session管理,在数据库中可能有,也可能没有。

    游离状态/脱管状态(detached):已经被持久化,但不处于session中,在数据库中可能存在也可能不存在。

    删除状态(removed):对象有关联的OID,并且在session管理下,但是已经被计划删除,如果没有事务就不能删除。

    相互转换:

        瞬时 --> 持久   save  saveOrUpdate

        瞬时 --> 游离   手动设置oid

        持久 --> 瞬时   delete()

        持久 --> 游离   evict(清除一级缓存中指定的一个对象)

                                clear(清空一级缓存)

                                close(关闭,清空一级缓存)

        游离 --> 瞬时   直接将oid删除

        游离 --> 持久    update  saveOrUpdate

 

58.hibernate的缓存

    为什么使用缓存?为了提高访问速度,把磁盘或数据库访问变成内存访问。

    hibernate缓存包括一级和二级缓存

    一级缓存是session级别的缓存,不能被卸载,是事务范围的缓存。一级缓存中,持久化类的每个实例都具有唯一的OID。

    二级缓存是SessionFactory的缓存,从应用启动到应用结束有效果,是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。二级缓存是可选的,默认没有二级缓存,是一个可配置插件,需要时可开启。

    保存数据库后,还要在内存中保存一份,如果更新了数据库就要同步更新。那什么样的数据适合放在二级缓存中呢?

        1.很少被修改的数据  帖子的最后回复时间

        2.经常被查询    电商的地点

        3.不会被并发访问的数据

        4.常量数据

    扩展:hibernate的二级缓存默认是不支持分布式缓存的,使用memcache,redis等中央缓存代替二级缓存。

 

59.WebService的使用场景

    WebService是一个SOA(面向服务编程)架构,是多个系统之间的通信技术。

    使用场景:

        1.异构系统(不同语言的系统)的整合

        2.不同客户端的整合,浏览器,手机端(android,ios)等终端来访问。

        实实在在的例子:

            天气预报:可以通过实现WebService客户端调用远程天气服务实现。

            单点登录:一个服务是所有系统的登录。

 

60.activiti的简单介绍

    Activiti是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速,稳定的BPMN2流程引擎,它易于与spring集成使用。

    主要用在OA中,把线下流程放到线上,把现实生活中一些流程固话定义到系统中,然后通过输入表单数据完成业务。

    也可用在OA系统的流程管理中:

        请假流程:小于三天,一级主管审批,大于三天二级主管审批。

        报销流程:大于10000找谁,大于20000找谁。。。

 

61.linux的使用场景

    linux是一个长时间运行比较稳定的操作系统,我们一般拿它做服务器。Linux本身具有C的编译环境,有一些软件是没有软件包(redis)的,需要在linux编译得到软件包。

 

62.Linux的常用命令

    常用:

        pwd    获取当前路径

        cd        跳转到目录

        su -u    切换到管理员

        ls ll        列举目录

    文件操作命令:

        文件:

            tail    查看

            rm -rf    删除

            vi        修改

        文件夹:

            mkdir    创建文件夹

            rm -rf    删除文件夹

    查看当前进程:ps -ef

 

63.怎么操作linux服务器?怎么连接远程服务器?

    需要依赖Linux服务器安装ssh服务器,一般这个ssh服务的端口为22。还需要安装sftp服务端,端口一般为25。

    使用ssh客户端连接linux服务器,有点像windows下面的远程连接,但是linux通过ssh连接上以后是没有图形界面的,全是命令行。

    ssh客户端:putty,xshell

    使用sftp客户端来连接sftp服务端,来上传和下载文件(当上传安装包,修改了配置文件时需要上传文件)

    sftp客户端:winscp,xftp

    企业中常用的两种组合:putty+winscp;xshell+xftp=xmanager

    面试:使用Xshell,putty等ssh客户端来连接服务器,使用xftp,winscp等sftp客户端来上传和下载文件。连接和上传下载必须依赖于服务器的ssh,sftp服务,也就是linux服务器需要启动这两个服务。

 

64.有没有使用过云主机

    使用过:

        原来的公司没有使用自己的服务器,而是租用阿里的云主机。

    没有使用过,但有所了解:

        云主机就是一些云服务器运营商(阿里,华为,西部数码,新浪等),提供的远程的服务器功能。我们开发者或者企业只需按需付费就可以租用对应的服务器。

    使用ssh和sftp来进行操作。

 

65.数据库优化方面的事情  

    做过mysql数据库的优化,其他的数据库也差不多

     定位:查找,定位慢查询,并优化

     优化手段

           a.创建索引:创建合适的索引,我们就可以先在索引中查询,查询到以后直接找对应的记录。

           b.分表:当一张表的数据比较多或者一张表的某些字段的值比较多并且很少使用时,采用水平分表和垂直分表来优化。

           c.读写分离:当一台服务器不能满足需求时,采用读写分离的方式进行集群

           d.缓存:使用redis来进行缓存

           e.其他常用优化技巧

 

66.如何查找定位慢查询?

        在自验项目转测试之前,在启动mysql数据库时开启慢查询,并且把执行慢的语句写到日志中,在运行一定时间后,通过查看日志找到慢查询语句。

        使用explain和慢查询语句,来详细分析语句的问题

 

67.数据库优化之数据库表设计遵循范式

       数据库表设计时需要遵循的范式

        表的范式:首先符合1NF,才能满足2NF,进一步满足3NF(递进关系)

        1NF:即表的列具有原子性,不可再分解

        2NF:表中的记录是唯一的,通常设计一个主键来实现

        3NF:表中不能有冗余数据。(外键)

        反3NF:没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准。适当保留冗余数据。具体做法是:在概念数据模型设计时遵循第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。比如:订单和订单项,相册浏览次数和照片的浏览次数。

 

68.选择合适的数据库引擎

    在开发中,经常使用的存储引擎:myisam,innodb,memory

    MyISAM存储引擎:如果表对事务要求不高,同时以查询和添加为主的。比如bbs中的发帖表,回复表。

    INNODB存储引擎:对事务要求高,保存的数据都是重要数据。如订单表,账户表。

    Memory存储(内存级别的):数据变化频繁,不需要入库,同时又频繁的查询和修改。使用这个速度快。

MyISAM和INNODB的区别(主要)

    1.事务安全 :myisam不支持事务,innodb支持

    2.查询和添加速度:myisam不用支持事务就不用考虑同步锁,查找和添加速度快。

    3.支持全文索引:myisam支持,innodb不支持

    4.锁机制:myisam支持表锁,innodb支持行锁(事务)

        表锁:一个人只能去操作一张表

        行锁:一个人去操作表中一行记录

    5.外键myisam不支持外键,innodb支持外键(通常不设置外键,通常是在程序中保证数据的一致)

 

69.数据库优化之选择合适的索引

    索引:是帮助DBMS高效获取数据的数据结构

    分类:

        普通索引:允许出现重复值

        唯一索引:除了不能有重复的记录外,其它和普通索引一样(用户名,身份证)

        主键索引:是随着设定主键而创建的,把某个列设为主键的时候,数据库就会给该列创建索引。唯一且没有null值

        全文索引:用来对表中的文本域(char,varchar,text)进行索引,全文索引针对myisam。explain select * from articles where match(title,body) against ('database');

 

70.索引使用小技巧(重点)

    索引弊端:

        1.占用磁盘空间。

        2.对dml(插入,修改,删除)操作有影响,变慢。(插入的时候建立索引,删除的时候要把索引删了,所以变慢)

    使用场景:

        1.在where条件经常使用,如果不做查询就没有意义。

        2.该字段的内容不是唯一的几个值(sex)

        3.字段内容不是频繁变化

        不会出现在where子句中字段不该创建索引

    具体技巧:

        1.对于创建多列索引(复合索引),不是使用的第一部分就不会使用索引。

            alter table dept add index my_ind(dname,loc);//dname是左边的列,loc是右边的列

            explain select * from dept where dname='aaa'  会使用到索引

            explain select * from dept where loc='aaa'  不会使用到索引

        2.对于使用like的查询,查询如果是'%aaa',不会使用到索引,而'aaa%'就会使用到索引。所以在like查询时,关键字的最前面不能使用%或_这样的字符,如果一定要前面有变化的值,则考虑使用全文索引

        3.如果条件中有or,要求使用的所有的字段都必须单独使用索引。

        4.如果列类型是字符串,一定要在条件中将数据使用引号引起来,否则不使用索引。

            expain select * from dept where dname='111';

            expain select * from dept where dname=111;(数值自动转字符串)

            expain select * from dept where dname=qqq;报错

        5.如果mysql使用全表扫描要比使用索引快,则不使用索引。如:表里只有一条记录。

 

71.数据库优化之分表

    分表分为水平(按行)分表和垂直(按列)分表

    如果行非常多就采用水平分表。当mysql表数据达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉,此时使用水平分表能很大程度减少这些压力。按行数据进行分表。

    如果一张表中某个字段值非常多(长文本,二进制等),而且只有在很少情况下会查询,使用垂直分表,这时可以把字段多的单独放到一个表,通过外键把原表关联起来。如考试详情,一般只关注分数,不关注详情,此时就可以把详情隔离出来

    水平分表策略:

        1.按时间分表:(很强时效性采用)

            这种分表方式有一定的局限性,当数据有较强的时效性,如微博发送记录,微信消息记录等,这种数据很少有用户会查询几个月前的数据,就可以按月分表。

        2.按区间范围分表(用的也多)

            一般在有严格的自增id需求上,如按照user_id水平分表:

            table_1   user_id从1-100w

            table_2   user_id从101-200w...

        3.hash分表(用的最多)

            通过一个原始目标id或者名称通过一定的hash算法计算出数据存储表的表名,然后访问相应的表。

 

72.数据库优化之读写分离

    一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了要求时,可以集群处理,MySQL的集群处理技术最常用的就是读写分离。

    主从同步:数据库最终会把数据持久化到磁盘上,如果集群必须确保每个数据库服务器的数据是一致的。能改变数据库的操作都往主数据库去写,而其他的数据库从主数据库上同步数据。

    读写分离:使用负载均衡来实现写的操作都往主数据库去,而读的操作往从服务器去。

 

73.数据库优化之缓存

    在持久层(dao)和数据库(db)之间添加一个缓冲层,如果用户访问的数据已经缓存起来时。在用户访问时直接从缓存中获取,不再访问数据库。缓存是操作内存,访问速度快。

    缓存作用:减少数据库服务器压力;减少访问时间。

    java中常用的缓存有:

        1.hibernate的二级缓存,该缓存不能完成分布式缓存。(在一个服务器里缓存后,还要在其它服务器缓存才行)

        2.使用redis来作为中央缓存,对缓存的数据进行集中处理。

 

74.sql语句优化小技巧

    DDL优化:

        1.通过禁用索引来提供导入数据性能。这个操作主要针对有数据库的表,追加数据。

        2.关闭唯一校验。

        3.修改事务提交方式(导入)(变多次提交为一次)

            set autocommit=0    关闭

            set autocommit=1    //批量插入 开启

    DML优化(变多次提交为一次)

    DQL优化

        Order by优化:

            1.多用索引排序

            2.普通结果排序(非索引排序)

        group by优化:是使用order by null,取消默认排序

        子查询优化

        or优化:

        limit优化

 

sql的分类:

    DDL数据定义语言:create,drop,alter

    DCL数据控制语言:grant,if...

    DML数据操纵语言:insert,update,delete...

    DQL数据查询语言:select

            

75.jdbc批量插入几百万条数据

    原理:变多次提交为一次;使用批量操作

省出的时间非常可观。像这样的批量插入操作能不使用代码操作就不使用,可以使用存储过程来实现。

 

76.redis是什么?

    redis是一个key-value的nosql数据库,先存到内存中,会根据一定的策略持久化到磁盘,即使断点也不会丢失数据。支持的数据类型比较多。

    主要用来做缓存数据库的数据 和 web集群时当做中央缓存存放session。

    Redis数据类型:String(字符串)、list(链表)、set(集合)、zset(sorted set有序集合)、hash(哈希)

    Redis数据持久化机制介绍:

        1.RDB持久化:指在指定的时间间隔内将内存中的数据集快照写入磁盘。

        2.AOF持久化:以日志形式记录服务器所处理的每一个写操作。

        3.同时应用AOF和RDB

        4.无持久化:可通过配置的方式禁用redis服务器的持久化功能,这样redis可视为一个功能加强版的memcached了。

 

77.redis的使用场景

    缓存:把经常需要查询的,很少修改的数据,放到内存。以便下次访问减轻数据库压力,减少访问时间。

    计数器:redis中的计数器是原子性的内存操作。可以解决库存溢出问题,进销存系统库存溢出

    session缓存服务器:web集群时作为session缓存服务器。

    缓存队列

    使用场景:

    1.并发量高

    2.数据访问频繁

    3.对数据一致要求不高

    4.不经常访问的,但是生命周期长(如当前在线人数)

    5.存储的内容不易过大

    6.由于redis是单线程,可以用来处理多线程的一些问题

    7.数据不经常发生变化

    8.session中的数据一般都可以放到redis中存储

 

78.redis存储对象的方式

    ①json字符串:(使用较多)

        需要把对象转换为json字符串。当做字符串处理,直接使用set get来设置或获取。

        优点:设置和获取比较简单

        缺点:没有提供专门的方法,需要把对象转换为json。(jsonlib)

    ②字节流:

        需要做序列号,就是把对象序列化为字节保存。

    如果是担心json转对象会消耗资源的情况,需要考量几个地方:

        1.使用json转lib是否会存在性能问题

        2.数据的数据量级别。如果是存储百万级的大数据对象,建议采用存储序列化对象方式。如果是少量的数据级对象,或者数据对象字段不多,建议采用json转换成String方式。

        redis对存储字符类型的优化非常好。具体采用的方式与方法,还要看使用场景。

 

79.redis数据淘汰机制

    为什么淘汰?因为内存大小有限,需要保存有效的数据。

    在redis中,允许用户设置最大使用内存大小server-maxmemory,在内存限定的情况下是很有用的。

    redis内存数据集大小上升到一定大小的时候,就会执行数据淘汰策略。

    redis提供6种数据淘汰策略:

        alikeys-lru:从数据集中挑选最近最少使用的数据淘汰。(最常用)

        volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。

        volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。

        volatile-random:从已设置过期时间的数据集中任意选择数据淘汰

        alikeys-random:从数据集中任意选择数据淘汰。

        no-enviction(驱逐):禁止驱逐数据。

 

80.java访问redis集群?redis集群?

    .java访问redis集群

        使用场景:

            1.使用jedis java客户端来访问redis服务器。有点类似通过jdbc访问mysql一样。

            2.如果是spring进行集成时,可以使用spring data来访问redis,spring data只是对jedis的二次封装。类似JdbcTemplate和jdbc关系。

    redis集群:redis的内存大小是有限的,当一台数据库满足不了要求,可以使用redis集群来处理,类似于mysql的读写分离。

 

81.微信公众号分类和微信开发原理

    分类:

        公众号:个人和企业都能申请

        服务号:企业才能申请

        企业号:企业才能申请

    微信开发原理:微信公众平台的开发者,通过接入认证的方式,让我们的服务器能处理来自微信服务器转发的微信用户的请求,处理完成后返回给微信服务器,由微信服务器对用户响应。

 

82.怎么把微信和业务平台进行绑定?

    就是微信用户和注册用户绑定,让微信用户也能完成注册用户的功能。

    用户注册实体中包含一个微信号的字段,当我进行绑定时就是修改用户的微信号字段。当进行菜单跳转到页面后,是无法直接获取微信号的,要通过微信网页授权的方式来获取微信号。

        第一步:用户同意授权,获取code

        第二步:通过code换取网页授权openid也就是我们微信号。

            

83.项目的分类和项目参与者

    在公司中做的项目分为两种:产品,项目

    项目:就是给一些公司接的项目,项目开发完成后,就交互,后面这个项目代码就不在维护了。

    产品:充分考虑扩展性和基本业务来做一个产品,在这个产品上可以进行定制开发。

    项目参与者:产品经理,PM,架构师(SE),开发PL MDE,测试PL TSE,UI,资料。

    步骤:产品经理建立产品和项目经理关联起来,项目经理建立项目,分配开发任务和测试任务,资料任务和设计任务给不同的团队,这些团队各自完成自己的工作。

        开发团队:开发代码,完成需求

        测试团队:测试功能

        UI:负责界面设计,静态代码编写

        资料:负责界面的文字描述。

        QA:统管项目质量监控,和PM,SE同级。

    开发,UI和资料,协同设计和开发,开发完成后转测试(测试策略)交给测试团队进行测试,测试完成后会出一个测试报告,提交bug,让开发解决bug,不断更新,迭代,直到项目拿去发布,发布之前要先预演,预演完了总结会议。

 

84.项目流程和业务注意事项

    项目流程:

        1.可行性分析、立项和开工会

        2.需求分析

        3.需求设计

        4.项目开发(多个迭代)

            迭代开工会

            迭代设计

            迭代开发

            迭代测试

            集成测试

            迭代发布

            迭代总结

            。。。

            不断迭代

        5.项目验收

        6.项目总结

    业务注意事项:

        1.不要多个项目都说同一个模块。如在pss,crm,shopping都写权限控制。

        2.多写点业务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值