Redis缓存知识点:
Redis默认端口号:6379
Tomcat默认端口号:8080
Redis是一款开源的基于内存的高性能的key-value数据库,(nosql非关系型数据库)常用来实现缓存,也可以被看作是一个数据结构服务器,单线程操作,16384(0-16383)个哈希槽16(0-15)个库,redis有两种文件格式:全量数据和增量请求
Redis中使用hash存值,采用redisTemplate中boundHash(),这个方法内部是个key链式,方法中有set(key,value),如果是取值,get(key)这里的key是获取到的boundHash中的key,如果要再获取里面的key,再使用get方法获取
Redis主从复制:reids的主从结构可以采用一主多从或者级联结构,redis主从复制可以根据是否是全量分为全量同步和增量同步
Q:redis是内存版数据库,如果内存存储满了怎么办?
A:1.redis集群:一定程度上可以解决内存不够的情况;但是随着网站用户不断增多,用户所产生的数据会越来越多,服务器越来越多,并不代表性能越高
2.内存淘汰策略-最近不使用的数据存内存中淘汰,redis,conf配置内存淘汰策略
Q:redis是否是线程安全的数据库?
A:1.redis是线程安全的数据库,redis是一个开源,高性能的key-value数据库,并用于构建高性能,可扩展的web应用程序的完美解决方案
redis的特点:Redis是一个单线程的数据库(单通道);redis数据库完全在内存中,使用磁盘仅用于持久性;相比较许多键值数据存储,reids拥有较为丰富的数据类型redis可以将数据复制到任意数量的从服务器
Q:redis的hash槽?
A:redis共有16384个hash槽,是固定的不能改变无论集群点多少;hash槽将会动态的分配给每个服务器;注意:hash槽不是用来存储数据的,是用来计算该把数据存在那个服务器里,相当于仓库的门.
Q:redis缓存down掉的解决方案:
A:1.redis的哨兵机制+主从复制:哨兵机制(为了实现redis故障转移的自动化,自动发现自动转移);主从复制(部署节点是监控节点,都是redis实例,但不是存储数据,只是监控主从数据的节点状态,如果哨兵判断主节点down掉,会关闭主节点,然后把从节点变为主节点,并通过应用方redis主节点改变,修改客户端调用地址并重启客户机)
哨兵机制怎么判断主节点down掉?哨兵机制是建立了多个哨兵节点,他们的共同监制数据节点的运行状态.同时哨兵节点之间也相互通信相互监控主节点(1.主观下线和客观下线:一个哨兵节点判断主节点down掉是主观下线,只有半数的哨兵节点都主观判断主节点down掉,此时多个哨兵节点交换主观判断结果,才会判定主节点客观下线;2.基本上那个哨兵节点最先判断出这个主节点客观下线,就会在各个哨兵节点中发起投票机制,每个哨兵都投自己为领导,最终被投为领导者的哨兵节点完成主从自动化切换的过程,但判定为主观下线时,不会进行主从切换过程)
Jedis是redis官方推出的一款面向java的客户端,提供了很多接口供Java调用。
Spring知识点:
Spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架
Spring是完全面向接口的设计,降低程序耦合性,主要是事务控制并创建bean实例对象.在ssh/ssm整合时,充当粘合剂的作用.控制反转(IOC:产生对象实例)/依赖注入(DI)
目的:就是让对象与对象(模块与模块)之间的关系没有通过代码来关联,都是通过配置类说明 管理的(Spring根据这些配置 内部通过反射去动态的组装对象)要记住:Spring是一个容器,凡是在容器里的对象才会有Spring所提供的这些服务和功能。
SpringIOC和AOP:
AOP:面向切面编程,拦截器,日志监控,以横切的方式切入,在不改变代码的情况下,对方法做增强(可以通过动态代理来实现AOP:动态代理有两种实现方法1.可以通过jdk的动态代理实现,必须有接口的支持,2.cglib来实现,基于类)[在秒杀的时候用到AOP]
IOC就是一个生产和管理的bean容器就可以了,原来需要在调用类中new的东西,现在都是通过容器生成,同时,要产生的是单例的bean,它还可以管理bean的声明周期,也称依赖注入,是面向编程的一种设计理念,用来降低代码之间的耦合度
动态代理:
利用Java的反射技术,在运行时创建一个实现某些给定接口的新类,代理的是接口,不是类,更不是抽象类;解决问题:一个接口的实现在编译时无法知道,需要在运行时才能运行,实现某些设计模式(适配器和修饰器)面向切面编程(AOP)
Spring特点介绍:
方便解耦,简化开发;AOP的编程支持,声明式事务的支持,方便程序的测试,方便集成各种优秀的框架,
Spring有七个定义良好的模块组成:
SpringAop,SpringDao,SpringORM,SpringWeb,SpringMVC,(BeanFactory)核心控制 容器,spring上下文
面向对象:
面向对象(Object Oriented,OO)是软件开发方法,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。面向对象的三大特性:封装、继承、多态,面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、
多态是面向对象很重要的一个特性,转型是多态的具体体现。多态还包括重载和重写。转型:转型分为向上转型和向下转型。向上转型是子类对象转换成父类对象,直接转就可以,向下转型是父类对象转换成子类对象,这需要强转,在转换过程中要保证此父类对象“本体”是由子类对象实例化的。重载:重载发生在同一个类中,在该类中如果存在多个同名方法,但是方法的参数类型和个数不一样,那么说明该方法被重载了。重写:重写发生在子类继承父类的关系中,父类中的方法被子类继承,方法名,返回值类型,参数完全一样,但是方法体不一样,那么说明父类中的该方法被子类重写了。1,也叫子类的方法覆盖父类的方法,要求返回值、方法名和参数都相同。2,子类异常不能超出父类异常3,子类访问级别不能低于父类访问级别
封装:将具体的实现细节装到一个容器中,并封闭起来,防止容器外部直接访问容器内部的实现细节,仅公开暴露指定的访问路径,
继承:继承可以使得子类具有父类的属性和方法或者重新定义、追加属性和方法等。
requried方式执行
幂等性:
指同一个操作无论请求多少次其结果都相同,
实现方法: 1.操作之前在业务方法进行判断,如果执行过了就不再执行
2.缓存所有请求和处理结果,已经处理的请求则直接返回结果
3.在数据表中加个状态字段,(未处理,已处理)数据操作时判断未处理时再处理
Spring常用注解:
1、@Controller 控制器(注入服务)对应表现层bean,也就是action
2、@Service 服务(业务层)对应业务层bean
3、@Repository dao(实现dao访问)数据访问层dao
4、@Component (把普通pojo实例化到spring容器中,相当于配置文件中的)是所有受spring管理组件的通用形式,可以放在类的上面
@RequestBody和@ResponseBody的区别:
@ResponseBody是作用在方法上的,@RequestBody表示该方法的返回结果直接写入Http response body中,一般在异步获取数据时使用(AJAX),在使用@RequestMapping后,返回值通常解析为跳转路径,但是加上@ResponseBody后返回结果不会被解析为跳转路径,而是直接写入Http response body中.比如异步获取json数据,加上@ResponseBody后,会直接返回json数据,@RequestBody将http请求正文插入方法中,使用适合的HttpMessageConverter将请求体写入某个对象
内存泄漏和内存溢出:
内存泄露 (memory leak),是指应用程序在申请内存后,无法释放已经申请的内存空间。一次内存泄露危害可以忽略,但如果任其发展最终会导致内存溢出(out of memory)。如读取文件后流要进行及时的关闭以及对数据库连接的释放。
内存溢出(out of memory)是指应用程序在申请内存时,没有足够的内存空间供其使用。如我们在项目中对于大批量数据的导入,采用分段批量提交的方式
SpringMVC知识点:
SpringMVC的执行流程:
第一步:用户发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping(处理器映射器)查找 Handler
可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView
ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析
根据逻辑视图名解析成真正的视图(jsp)、html、freemarker、pdf…
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染
视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果
springmvc的拦截器和过滤器哪个先执行,为什么?
1:过滤器Filter需要在web.xml中配置,依赖于Servlet
2:拦截器Interceptor需要在SpringMVC中配置,依赖于框架
3:过滤器Filter的执行流程顺序在Inteceptor之前
过滤前-拦截前-Action处理-拦截后-过滤后:
过滤是一个横向的过程,首先把客户端提交的内容进行过滤,过滤通过后,拦截器(Interceptor)是基于Java的反射机制将检查用户提交数据的验证,做一些前期的数据处理,接着把处理后的数据发给对应的Action;Action处理完成返回后,拦截器还可以做其他过程,再向上返回到过滤器,而过滤器(Filter)是基于函数回调的后续操作
SpringMVC常用注解:
1、
@Controller负责前端控制器发送的请求
2、
@RequestMapping是一个用来处理请求地址映射的注解
3、@Autowired为Spring提供的注解,是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。
@Resource默认按照ByName自动注入,由J2EE提供,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。
4、@PathVariable取出uri模板中的参数作为变量
Springmvc的优点:
-
基于组件技术的.全部的应用对象,无论控制器和视图.还是业务对象之类的都是java组件,并且和spring提供的其他基础结构紧密集成
-
不依赖于servlet api目标虽是如此,但是在实现的时候确实是依赖于servlet
-
可以任意使用各种视图技术,而不仅仅局限于jsp
-
支持各种请求资源的映射策略
-
易于扩展
Mybatis知识点:
Mybatis是一个优秀的持久层框架,他对jdbc的操作数据库的过程进行了封装,使开发者只需要关注sql本身,而不需要花费精力去处理,例如:注册驱动,创建connection,创建statement,手动设置参数等.Mybatis通过xml或者注解的方式将要执行的各种statement(statement,prepared
Statement,call able Statement)配置起来,并通过Java对象和statement中的sql进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射成java对象并返回
Mybatis和Hibernate的区别:
Mybatis技术特点:(需求多变的互联网项目:电商项目)
-
学习门槛低,学习成本低,只要有SQL基础,就可以学习mybatis,很容易上手
-
直接编写sql语句,可以对SQL进行性能的优化,灵活多变代码维护性好
不能支持数据库无关性,数据库发生变更,要写多套代码进行支持,移植性不好
需要编写映射结果
Hibernate技术特点:(需求明确,业务固定的项目,oa,erp)
-
学习门槛高,需要对数据库模型有良好的基础,而且在设置OR映射的时候需要考虑好性能和对象模型的权衡
-
便准的orm框架,程序员不需要编写sql语句,orm对象关系映射,程序员不能自主的去进行sql性能优化
-
具有良好的数据库无关性,及数据库发生变更,代码无需再次编写
mybatis返回自增主键的方式有几种?#{},${}
1、主键返回之自增主键(useGeneratedKeys="true"keyProperty=“id”)
2、使用selectKey标签,resultType结果的类型,keyProperty:selectKey 语句结果应该被设置的目标属性,order="AFTER"或者before
Mysql的索引分为单列索引(主键索引,唯一索引,普通索引)和组合索引
单列索引:一个索引只包含一个列,一个表可以有单列索引
组合索引:一个组合索引包含两个和两个以上的实例
使用索引的优点:
可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性.
-
建立索引可以大大提高检索的数据,以及减少表的检索行数
-
建立索引,在查询中使用索引 可以提高性能
使用索引的缺点:
在创建索引和维护索引 会耗费时间,随着数据量的增加而增加
2.索引文件会占用物理空间,除了数据表需要占用物理空间之外,每一个索引还会占用一定的物理空间
SQL优化:
-
尽量使用列名,在业务密集的SQL中尽量使用EXISTS代替IN
-
尽量使用内部函数,提高SQL优化
-
多使用COMMIT提交
-
在WHERE句中,尽量避免使用!=,<,>,IN或者NOT IN
-
与HAVING相比尽量使用WHERE
-
尽量使用多表连接查询避免子查询
-
SELECT子句中避免使用*
-
必须选择记录条数最少的表作为基础表
-
用>=代替>,用IN代替OR
Spring Cloud知识点:
分布式微服务下的一站式解决方案,是各个微服务架构落地技术的集合体,俗称为服务全家桶
微服务:以前所有的代码都在同一个工程中部署在一个服务器中同一个项目的不同模块不同功能进行相互抢占资源 现在:讲工程根据不同的业务进行拆分,并且部署到不同的服务器上,服务与服务之间采用dubbo进行通信
优点:
单一职责:微服务中的每一个服务都对应唯一的业务能力
面向服务:每一个服务都要对外暴漏服务接口API,并不关心服务的技术实 现,做到与平台的无关性
Eurake:注册中心 Zuul:服务网关 Ribbon:负载均衡 Feign:服务调用 Hystix:熔断器
SpringCloud的版本命名比较特殊,因为他不是一个组件,二十许多组件的集合,他的命名是以A到Z为首字母的一些单词组成(dubbo是基于rpc远程远程过程调用,微服务基于http的rest)
从技术维度理解:微服务核心是从传统的一站式服务,根据业务拆分成一个一个的服务,彻底地去耦合,
从技术角度看就是一种小而独立的处理过程(架构风格是一种将单个应用程序作为一小套小型服务开发的方法),类似进程概念,能够自信独立启动或销毁,拥有自己独立的数据库,强调的是服务的大小,关注的某一个点,
微服务的优点:微服务只是业务逻辑的代码,不会和html,css或者其他界面组件混合,每个微服务都有自己的存储能力,可以有自己的而数据库,也可以有统一的数据库
微服务的缺点:开发人员要处理分布式系统的复杂性,多服务运维难度,随着服务的增加,运维的压力也在增加,系统部署依赖,服务间通信成本,数据一致性,系统集成测试,性能监控
服务熔断:一般是某个服务故障或者异常引起,类似保险丝,当某个异常条件被触发,直接熔断整个服务,而不是一直等到此服务超时
首先,nginx启动的时候会解析配置文件,得到里面的端口号和ip地址,然后在nginx的master中初始化监控的socket再进行监听,通过创建子进程进行连接,此时客户端就可以向nginx发起连接,进行3次握手,当客户端或者nginx主动关闭后,nginx结束
正向代理:代理的是客户端
反向代理:代理的是服务端
负载均衡:负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中
负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力
Mongodb:
MongoDB 是一个跨平台的,面向文档的数据库。它支持的数据结构非常松散,是类似JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
(1)面向集合存储,易于存储对象类型的数据
(2)模式自由
(3)支持动态查询
(4)支持完全索引,包含内部对象
(5)支持复制和故障恢复
(6)使用高效的二进制数据存储,包括大型对象(如视频等)
(7)自动处理碎片,以支持云计算层次的扩展性
启动一个线程是调用start()方法,使线程就绪状态,以后可以被jvm调度为运行状态,一个线程必须关联一些具体的执行代码,run()方法是该线程所关联的执行代码。