面试题收集

post put get 请求的区别
PUT请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来改资源)
Post请求:后一个请求不会把第一个请求覆盖掉。(所以Post用来增资源)
get和post
1、GET参数通过URL传递,POST放在Request body中。
2、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
3、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

jvm
2.JVM基本概念
2.1 基本概念:
JVM是可运行Java代码的假想计算机 ,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收,堆 和 一个存储方法域。JVM是运行在操作系统之上的,它与硬件没有直接的交互。
2.2 运行过程:
我们都知道Java源文件,通过编译器,能够生产相应的.Class文件,也就是字节码文件,而字节码文件又通过Java虚拟机中的解释器,编译成特定机器上的机器码 。
也就是如下:
• Java源文件—->编译器—->字节码文件
•字节码文件—->JVM—->机器码
每一种平台的解释器是不同的,但是实现的虚拟机是相同的,这也就是Java为什么能够跨平台的原因了 ,当一个程序从开始运行,这时虚拟机就开始实例化了,多个程序启动就会存在多个虚拟机实例。程序退出或者关闭,则虚拟机实例消亡,多个虚拟机实例之间数据不能共享。

什么是“GC”
垃圾回收机制。
为什么要用“GC”
众所周知,JAVA 这语言,与C语言不同,Java内存(堆内存)的分配与回收由JVM垃圾收集器自动完成,比如 C语言自己定义的变量,不用时需要 自己回收这个变量 。JAVA 这就是自动完成了,自动检测,无用的垃圾,回收,从而释放内存。一个人工,一个自动化。

GC回收流程
创建新的对象需要分配内存 ->查看Eden区是否能够放下对象,不能则清理eden区,Minor GC清理后看能否放下->不能则放到存活区,存活区不能放下则放到->老年代判断老年代是否存在空间 不存在则Major GC ->看是否存在空间-> 如果老年代执行Full GC之后,无法进行对象的保存,则会产生OOM异常,OutOfMemoryError异常

先看一下JVM内存结构
需要GC的原因:
应用程序对资源操作,通常简单分为以下几个步骤:
1、为对应的资源分配内存
2、初始化内存
3、使用资源
4、清理资源
5、释放内存
应用程序对资源(内存使用)管理的方式,常见的一般有如下几种:
1、手动管理:C,C++
2、计数管理:COM
3、自动管理:.NET,Java,PHP,GO…
但是,手动管理和计数管理的复杂性很容易产生以下典型问题:
1.程序员忘记去释放内存
2.应用程序访问已经释放的内存
产生的后果很严重,常见的如内存泄露、数据内容乱码,而且大部分时候,程序的行为会变得怪异而不可预测,还有Access Violation等。
.NET、Java等给出的解决方案,就是通过自动垃圾回收机制GC进行内存管理。这样,问题1自然得到解决,问题2也没有存在的基础。
总结:无法自动化的内存管理方式极容易产生bug,影响系统稳定性,尤其是线上多服务器的集群环境,程序出现执行时bug必须定位到某台服务器然后dump内存再分析bug所在,极其打击开发人员编程积极性,而且源源不断的类似bug让人厌恶。
三、GC如何工作:
GC的工作流程主要分为如下几个步骤:
1、标记(Mark)—GC的根节点也即GC Root
2、计划(Plan)
3、清理(Sweep)
4、引用更新(Relocate)
5、压缩(Compact)
在Java中,可以当做GC Root的对象有以下几种:
1、虚拟机(JVM)栈中的引用的对象
2、方法区中的类静态属性引用的对象
3、方法区中的常量引用的对象(主要指声明为final的常量值)
4、本地方法栈中JNI的引用的对象
四、什么时候发生GC;
1、当应用程序分配新的对象,GC的代的预算大小已经达到阈值,比如GC的第0代已满
2、代码主动显式调用System.GC.Collect()
3、其他特殊情况,比如,windows报告内存不足、CLR卸载AppDomain、CLR关闭,甚至某些极端情况下系统参数设置改变也可能导致GC回收
五、建议:
由于GC的代价很大,平时开发中注意一些良好的编程习惯有可能对GC有积极正面的影响,否则有可能产生不良效果。
1、尽量不要new很大的object,大对象(>=85000Byte)直接归为G2代,GC回收算法从来不对大对象堆(LOH)进行内存压缩整理,因为在堆中下移85000字节或更大的内存块会浪费太多CPU时间。
2、不要频繁的new生命周期很短object,这样频繁垃圾回收频繁压缩有可能会导致很多内存碎片,可以使用设计良好稳定运行的对象池(ObjectPool)技术来规避这种问题。
3、使用更好的编程技巧,比如更好的算法、更优的数据结构、更佳的解决策略等等。
https://www.cnblogs.com/21-forever/p/10951496.html
软件开发周期

  1. 需求分析(确定需求流程图) 2.软件设计(数据结构设计) 3.软件编码 4.软件测试 5.运行维护

