三大类 :创建型模式、结构型模式、行为型模式;
**创建型模式:**共5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式
**结构型模式:**共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
**行为型模式:**共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
(1)用户发送请求至前端控制器DispatcherServlet; (2) DispatcherServlet收到请求后,调用HandlerMapping处理器映射器,请求获取Handle; (3)处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet; (4)DispatcherServlet 调用 HandlerAdapter处理器适配器; (5)HandlerAdapter 经过适配调用 具体处理器(Handler,也叫后端控制器); (6)Handler执行完成返回ModelAndView; (7)HandlerAdapter将Handler执行结果ModelAndView返回给DispatcherServlet; (8)DispatcherServlet将ModelAndView传给ViewResolver视图解析器进行解析; (9)ViewResolver解析后返回具体View; (10)DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中) (11)DispatcherServlet响应用户
主要从4个方面
设计:存储引擎,字段类型,范式与逆范式
功能:索引,缓存,分库分表。
架构:主从复制,读写分离,负载均衡。
合理SQL:测试,经验
创建工程环境。
配置数据库连接信息。这里使用yml方式。spring: datasource: username: root url: …
编写实体类。
编写Mapper接口类
启动redis 、配置redis的数据库连接、编写redis操作工具类、测试
非关系型数据库,C编写的, key,value键值对数据库 数据存储在内存中 读写快。
优点:读写快,支持数据持久化,数据结构丰富,
缺点:容易受到物理内存的限制,不能作为海量数据的高性能读写 ,不具备容错和恢复功能。
适应场景在较小的数据量的高性能操作和运算上。
实例化 Instantiation、属性赋值 Populate、初始化 Initialization、销毁 Destruction
一级缓存默认开启,查询时先从缓存中查询,缓存中没有对应数据时再进行数据库查询。
二级缓存即查询缓存,他的作用于是mapper和namespace,二级缓存可以跨SqlSession
@RestController表示该方法的返回结果直接写入HTTP response body中 @RequestMapping 注解 处理请求地址映射
@EnableAutoConfiguration 注解允许 Spring Boot 自动配置注解
@Configuration用于定义配置类
@SpringBootApplication用在 Spring Boot的主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。 @ComponentScan 组件扫描。让spring Boot扫描到Configuration类并把它加入到程序上下文。
@ResponseBody
@Component
@AutoWired
@RequestParam用在方法的参数前面:
@PathVariable 路径变量。参数与大括号里的名字一样要相同 @ResponseBody表示该方法的返回结果直接写入HTTP response body 中
@Repository 用于标注数据访问组件,即DAO组件
ACID 原子性、一致性、隔离性、持久性
原子性(要么全部成功要么全部失败,不会结束在中间某个环节)
一致性(执行前和执行后数据库保持在一致性状态)
隔离性(数据所处的状态要么是更改之前的状态要么是更改之后的状态 不会看到中间的状态数据)
持久性(只要事务成功结束,那么数据库的数据就会永久保存下来,即使数据库崩溃 重新启动后数据库还能恢复到事务成功结束的状态)
不考虑事务的隔离性会出现几种:脏读(在一个事务里读取到领另一个未提交事务的数据)、不可重复读(在一个事务范围内多次查询返回的数据不同的数据, 发生在修改)、幻读( 前后两次读取的数据在第二次查询的时候能查到都第一次看不到的行数据,发生在插入和删除 )
事务的ACID是通过InnoDB的日志和锁来保证的,事务的隔离性通
过数据锁的机制实现的
22、RESTful是一种设计风格而不是规范,比如接口的命名不以动词命名(如findById deleteById等),不同的请求方式代表了相应的动作 比如 /user接口 crud操作只需要更换不同的请求方式即可 一个接口即可搞定 而不需要定义多个接口
InnoDB、MyISAM、MEMORY、ARCHIVE
MyISAM索引与InnoDB索引的区别?
InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。
23.1、InnoDB引擎的4大特性
插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(ahi)、预读(read ahead)
23.2、引擎的选择?
如果要提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择。
如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率。
如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。
如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使 Archive。
@ResponseBody注解表示该方法的返回的结果直接写入 HTTP 响应正文中,一般在异步获取数据时使用。通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上 @Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
@RequestBody是作用在形参列表上,用于将前台发送过来固定格式的数据(xml 格式或者 json等)封装为对应的 JavaBean 对象,封装时使用到的一个对象是系统默认配置的 HttpMessageConverter进行解析,然后封装到形参上。
在GET请求中 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ,不能使用@RequestBody。在POST请求,可以使用@RequestBody和@RequestParam,但是如果使用@RequestBody,对于参数转化的配置必须统一。
1.存取的速度快,数据永久保存
2.第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
25.1、数据库中为什么要用索引?这么多优点怎么不在每一个表中的列都使用索引呢 ?
1、可以大大加快数据的检索速度,使用索引,提高系统的性能。
2、时间上:在每一列上使用索引耗费时间,在使用时会降低执行效率,
空间上:会占用物理空间
25.2、你在开发的时候用到索引了吗 应用场景是?
数据量的时候查询字段较多的时候
当数据多且字段值有相同的值得时候用普通索引,当字段多且字段值没有重复的时候用唯一索引,当有多个字段名都经常被查询的话用复合索引。
好处:异步处理、流量削峰、消息通讯、应用解耦;
缺点:可用性降低、复杂度提高、一致性问题
Rabbit :支持高并发高吞吐、支持集群化、功能较为完善
使用场景:顺序消费、服务间异步通信、定时任务、请求削峰
三种 :单机部署,集群部署,伪集群部署。
数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁、分布式队列
在开发阶段写下的这些判断仅为了调试的语句,在开发完成时需要查找并移除。部署运行后,尤其是在一些企业应用系统中,还经常需要进一步调试,这时就遇到了更大的麻烦。所以,我们需要一套完备的、灵活的、可配置的日志工具log4J就是优秀的选择。
28.1、Log4j主要由哪三部分组成?每部分的主要作用是什么?
Log4j 由 logger、appender 和 layout 三个组件组成。可以通过同名的 Java 类访问 Log4j 的这三个组件。
Logger 在执行应用程序时,接收日志语句生成的日志请求。它是一种重要的日志处理组件, 可以通过 log4j API 的 logger 类对其进行访问。它的方法有:debug、info、warn、error、fatal 和 log。这些方法用于记录消息。 Appender - 管理日志语句的输出结果。执行日志语句时,Logger 对象将接收来自日志语句的记录请求。此请求是通过 logger 发送至 appender 的。然后,Appender 将输出结果写入到用户选择的目的地。对于不同的日志目的地,提供不同的 appender 类型。这些 appender 包括:用于文件的 file appender、用于数据库的 JDBC appender 和用于 SMTP 服务器的 SMTP appender。 Layout - 用于指定 appender 将日志语句写入日志目的地所采用的格式。appender 可以用来格式化输出结果的各种布局包括:简单布局、模式布局和 HTML 布局。
线程池作用就是限制系统中执行线程的数量。
1、提高效率 创建好一定数量的线程放在池中,等需要使用的时候就从池中拿一个,这要比需要的时候创建一个线程对象要快的多。
2、方便管理 可以编写线程池管理代码对池中的线程同一进行管理
3、降低资源消耗
29.1、线程池都有哪几种工作队列
1、ArrayBlockingQueue
是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。
2、LinkedBlockingQueue
一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列
3、SynchronousQueue
一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。
4、PriorityBlockingQueue
一个具有优先级的无限阻塞队列。
Nginx是一个轻量级/高性能的反向代理Web服务器,他实现非常高效的反向代理、负载平衡
30.1、为什么要用Nginx?
跨平台、配置简单、方向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少,
而且Nginx内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。
使用Nginx的话还能:
节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
稳定性高:宕机的概率非常小
接收用户请求是异步的
30.2、Nginx的优缺点?
占内存小,可实现高并发连接,处理响应快
可实现http服务器、虚拟主机、方向代理、负载均衡
Nginx配置简单
可以不暴露正式的服务器IP地址
30.3、Nginx应用场景?
http服务器。Nginx是一个http服务可以独立提供http服务。可以做网页静态服务器。
虚拟主机。可以实现在一台服务器虚拟出多个网站,例如个人网站使用的虚拟机。
反向代理,负载均衡。当网站的访问量达到一定程度后,单台服务器不能满足用户的请求时,需要用多台服务器集群可以使用nginx做反向代理。并且多台服务器可以平均分担负载,不会应为某台服务器负载高宕机而某台服务器闲置的情况。
nginz 中也可以配置安全管理、比如可以使用Nginx搭建API接口网关,对每个接口服务进行拦截。
30.4、Nginx 是如何实现高并发的?