发布时间:2024-03-07 17:01
Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行。
Docker不是虚拟化方法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他工具。为此,Docker最初使用LXC驱动程序,然后移动到libcontainer现在重命名为runc。Docker主要专注于容器内自动部署应用程序。应用程序容器旨在打包和运行单个服务,而系统容器则设计为运行多个进程,如虚拟机。因此,Docker被视为容器化系统上的容器管理或应用程序部署工具。A 容器不需要引导操作系统内核,因此可以在不到一秒的时间内创建容器。此功能使基于容器的虚拟化比其他虚拟化方法更加独特和可取。B 由于基于容器的虚拟化为主机增加了很少或没有开销,因此基于容器的虚拟化具有接近本机的性能。C 对于基于容器的虚拟化,与其他虚拟化不同,不需要其他软件。D 主机上的所有容器共享主机的调度程序,从而节省了额外资源的需求。E 与虚拟机映像相比,容器状态(Docker或LXC映像)的大小很小,因此容器映像很容易分发。F 容器中的资源管理是通过cgroup实现的。Cgroups不允许容器消耗比分配给它们更多的资源。虽然主机的所有资源都在虚拟机中可见,但无法使用。这可以通过在容器和主机上同时运行top或htop来实现。所有环境的输出看起来都很相似。在应用程序
Docker镜像是Docker容器的源代码,Docker镜像用于创建容器。使用build命令创建镜像。
Docker容器包括应用程序及其所有依赖项,作为操作系统的独立进程运行。
四种状态:运行、已暂停、重新启动、已退出。
FROM:指定基础镜像
LABEL:功能是为镜像指定标签
RUN:运行指定的命令
CMD:容器启动时要运行的命令
「7. Dockerfile中的命令COPY和ADD命令有什么区别」
COPY与ADD的区别COPY的SRC只能是本地文件,其他用法一致
docker pull 拉取或者更新指定镜像
docker push 将镜像推送至远程仓库
docker rm 删除容器
docker rmi 删除镜像
docker images 列出所有镜像
docker ps 列出所有容器
关系型数据库,
1.语句优化
1、查询语句中不要使用 *
2、尽量减少子查询,使用关联查询(left join,right join,inner join)替代
3、减少使用IN或者NOT IN ,使用exists,not exists或者关联查询语句替代
4、or 的查询尽量用 union或者union all 代替
5、合理的增加冗余的字段(减少表的联接查询)
6、增加中间表进行优化(这个主要是在统计报表的场景,
后台开定时任务将数据先统计好,尽量不要在查询的时候去统计)
7、建表的时候能使用数字类型的字段就使用数字类型(type,status...),数字类型的字段作为条件查询比字符串的快
8、那些可以过滤掉最大数量记录的条件必须写在WHERE子句的最末尾
是一个非关系型数据库
1.读写性能好
2.支持数据持久化,支持AOF和RDB两种持久化方式
3.支持事物,Redis所有的操作都是原子性的
4.支持主从复制
Redis高性能和高并发用做了Redis的缓存
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
RDB和AOF两种持久化机制
不可以,因为String类有final修饰符,而final修饰的类是不能被继承的
String 是final类型,每次声明的都是不可变的对象,所以每次操作都会产生新的String对象,然后将指针指向新的String对象。
StringBuffer和StringBuilder都是在原有对象上进行操作,所以如果需要经常改变字符串内容,建议采用这两者。
StringBuffer和StringBuilder 比较,StringBuffer是线程安全的,后者线程不安全。线程不安全的性能更高,所以在开发中,优先采用StringBuilder。
StringBuilder > StringBuffer > String
ArrayList和LinkedList都实现了List接口,有以下的不同点:
ArrayList是基于索引的数据接口,它的底层是数组。它查找快,增删慢,属于线程不安全
LinkedList是通过链表形式存储数据,它查找慢,增删快,也是线程不安全的
Vector 是线程安全的,但是效率没有上面那两种高
Collection是一个集合接口,它提供了对集合对象进行操作的通用接口方法,实现接口主要有list和set等。而collections是对集合类的一个包装类
1.hashmap是一个常用的map是HashTable的轻量级实现,他们都完成了Map接口,主要区别在于HashMap允许空键值,而HashTable不允许
2.HashTable是线程安全的,而HashMap不支持线程同步,所以他不是线程安全的,同时就效率而言,HashMap 的可能高于HashTable。
3.HashTable使用Enumeration HashMap使用Iterator
4.hash值使用不同,HashTable直接使用对象的HashCode
一般而言,在Map中插入、删除和定位元素,HashNMap是最好的选择。由于TreeMap实现了SortMap接口,能够把它保存的记录根据键排序,因此,取出来的是排序后南健值对,如果需要按自然顺序或自定义顺序遍历键,那么TreeMap会更好.
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用hasNext()检查序列中是否还有元素。
(3) 使用remove()将迭代器新返回的元素删除。
1)Set集合其最主要的特点是集合中的元素不能重复,因此存入Set中的每个元素都必须定义equals()方法来确保对象的唯一性。该接口有两个实现类:HashSet和TreeSet。其中TreeSet实现了SortedSet接口,因此TreeSet容器中的元素是有序的。
2) List又称为有序的Collection。它按对象进入的顺序保存对象,所以它能对列表中的每个元素的插入和删除位置进行精确的控制。同时,它可以保存重复的对象。LinkedList、ArayList Vector都实现了List接口
3)Map提供了一个从键映射到值的数据结构。它用于保存键值对,其中值可以重复,但键是唯一的,不能重复。该接口有多个实现类:HashMap、TreeMap等。虽然它们都实现了相同的接口,但执行效率却不是完全相同的。具体而言,HashMap是基于散列表实现的,采用对象的HashCode可以进行快速查询。TreeMap 基于红黑树的数据结构来实现的,内部元素是按需排列的。
指在程序执行过程中,能够执行程序代码的一个执行单元,在Java语言中有运行、就绪、挂起、结束、阻塞这几种状态;
进程是指一段正在执行的程序,而线程就是程序执行的最小单元,一个进程有多个线程在运行,也成为多线程。
1. 继承Thread类,重写run方法
2. 实现Runnable接口,重写run方法;
3. 实现Callable接口,重写call方法,可以抛出异常,有返回值。
1.synchronized关键字来实现
2.wait()方法和notiy()方法
3.通过Lock锁机制
把消息队列可以比作是一个存放消息的容器,当我们需要使用消息的时候可以取出消息供自己使用。消息队列是分布式系统中重要的组件,使用消息队列主要是为了通过异步处理提高系统性能和削峰、降低系统耦合性。目前使用较多的消息队列有ActiveMQ,RabbitMQ,Kafka,RocketMQ
1.通过异步处理提高系统性能(削峰、减少响应所需时间);
2.降低系统耦合性
Error 和 Exception
Error
Error:表示程序在运行期间出现了非常严重的错误,并且该错误是不可恢复的
Exception
Exception:表示可以恢复的异常,是编译器可以捕捉到的,分为两种类型:检查异常(非运行时异常)和运行时异常;
非运行时异常有:IO异常、SQL异常、NoSuchFileException NoSuchMethodException
运行时异常:空指针异常、算数异常、类型转换异常、数组越界异常、数字格式异常
方式一:使用for循环把数组元素加进list
方式二:使用Arrays.asList()方法
方式三:使用Collections.addAll()
方式四:使用Stream中的Collector收集器
Servlet是采用Java预语言编写的用来处理客户端请求并产生动态网页内容的一个服务端程序。Servlet主要是用来处理或者是存储HTML表单提交的数据,产生动态内容,在无状态的HTTP协议下管理状态信息。
Servlet中没有main方法,它是在容器的控制下执行的,最常见被使用的容器就是Tomcat,当web服务器获取到一个Servlet的请求时,该服务器会把这个请求交给对应的容器来处理,容器通过调用Servlet的方法(doPost和doGet方法)来响应客户端的请求。
加载 - 实例化 - 初始化 - 处理请求 - 服务结束
所有的Servlet都必须要实现的核心的接口是javax.servlet.Servlet。每一个Servlet都必须要直接或者是间接实现这个接口,或者继承javax.servlet.http.HTTPServlet。最后,Servlet使用多线程可以并行的为多个请求服务。
Spring框架是Java企业级应用的开源开发框架,它有两大核心IOC和AOP,提供了对轻量级IOC的良好支持,也对AOP技术提供了很好的封装
IOC称为控制反转,有时也被称为依赖注入,是一种降低对象之间耦合关系的设计思想,通过注入一个实例化的对象来达到解耦的目的采用IOC机制能提高系统的可扩展性
AOP称为面向切面编程,是对面向对象开发的一种补充,它允许开发人员在不改变原来模型的基础上动态修改模型以满足新的需求。
Spring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:构造方法注入,setter注入,基于注解的注入
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。Spring MVC 拥有控制器,作用跟Struts类似,接收外部请求,解析参数传给服务层
MVC是指,C控制层,M模块层,V显示层这样的设计理念,
1.客户端发http请求,服务器接收到请求,如果匹配DispatchServlet的请求映射路径(在web.xml中指定),web容器将请求转发交给DispatchServlet处理。
2.DispatchServlet根据请求的信息(包括URL,http方法,请求报文头,请求参数,cookie等)及HandlerMapping的配置找到处理请求的的处理器(Handler)。
3.得到请求的Handler后,通过HandlerAdapter对Handler进行封装,再以统一的适配器接口调用Handler。HandlerAdapter是一个适配器,它用统一的接口对各种Handler方法进行调用
4.处理器完成业务逻辑处理后将返回一个ModelAndView给DispatchServlet, ModelAndView包含了视图逻辑名和模型数据信息。
5.当得到真实的视图队形view后,DispatchServlet就使用这个view对象,对ModelAndView中的模型数据进行视图渲染。
6.客户端得到响应消息,可能是HTML、xml、json等不同的媒体格式。
1)DispatcherServlet接口:
Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
(2)HandlerMapping接口:
能够完成客户请求到Controller映射。
(3)Controller接口:
需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。
Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。
从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
(4)ViewResolver接口
Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
是整个Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。其主要工作有以下三项:
(1)截获符合特定格式的URL请求。
(2)初始化DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。
(3)初始化Spring MVC的各个组成组件,并装配到DispatcherServlet中。
1.轻量级,简单易学
2.高效,是基本请求响应的MVC框架
3.与Spring兼容性好,无缝结合;约定大于配置;功能强大
1、@Controller
在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。
在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest 和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。
@Controller 用于标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。@Controller 只是定义了一个控制器类,而使用@RequestMapping 注解的方法才是真正处理请求的处理器。单单使用@Controller 标记在一个类上还不能真正意义上的说它就是SpringMVC 的一个控制器类,因为这个时候Spring 还不认识它。那么要如何做Spring 才能认识它呢?这个时候就需要我们把这个控制器类交给Spring 来管理。有两种方式:
(1)在SpringMVC 的配置文件中定义MyController 的bean 对象。
(2)在SpringMVC 的配置文件中告诉Spring 该到哪里去找标记为@Controller 的Controller 控制器。
2、@RequestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性,下面我们把她分成三类进行说明(下面有相应示例)。
1、 value, method;
value: 指定请求的实际地址,指定的地址可以是URI Template 模式(后面将会说明);
method: 指定请求的method类型, GET、POST、PUT、DELETE等;
2、consumes,produces
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;
3、params,headers
params: 指定request中必须包含某些参数值是,才让该方法处理。
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求。
3、@Resource和@Autowired
@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
Spring boot 不是对Spring功能上的增强,而是提供了一种快速使用Sping的方式
用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yaml文件)
创建独立的spring应用程序 main方法运行
嵌入的Tomcat 无需部署war文件
简化maven配置
自动配置spring添加对应功能starter自动化配置