设计模式 解决需求变更的问题 需求变更带来的问题 提高可重用性
单例模式:单例模式核心只需要new一个实例对象的模式,比如数据库连接,在线人数等,一些网站上看到的在线人数统计就是通过单例模式实现的,把一个计时器存放在数据库或者内存中,当有人登陆的时候取出来加一再放回去,有人退出登陆的时候取出来减一再放回去,但是当有两个人同时登陆的时候,会同时取出计数器,同时加一,同时放回去,这样的话数据就会错误,所以需要一个全局变量的对象给全部人使用,只需要new出一个实例对象,这就是单例模式的应用,并且单例模式节省资源,因为它控制了实例对象的个数,并有利于gc回收。
策略模式:就是将几个类中公共的方法提取到一个新的类中,从而使扩展更容易,保证代码的可移植性,可维护性强。
工厂模式:简单的工厂模式主要是统一提供实例对象的引用,通过工厂模式接口获取实例对象的引用。比如一个登陆功能,后端有三个类,controller类,interface类,实现接口的实现类。当客户端发出一个请求,当请求传到controller类中时,controller获取接口的引用对象,而实现接口的实现类中封装好了登陆的业务逻辑代码。当你需要加一个注册需求的时候只需要在接口类中加一个注册方法,实现类中实现方法,controller获取接口的引用对象即可,不需要改动原来的代码,这种做法是的可拓展性强。
MVC设计模式:
每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。主要用到了MVC的设计模式。用来开发JSP/Servlet或者J2EE的相关应用。

SQL优化
SQL优化的具体操作:
1、在表中建立索引,优先考虑where、group by使用到的字段。
2、尽量避免使用select ,返回无用的字段会降低查询效率。如下:
SELECT * FROM t
优化方式:使用具体的字段代替
,只返回使用到的字段。
3、尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。
优化方式:如果是连续数值,可以用between代替。如下:
如果是子查询,可以用exists代替。如下:
4、尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描。如下:
优化方式:可以用union代替or。如下:
(PS:如果or两边的字段是同一个,如例子中这样。貌似两种方式效率差不多,即使union扫描的是索引,or扫描的是全表)
5、尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描。如下:
优化方式:尽量在字段后面使用模糊查询。如下:
6、尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。如下:
优化方式:可以给字段添加默认值0,对0值进行判断。如下:
7、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。如下:
优化方式:可以将表达式、函数操作移动到等号右侧。如下:
8、当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描。如下:
优化方式:用代码拼装sql时进行判断,没where加where,有where加and。

mybatis和ibatis的区别
mybatis简化了编码的过程,不需要去写dao的实现类,直接写一个dao的接口,再写一个xml配置文件,整个mybatis就配置好了,也就是数据库就连接好了,然后在service里面直接调用dao就可以了,但是ibatis则不可以,必须要写dao的实现类。mybatis是ibatis的升级版本。

Mybatis优势
MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
MyBatis容易掌握,而Hibernate门槛较高。

Hibernate优势
Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。

UML建模
UML其实是一种简单、统一、表达软件中动态和静态信息的标准化建模语言,既能帮助设计者降低改进的成本,又能缩短设计时间。
目前UML在软件工程方面有所应用,它是一种进行面向对象程序设计的工具,用来把现实中的问题抽象成面向对象的解决方案,以便进一步的编码。简单来说它就是由一堆图组成的,包括:用例图、类图、对象图、状态转换图、活动图、时序图、部署图等等,并且这些类型会经常用到。
值得注意的是,一份UML设计不是一定包含所有的UML图,这些图存在的意义,是使软件分析和设计人员在过程中对目标问题有更深刻的理解和认识,是要使工程所涉及的所有人员(包括用户中的不同人)都能参与到工程的设计中来,UML为非专业编程人士理解软件的功能和构造,提供了一种直白、简单、通俗的方法。 也就是设计人员设计好了之后,拿这些图给客户看,他们能很容易的看懂,然后再给你反馈。
综合来说UML在开发上有这三个优点:
1、UML统一了各种方法对不同类型的系统、不同开发阶段以及不同内部概念的不同观点,从而有效的消除了各种建模语言之间不必要的差异。
2、UML建模能力比其它面向对象建模方法更强。它不仅适合于一般系统的开发,而且对并行、分布式系统的建模尤为适宜。
3、UML使硬件组件和软件组件之间将会有更大的透明度。便携性和综合效率将会增加。

查询速度提升
单字段的查询,速度快于很多,随着字段的增加,速度相应减慢,查询所有字段的速度和查询的速度相似,略低。单纯查询主键ID,并不会变快,索引字段在where后查询,速度极大提升。

1、减少视图中用视图
2、减少 “ * ” 的使用
3、对于数据量大的表,采用读写分离的原则。
4、表中适当增加需要、必要及重要的字段

dopost和doget的区别
doGet是处理客户端发来的Get请求,doPost是处理客户端发来的Post请求,它们的区别可以从以下7个方面来说明:
1、客户端(一般指浏览器)生成的方式
get:form中method属性为get时;或者直接在URL地址栏中输入URL,需要传递参数时,直接在URL后面拼接“?name=张三&age=18”这样的查询参数字符串;
post:form中method属性为post。
2、客户端数据传送方式
get:表单数据存放在URL地址后面。所有get方式提交时HTTP中没有消息体;
post:表单数据存放在HTTP协议的消息体中以实体的方式传送到服务器。
3、服务器获取数据方式
get:服务器采用Servlet中的doGet来获取变量的值;
post:服务器采用Servlet中的doPost来获取数据。
4、传输的数据量
get:数据量长度有限制,一般不超过2kb。因为是参数传递,且在地址栏中,故数据量有限制;
post:适合大规模的数据传送。因为是以实体的方式传送的。
5、安全性
get:安全性差。因为是直接将数据显示在地址栏中,浏览器有缓冲,可记录用户信息。所以安全性低;
post:安全性高。因为post方式提交数据时是采用的HTTP post机制,是将表单中的字段与值放置在HTTP HEADER内一起传送到ACTION所指的URL中,用户是看不见的。

spring面试
什么是IOC、DI 及其两者的优点,有哪几种注入方式
IOC:控制反转,把创建对象的控制权利由代码转移到spring的配置文件中。
最直观的表达就是,IOC让对象的创建不用去new了,可以由spring自动生产,使用java的反射机制,根据配置文件在运行时动态的去创建对象以及管理对象,并调用对象的方法的。
DI:依赖注入,在程序运行期间,由外部容器动态地将依赖对象注入到组件中。简单定义就是当一个对象需要另一个对象时,可以把另一个对象注入到对象中去。
优点就是把应用的代码量降到最低,达到松散耦合度。

Spring事务管理之几种方式实现事务
事务具备ACID四种特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。

HashMap和Hashtable的区别。
HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许空(null)键值(key),由于非线程安全,效率上可能高于Hashtable。
HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。

多线程的使用场景
1、常见的浏览器、Web服务(现在写的web是中间件帮你完成了线程的控制),web处理请求,各种专用服务器(如游戏服务器)。
2、servlet多线程。
3、FTP下载,多线程操作文件。
4、数据库用到的多线程。
5、分布式计算。
6、tomcat,tomcat内部采用多线程,上百个客户端访问同一个WEB应用,tomcat接入后就是把后续的处理扔给一个新的线程来处理,这个新的线程最后调用我们的servlet程序,比如doGet或者dpPost方法。
7、后台任务:如定时向大量(100W以上)的用户发送邮件;定期更新配置文件、任务调度(如quartz),一些监控用于定期信息采集。
8、自动作业处理:比如定期备份日志、定期备份数据库。
9、异步处理:如发微博、记录日志。
10、页面异步处理:比如大批量数据的核对工作(有10万个手机号码,核对哪些是已有用户)。
11、数据库的数据分析(待分析的数据太多),数据迁移。
12、多步骤的任务处理,可根据步骤特征选用不同个数和特征的线程来协作处理,多任务的分割,由一个主线程分割给多个线程完成。

java事务 try catch

捕获异常抛出事务不回滚
方法名上加注解事务 @Transactional 使用注解的简单模式,报错会回滚,但是如果方法中捕获异常后手动抛出异常,事务并没有回滚。
默认spring事务只在发生未被捕获的 RuntimeException 时才回滚。
spring aop 异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获
RuntimeException 的异常,但可以通过配置来捕获特定的异常并回滚。

解决方法:
1.在catch中抛出异常时抛出异常类型为 RuntimeException ,经测试 Exception 确实不可以回滚。
2.如果catch中有其他需要不可以抛出 RuntimeException ,可以手动回滚事务:
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
事物场景当中,抛出异常被catch之后,如果要回滚事务,一定要手动回滚

spring 控制反转AOP实现权限控制
权限控制:因为在一些项目中,service层的一些方法需要不同的权限才能访问。所以需要权限控制。
所以,我下面写了一个小例子来看一下具体的实现过程。
实现方案:

  1. 自定义一个注解PrivilegeInfo,使用这个注解为service层中的方法进行权限配置
  2. 编写一个注解解析器AnnotationParse。解析注解@PrivilegeInfo(name=” *”)
    注解解析器应该把@PrivilegeInfo中的name属性值解析出来)
  3. 在AOP(AccessTargetObject )中根据PrivilegeInfo注解的值,判断用户是否拥有访问目标方法的权限,有则访问目标,没有则给 出提示
    关键技术:自定义注解+注解解析+Spring AOP
    https://blog.csdn.net/xzp_12345/article/details/78033351

java 反射

  1. 什么是反射?
    反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。
  2. 哪里用到反射机制?
    JDBC中,利用反射动态加载了数据库驱动程序。
    Web服务器中利用反射调用了Sevlet的服务方法。
    Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。
    很多框架都用到反射机制,注入属性,调用方法,如Spring。
  3. 什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作?
    对象序列化,将对象中的数据编码为字节序列的过程。
    反序列化;将对象的编码字节重新反向解码为对象的过程。
    JAVA提供了API实现了对象的序列化和反序列化的功能,使用这些API时需要遵守如下约定:
    被序列化的对象类型需要实现序列化接口,此接口是标志接口,没有声明任何的抽象方法,JAVA编译器识别这个接口,自动的为这个类添加序列化和反序列化方法。
    为了保持序列化过程的稳定,建议在类中添加序列化版本号。
    不想让字段放在硬盘上就加transient
    以下情况需要使用 Java 序列化:
    想把的内存中的对象状态保存到一个文件中或者数据库中时候;
    想用套接字在网络上传送对象的时候;
    想通过RMI(远程方法调用)传输对象的时候。
  4. 反射机制的优缺点?
    优点:可以动态执行,在运行期间根据业务功能动态执行方法、访问属性,最大限度发挥了java的灵活性。
    缺点:对性能有影响,这类操作总是慢于直接执行java代码。
  5. 动态代理是什么?有哪些应用?
    动态代理是运行时动态生成代理类。
    动态代理的应用有 Spring AOP数据查询、测试框架的后端 mock、rpc,Java注解对象获取等。
  6. 怎么实现动态代理?
    JDK 原生动态代理和 cglib 动态代理。
    JDK 原生动态代理是基于接口实现的,而 cglib 是基于继承当前类的子类实现的。
  7. Java反射机制的作用
    1.在运行时判断任意一个对象所属的类
    2.在运行时构造任意一个类的对象
    3.在运行时判断任意一个类所具有的成员变量和方法
    4.在运行时调用任意一个对象的方法
  8. 如何使用Java的反射?
    1.通过一个全限类名创建一个对象
    Class.forName(“全限类名”); 例如:com.mysql.jdbc.Driver Driver类已经被加载到 jvm中,并且完成了类的初始化工作就行了
    类名.class; 获取Class<?> clz 对象
    对象.getClass();
    2.获取构造器对象,通过构造器new出一个对象
    Clazz.getConstructor([String.class]);
    Con.newInstance([参数]);
    3.通过class对象创建一个实例对象(就相当与new类名()无参构造器)
    Cls.newInstance();
    4.通过class对象获得一个属性对象
    Field c=cls.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
    Field c=cls.getDeclaredFields():获得某个类的所有声明的字段,即包括public、private和proteced,但是不包括父类的声明字段
    5.通过class对象获得一个方法对象
    Cls.getMethod(“方法名”,class……parameaType);(只能获取公共的)
    Cls.getDeclareMethod(“方法名”);(获取任意修饰的方法,不能执行私有)
    M.setAccessible(true);(让私有的方法可以执行)
    6.让方法执行
    1). Method.invoke(obj实例对象,obj可变参数);-----(是有返回值的)

分布式面试题整理
1.多系统之间怎么实现通信的?A系统—》B系统的服务
有两种通信方式,第一种是利用HttpClient,HttpClient提供了http服务的能力,其工作原理就类似于我们去打开浏览器访问一个网页去获取数据,最终网页将数据展现出来。HttpClient可以利用get或者post请求去抓取一个接口的数据,从而得到我们需要的数据。

还有一种便是MQ,使用前,首先搭建一个rabbitMQ的服务器,MQ和HttpClient不同的地方在于HttpClient是同步调用,而MQ可以解耦的异步调用的,正是因为这个原因,MQ才很好的解决了同步的响应速度慢的问题。在这里我们使用的是rabbiMq,同类的产品还有例如ActiveMQ,Kafka等。 什么时候使用异步,什么时候同步? (比如我们的缓存系统)

2.Solr集群的搭建
服务器的数量:zookeeper:3台服务器
solr:4台服务器
先搭建zookeeper集群,因为zookeeper集群有存活过半机制,一般服务器选用奇数台最少3台,因为一台就不叫集群了叫zookeeper服务器了,一个leader主节点,两个follower节点
搭建完zookeeper集群,启动zookeeper,启动4台tomcat实例,更改tomcat端口号一般改为8080,8081,8082,8083,再搭建4个单机版solr实例,让zookeeper集群集中管理配置文件,将配置文件上传到zookeeper,将conf下面的内容上传到zookeeper集群中,修改solr.xml的文件,告诉每个solr实例zookeeper集群的位置,在每台Tomcat的bin目录下catalina.bat文件中加入DzkHost指定的zookeeper服务器地址

3.请你谈谈对MQ的理解?以及你们在项目中是怎么用的?
MQ(消息队列)是一种应用程序对应应用程序的通信方法,由于在高并发环境下,由于来不及同步处理,请求往往发生堵塞,通过消息队列,我们可以异步处理请求,缓解系统压力;MQ( Message Queue) ,即消息队列是在消息的传输过程中保存消息的容器。
通俗的说, 就是一个容器, 你把消息丢进去, 不需要立即处理。 然后有个程序去从你的容器里面把消息一条条读出来处理。一般用于应用系统解耦、消息异步分发,能够提高系统吞吐量。

消息队列
注册用户,发邮件(异步)
登录,发短信通知(异步),加积分(异步)
商品添加,异步更新solr,异步更新静态页面

静态页面—库存—实时性较差
接口,库存修改后,重新生成新的静态页面

4.请你谈谈对Redis的认识?
Redis是一种基于键值对的NoSQL数据库(非关系型数据库);是一个key-value存储系统
Redis有两个特点:高能性 可靠性
高能性:Redis将所有数据都存储在内存中,所有读写性特别高
可靠性:Redis将内存中的数据利用RDB和AOF的形式保存到硬盘中,这样就可以避免发生断点或机器故障时内存数据丢失的问题
功能应用
1.数据缓存功能,减少对数据库的访问压力
2.消息队列功能(轻量级)
Redis提供了发布订阅功能和阻塞队列功能
3.计数器-应用保存用户凭证
比如计算浏览数,如果每次操作都要做数据库的对应更新操作,那将会给数据库的性能带来极大的挑战
缓存:优化网站性能,首页 (不常变的信息)
存储:单点登陆,购物车
计数器:登陆次数限制,incr
时效性:验证码expire
订单号:数字

5.redis空间不够,怎么保证经常访问的数据?
淘汰策略:在redis.conf 里面配置,来保证热点数据保存在reids里面。

6.redis应用场景场景:
1.缓存数据服务器
SSO单点登录
2.应对高速读写的场景
秒杀高可用
3.分布式锁
秒杀数据一致性
4.数据共享
库存数据

7.请你谈谈对Spring的认识?
方便解耦,简化开发:通过spring提供的ioc容器,可以将对象之间的依赖关系交由spring进行控制,避免硬编码所造成的过度程序耦合
aop编程的支持;通过spring提供的aop功能,方便进行面向切面的编程
声明式事务的支持
方便几次各种优秀框架
降低JavaEE API的使用难度

Spring是一个开放源代码的设计层面框架,解决业务逻辑层和其他各层的松耦合问题
IOC是一个生产和管理bean的容器,原来调用类中new的东西,现在在IOC容器中产生;
ioc是控制反转,是spring的核心思想,通过面向接口编程来实现对业务组件的动态依赖
Spring的IOC有三种方式注入
1、根据属性注入—set方法注入
2、根据构造方法注入
3、根据注解注入

AOP是面向切面的编程,将程序中的交叉业务逻辑,封装成一个切面,然后注入目标对象;是一种编程思想,将系统中非核心的业务提取出来单独处理

8.请你谈谈单点登录的实现方案?你们怎么包括cookie的安全性?跨域取cookie的问题,你们怎么解决的?
单点登录使用了Redis+Cookie实现
把用户信息放在Redis中,Key作为用户凭证存放在Cookie中放在客户端,通过获取Cookie凭证判断用户是否有登录
Cookie的安全性,我们的凭证是唯一的UUID,使用工具类统一字符串命名,并且设置了Cookie,关闭document.cookie的取值功能
Cookie的跨域问题,在二级域名使用共享Cookie的将多个系统的域名统一作为二级域名,统一平台提供使用主域名,cookie.setPath("/")设置Cooie路径为根路径,通过cookie.setDomain(".父域名")使得项目之间跨域互相访问他们的Cookie

9.请你谈谈购物车的实现方案?当商品信息发生变更,购物车中的商品信息是否可以同步到变化?
现实中购物车有两种情况,未登录时的购物车和登录时的购物车。我们用Redis+Cookie的方法来实现购物车。当点击“加入购物车”按钮时,先获取用户登录凭证,如果没有登录,就将商品的id保存在Redis未登录购物车中,当拦截器拦截到用户登录时,把购物车的内容合并到数据库中登录后购物车里,通过json解析商品id查到商品信息,所以购物车中的商品信息是可以变化的。

10.如何应对高并发问题?
1.HTML静态化,消耗最小的纯静态化的html页面避免大量的数据库访问请求
2.分离图片服务器,对于web服务器来说,图片是最消耗资源的将图片资源和页面资源进行分离,进行不同的配置优化,保证更改的系统消耗和执行效率
3.数据库集群和库表散列,数据库集群由于在架构、成本、扩张性方面都会受到所采用的关系型的限制,在应用程序安装业务和功能模块将数据库进行分离,不同的模块对应不同的数据库或者表,再进行更小的数据库散列,最终可以再配置让系统随时增加数据库补充系统性能;
4.缓存,使用外加的redis模块进行缓存,减轻数据库访问压力
5.负载均衡,在服务器集群中需一台服务器调度角色Nginx,用户所有请求先由它接收,在分配某台服务器去处理;实现负载均衡:http重定向实现,DNS匹配,反向代理
6.动静态分离,对于动态请求交给Tomcat而其他静态请求,搭建专门的静态资源服务器,使用nginx进行请求分发

11.Zookeeper应用场景
1.统一配置管理
持久化节点存放配置信息,监听内容修改
2.集群管理
临时节点机器(节点)退出或者加入,Master选举投票
临时顺序节点选举时候直接使用编号最小的即可
3.分布式锁
创建临时节点,创建成功者获得锁,执行业务操作,独占操作
也可以进行顺序执行,通过最顺序临时节点的编号
4.命名服务
/dubbo

/provider:存放服务地址
/consumer:存放消费地址(没实际意义),
/conf:存放配置信息

consumer通过监听provider节点的内容修改实现动态读取地址,并且支持集群,只需要在provider中存放多个地址然后程序中通过代码实现随机调用即可
12.Nginx应用场景
1.Http服务器,具有提供http服务的能力
location /{
root /home
}
2.虚拟主机,可以对不同的进行端口映射
server{
port:端口
server_name:域名

}

3.反向代理,负载均衡
tomcatlist{
ip1:port [weight=n1];
ip2:port [weight=n2];
}
location{
proxy_pass : tomcatlist;
}
4.动静态分离
location ~.(jpg|css|js|png|html|htm)

13.RabbitMq应用场景
1.系统间异步调用
添加商品时,索引工程创建索引,详情工程生成静态页面
2.顺序消费
队列的特点
3.定时任务
订单的30分钟后关闭
4.请求削峰
双十一和平时的时候的处理
通过消息中间件的消息存储到队列中,服务层只拿取指定数量的消息进行消费从而保证服务层的稳定性,用时间的代价换取性能和稳定的保证再通过成本可以接受的集群搭建提高时间基础

14.谈谈你对ThreadLocal的理解,以及他的作用
答:线程局部变量ThreadLocal为每个使用该变量的线程提供独立的变量副本,每次调用set()方法的时候,每个当前线程都有一个ThreadLocal。应用场景:当很多线程
需要多次使用同一个对象,并且需要改对象具有相同初始化值的时候最适合使用ThreadLocal
作用:解决多线程程序并发问题

15.Erueka和ZooKeeper的区别
1.Erueka是一个是服务端,ZooKeeper是一个进程
2.Erueka是自我保护机制,ZooKeeper是过半存活机制
3.Erueka是AP设计,ZooKeeper是CP设计
4.Erueka没有角色的概念,ZooKeeper有leader和follow

16.池化技术
对象池技术基本原理的核心有两点:缓存和共享,即对于那些被频繁使用的对象,在使用完后,不立即将它们释放,而是将它们缓存起来,以供后续的应用程序重复使用,从而减少创建对象和释放对象的次数,进而改善应用程序的性能。事实上,由于对象池技术将对象限制在一定的数量,也有效地减少了应用程序内存上的开销。

spring静态方法中注入bean
静态方法中直接使用注入的bean对象

  1. @Autowired 用在构造函数上
    我们知道@Autowired 注释,可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,此种方式就是在构造函数上使用@Autowired。
  2. 使用 @PostConstruct 注解
    @PostConstruct是Java EE 5引入来影响Servlet生命周期的注解,被用来修饰非静态的void()方法,@PostConstruct在构造函数之后执行,init()方法之前执行。

spring如何控制bean的加载顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值