csworkman

个人博客

SpringBoot日志

2022-3-28 Mr Chang springboot

SpringBoot 能自动适配所有的日志,而且底层使用slf4j+logback的方式记录日志,引入其他框架的时候,只需要把这个框架依赖的日志框架排除掉;

评论(0) 浏览(810)

配置文件优先级

2022-3-25 Mr Chang springboot

内部配置文件加载顺序:
-file:  ./config/
-file:  ./
-classpath:/config/
-classpath:

外部配置加载顺序:

(优先级从高到低:)

1.命令行参数
2.来自java:comp、env的JNDI属性
3.JAVA系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性

评论(0) 浏览(829)

Spring 获取配置文件属性值 @ConfigurationProperties 和 @Value 比较

2022-3-16 Mr Chang springboot

  1. @Con 支持批量注入配置文件 @Value 只能一个个指定
  2. @Con 支持松散绑定(松散语法) @Value 不支持
  3. Spel :@Con 不支持  @Value 支持
  4. JSR303数据校验:@Con 支持  @Value 不支持
  5. 复杂类型封装:@Con 支持 @Value 不支持
我们只是在某一个业务逻辑中需要获取以下配置文件中的某个值,使用@Value
我们专门编写了一个javaBean来和配置文件进行映射,我们就直接使用@Con

评论(0) 浏览(930)

吞吐量(TPS)、QPS、并发数、响应时间(RT)概念

2022-3-15 Mr Chang 面试题

1.响应时间(RT)
     响应时间是指系统对请求作出响应的时间。







2.吞吐量(Throughput)
    吞吐量是指系统在单位时间内处理请求的数量。对于无并发的应用系统而言,吞吐量与响应时间成严格的反比关系,实际上此时吞吐量就是响应时间的倒数。前面已经说过,对于单用户的系统,响应时间(或者系统响应时间和应用延迟时间) 可以很好地度量系统的性能。但对于并发系统,通常需要吞吐量作为性能指标。

3.并发用户数
     并发用户数是指系统可以同时承载的正常使用系统功能的用户的数量。与吞吐量相比,并发用户数是一个更直观但也更笼统的性能指标。实际上,并发用户数是一个非常不准确的指标,因为用户不同的使用模式会导致不同用户在单位时间发出不同数量的请求。

4.QPS  每秒查询率(Query Per Second)
     每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率衡量。对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。(看来是类似于TPS,只是应用于特定场景的)

评论(0) 浏览(873)

什么是二级缓存?

2022-3-14 Mr Chang 面试题

     CPU 最初缓存只有一级,二级缓存出现是为了协调一级缓存与内存之间的速度,二级缓存比一级缓存速度更慢,容量更大,主要就是做一级缓存和内存之间数据临时交换的地方用。
     实际上,现在Intel和AMD处理器在一级缓存的逻辑结构设计上有所不同,所以二级缓存对CPU性能的影响也不尽相同。
     从理论上讲,在一颗拥有二级缓存的CPU中,读取以及缓存的命中率为80%。也就是说CPU一级缓存中找到的有用数据占数据总量的80%,剩下的20%从二级缓存中读取。


CPU二级缓存的工作原理
  
1.缓存的工作原理就是当CPU要读取一个数据时,首先要从缓存中查找,如果找到就立即读取并送给CPU处理。
2.如果没有找到,就用相对慢的速度从内存中读取并送给CPU处理,同时把这个数据所在的数据块调入缓存中,可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。
3.正是这样的读取机制使CPU读取缓存的命中率非常高(大多数CPU可达90%左右)也就是说CPU下一次要读取的数据90%都在缓存中,只有大约10%需要从内存中读取,这大大节省了CPU直接读取内存的时间,也使CPU读取数据时基本无需等待。
4.总的来说,CPU读取数据的顺寻是先缓存后内存。































评论(0) 浏览(886)

Mysql集群

2022-3-11 Mr Chang 面试题

1. 什么是主从(Master-Slave)
  • 主从之间是通过mysql的replication来保证数据的一致性,相对mysql   ckuster的数据同步方式来讲是异步的。
  • Replication:主节点要开启binlog,设置一个唯一的服务id;从节点设置服务器,binlog记录了master上的所有操作,会被复制到从节点的relaylog并在从节点上回放。
2. 什么是集群(cluster)
  • Mysql集群是一个无共享的(shared-nothing)、分布式节点架构的储存方案,其目的是提供容错性和高性能。
  • 通过多个MYSQL服务器分配负载,从而最大程序地达到高性能,通过在不同位置存储数据保证高可用性和冗余。
  • Mysql 集群中有三种节点:管理节点、数据节点和SQL节点。集群中的某个节计算机可能使某一种节点,也可能是两种或三种节点的集合。这三种节点知识在逻辑上的划分,所以它们不一定和物理计算机是一一对应的关系。
3.如何使用集群?
  • 主从复制类型  (1)基于语句的复制(statement) (2)基于行的复制(row)(3)混合类型的复制(mixed)
  • keepalived+双主 

评论(0) 浏览(800)

Smarty 模板引擎

2022-3-11 Mr Chang 面试题

1.什么是Smarty?
   Smarty是一个使用PHP写出来的模板引擎,是业界最著名的PHP模板引擎之一。Smarty分离了逻辑代码和外在的内容,提供一种易于管理和使用的方法,用来将原本与HTML代码 混杂在一起PHP代码逻辑分离,Smarty工作的目的是要使PHP程序员同前端人员分离,使程序员改变程序的逻辑内容不会影响到前端人员的页面设计,前端人员重新修改页面不会影响到程序的程序逻辑,这在多人合作的项目中尤为重要。

2 smarty主要优点:

  • 速度:采用smarty编写的程序可以获得最大速度的提高,这一点是相对于其他的模板引擎技术而言的。
  • 编译型:采用Smarty编写的程序在运行时要编译成一个非模板技术的的PHP文件,这个文件采用了PHP与HTML混合的方式,在下一次访问模板时将web请求直接转换到这个文件中,而不再继续模板重新编译
  • 缓存技术:smarty 选用的一种缓存技术,它可以将用户最终看到的HTML文件缓存成一个静态的HTML页面。当设定smarty的cache属性为true时,在smarty设定的cachetime期内将用户的web请求直接转换到这个静态的HTML文件中来,这相当于调用一个静态的HTMl文件。
  • 插件技术:Smarty 可以自定义插件,插件实际就是一些自定义的函数。
  • 模板中可以使用 if /else /elseif /endif 在模板文使用判断语句可以非常方便的对模板进行格式重排。
3 不适合使用smarty的地方:
      需要实时更新的内容,例如像股票显示,它需要经常对数据进行更新,这类型的程序使用smarty会使模板处理速度变慢。小项目因为项目简单而美工与程序员兼与一人的项目,使用smarty会在一定程度上丧失PHP开发迅速的优点。

评论(0) 浏览(880)

二叉查找树-》平衡二叉树-》BTree-》B+Tree

2022-3-10 Mr Chang 面试题

B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因为B+树是从最早的平衡二叉树演化而来的。在讲B+树之前必须先了解二叉查找树、平衡二叉树(AVLTree)和平衡多路查找树(B-Tree),B+树即由这些树逐步优化而来。

1. 
二叉查找树 
   二叉树具有以下性质:左子树的键值小于根的键值,右子树的键值大于跟的键值:
   如下图所示就是一课二叉查找树
   微信图片_20220310152438.png
对该二叉树的节点进行查找发现深度为1的节点的查找次数为1,深度为2的查找次数为2,深度为n的节点的查找次数为n,因此其平均查找次数为 (1+2+2+3+3+3) / 6 = 2.3次
微信图片_20220310152702.png

但是这棵二叉树的查询效率就低了。因此若想二叉树的查询效率尽可能高,需要这棵二叉树是平衡的,从而引出新的定义----平衡二叉树,或称AVL树。

2.平衡二叉树(AVL Tree)
平衡二叉树(AVL树)在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。下面的两张图片,左边是AVL树,它的任何节点的两个子树的高度差<=1;右边的不是AVL树,其根节点的左子树高度为3,而右子树高度为1;

平衡二叉树的失去平衡的姿态有四种:LL(左左)、RR(右右)、LR(左右)、RL(右左)。
其中左左和右右需要旋转一次 而左右和右左需要旋转两次

3.平衡多路查找树(B-Tree)
B-Tree 是为磁盘等外存储设备设计的一种平衡查找树。

B-Tree结构的数据可以让系统高效的找到数据所在的磁盘块。为了描述B-Tree,首先定义一条记录为一个二元组[key, data] ,key为记录的键值,对应表中的主键值,data为一行记录中除主键外的数据。对于不同的记录,key值互不相同。

一棵m阶的B-Tree有如下特性: 
1. 每个节点最多有m个孩子。 
2. 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。 
3. 若根节点不是叶子节点,则至少有2个孩子 
4. 所有叶子节点都在同一层,且不包含其它关键字信息 
5. 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn) 
6. 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1 
7. ki(i=1,…n)为关键字,且关键字升序排序。 
8. Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)

B-Tree中的每个节点根据实际情况可以包含大量的关键字信息和分支,如下图所示为一个3阶的B-Tree: 

微信图片_20220310153607.png


每个节点占用一个盘块的磁盘空间,一个节点上有两个升序排序的关键字和三个指向子树根节点的指针,指针存储的是子节点所在磁盘块的地址。两个关键词划分成的三个范围域对应三个指针指向的子树的数据的范围域。以根节点为例,关键字为17和35,P1指针指向的子树的数据范围为小于17,P2指针指向的子树的数据范围为17~35,P3指针指向的子树的数据范围为大于35。

模拟查找关键字29的过程:

  1. 根据根节点找到磁盘块1,读入内存。【磁盘I/O操作第1次】
  2. 比较关键字29在区间(17,35),找到磁盘块1的指针P2。
  3. 根据P2指针找到磁盘块3,读入内存。【磁盘I/O操作第2次】
  4. 比较关键字29在区间(26,30),找到磁盘块3的指针P2。
  5. 根据P2指针找到磁盘块8,读入内存。【磁盘I/O操作第3次】
  6. 在磁盘块8中的关键字列表中找到关键字29。
4 B+tree

B+Tree是在B-Tree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构。

从上一节中的B-Tree结构图中可以看到每个节点中不仅包含数据的key值,还有data值。而每一个页的存储空间是有限的,如果data数据较大时将会导致每个节点(即一个页)能存储的key的数量很小,当存储的数据量很大时同样会导致B-Tree的深度较大,增大查询时的磁盘I/O次数,进而影响查询效率。在B+Tree中,所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上,而非叶子节点上只存储key值信息,这样可以大大加大每个节点存储的key值数量,降低B+Tree的高度。

B+Tree相对于B-Tree有几点不同:

  1. 非叶子节点只存储键值信息。
  2. 所有叶子节点之间都有一个链指针。
  3. 数据记录都存放在叶子节点中。

将上一节中的B-Tree优化,由于B+Tree的非叶子节点只存储键值信息,假设每个磁盘块能存储4个键值及指针信息,则变成B+Tree后其结构如下图所示:

微信图片_20220310153607.png 




评论(0) 浏览(815)

Redis分布式锁+事务

2022-3-10 Mr Chang 面试题

  1. 特性
  • 互斥性:同一时刻只能有一个线程持有锁
  • 可重入性:同一节点上的同一个线程如果获取了锁之后能够再次获取锁
  • 锁超时:和J.U.C中的锁一样支持锁超时,防止死锁
  • 高性能和高可用:枷锁和解锁需要高效,同时也需要保证高可用,防止分布式锁失效
  • 具备阻塞和非阻塞性:能够及时从阻塞状态中被唤醒
      2. 使用 set key value [EX seconds][PX milliseconds][NX|XX]
          get key 获取锁  del key 删除锁

      3. Redis 事务
      事务的几个基础命令
      multi------ 标记一个事务的开始
      exec-------标记一个事务块内命令的执行
      discard-----取消事务块内的所有命令
      watch----监听(1个或多个)key,如果在事务执行之前这个(或多个)key被其他命令所改动,那么事务将被打断
      unwatch----取watch命令对所有keys 的监听
      提交/放弃事务之后,会自动unwatch,无需手动unwatch
      Redis不支持事务回滚机制,某个命令出现了错误,不会影响前后的命令执行


       

评论(0) 浏览(883)

浏览器返回状态码汇总

2022-3-10 Mr Chang 面试题

100 Continue

客户端应当继续发送请求,这个响应是来通知客户端它的部分请求已经被服务器接收,且未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应,服务器必须在请求完成后向客户端发送一个最终响应。

101 Switching Protocols

服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用不同的协议来完成这个请求。
在发送完这个响应最后的空行后,服务器将会切换到Upgrade消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源。

102 Processing

由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。

200 OK

请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。

201 Created

请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 '202 Accepted'。

202 Accepted

服务器已经接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。

203 Non-Authoritative Information

服务器已经成功的处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝,当前的信息可能是原始版本的子集或者超集。

204 No Content

服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。

205  Reset Content

服务器成功处理请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。

206 Partial Content

服务器已经成功处理了部分Get请求。类似于FlashGet 或者迅雷这类的HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载

207 Multi-Status

由WebDAV(RFC 2518)扩展的状态码,代表之后的消息体将是一个XML消息,并且可能依照之前子请求数量的不同,包含一系列独立的响应代码。

300 Multiple Choices

被请求的资源有一系列可供选择的回馈信息,每个都有自己特定的地址和浏览器驱动的商议信息。用户或浏览器能够自行选择一个首选的地址进行重定向。

301 Moved Permanently

被请求的资源已被永久的移动到新的位置,并且将来任何对此资源的引用都应该使用本响应返回的若干个URI之一。如果可能,拥有链接编辑功能的客户端应当自动把请求的地址修改为从服务器反馈回来的地址。除非额外指定,否则这个响应也是可缓存的。对于某些使用HTTP/1.0协议的浏览器,当它们发送的POST请求得到了一个301响应的话,接下来的重定向请求将会变成get方式。

302 Move temporarily

请求的资源临时从不同的URI响应请求,由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求,只有在Cache-Control 或 Expires 中进行了指定的情况下,这个响应才是可缓存的。

303 See Other

对应当前请求的响应可以在另一个URL上被找到,而且客户端应当采用GET的方式访问那个资源。这个方法的存在主要是为了允许由脚本激活的POST请求输出重定向到一个新的资源。这个新的URI不是原始资源的替代引用。

304 Not Modified

如果客户端发送一个带条件的GET请求且该请求已被允许,而文档的内容并没有改变,则服务器应当返回这个状态码,304响应禁止包含消息体,因此始终以消息头后的第一个空行结尾。

305 Use Proxy

被请求的资源必须通过直顶的代理才能被访问。Location中将给出指定的代理所在的URI信息,接收者需要重复发送一个单独的请求,通过这个代理才能范文响应资源。只有原始服务器才能建立305响应。

306 Switch Proxy

在最新版的规范中,306状态码已经不再被使用。

307 Temporary Redirect
请求的资源临时从不同的URI 响应请求。



400 Bad Request

语义有误,当前请求无法被服务器理解。除非进行修改,否则客户端不应该重复提交这个请求。
请求参数有误

401 Unauthorized

当前请求需要用户验证。该相应必须包含一个适用于被请求资源的 WWW-Authenticate 信息头用以询问用户信息。

402 Payment Required

该状态码表面意思是需要付费的,需要程序员自己实现这个状态码。

403 Forbidden

服务器已经理解请求,但是拒绝执行它。与401响应不同的是,身份验证并不能提供任何帮助,而且这个请求也不应该被重复提交。

404 Not Found
请求失败,请求锁希望得到的资源未被在服务器上发现。没有信息能够告诉用户这个状况到底是暂时的还是永久的。

405 Method Not Allowed

请求行中指定的请求方法不能被用于请求相应的资源

406 Not Acceptable

请求的资源的内容特性无法满足请求头中的条件,因而无法生成响应实体。

407 Proxy Authentication Required

与401 响应类似,但是客户端必须在代理服务器上进行身份验证。

408 Request Timeout

请求超时,客户端没有在服务器预备等待的时间内完成一个发送的请求。客户端可以随时再次提交这一请求而无需进行任何更改。

409 Conflict

由于和被请求的资源的当前状态之间存在冲突,请求无法完成,这个代码只允许用在这样的情况下才能被使用:用户被认为能够解决冲突。并且会重新提交新的需求。

410 Gone

被请求的资源在服务器上已经不再可用,而且没有任何已知的转发地址。

411 Length Required

服务器拒绝没有定义 Content-Length 头的情况下接收请求。

412 Precondition Failed

服务器在验证在请求的头字段中给出先决条件时,没能满足其中的一个或多个。这个状态码允许客户端在获取资源时在请求的元信息中设置先决条件。

413 Request Entity Too Large

服务器拒绝处理当前请求,因为该请求提交的实体数据大小超过了服务器愿意或者能够处理的范围

414 Request-URI Too Long

请求的URI 长度超过了服务器能够解释的长度,因此服务器拒绝对该请求提供服务。这比较少见,通常的情况包括:
本应使用POST方法的表单提交变成了GET方法,导致查询字符串(Query String)过长。

415 Unsupported Media Type

对于当前请求的方法和锁请求的资源,请求中提交的实体并不是服务器中所支持的格式,因此请求被拒绝。

416 Requested Range Not Satisfiable

如果请求中包含了 Range 请求头,并且 Range 中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义 If-Range 请求头,那么服务器就应当返回416状态码。
   
417 Expectation Failed

从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。

421 too many connections

从当前客户端所在的IP地址到服务器的连接数超过了服务器许可的最大范围。通常,这里的IP地址指的是从服务器上看到的客户端地址(比如用户的网关或者代理服务器地址)。

422 Unprocessable Entity

请求格式正确,但是由于含有语义错误,无法响应。

423 Locked

当前资源被锁定。

424 Failed Dependency

由于之前的某个请求发生错误,导致当前请求失败。

425 Unordered Collection

在WebDav Advanced Collections 草案中定义,但是未出现在《WebDAV 顺序集协议》(RFC 3658)中。

426 Upgrade Required

客户端应当切换到TLS/1.0。(RFC 2817)

449 Retry With

由微软扩展,代表请求应当在执行完适当的操作后进行重试。

451 Unavailable For Legal Reasons

该请求因法律原因不可用。

500 Internal Server Error

服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理,一般来说,这个问题都会在服务端的源代码出现错误时出现

501 Not Implemented

服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。

502 Bad Gateway

作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的请求。


503 Service Unavailable

由于临时的服务器维护或者过载,服务器当前无法处理请求,这个状态是临时的,并且将在一段时间以后恢复。

504 Gateway Timeout

作为网关代理工作的服务器执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。
注意:某些代理服务器在DNS查询超时时会返回400或者500错误

505 HTTP Version Not SUpported

服务器不支持,或者拒绝支持在请求中使用的HTTP版本,这暗示这服务器不能或不愿意使用与客户端相同的版本。响应中应当包含一个描述了为何版本不被支持以及服务器支持哪些协议的实体。

506 Variant Also Negotiates

代表服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用自己,因此在一个协商处理中不是一个合适的重点。

507 Insufficient Storage

服务器无法存储完成请求所必须的内容这个状况被认为是临时的。

509 Bandwidth Limit Exceeded

服务器达到宽带限制,这不是一个官方的状态码,但是仍被广泛使用。

510 Not Extended

获取资源所需要的策略并没有被满足。

600 Unparseable Response Headers

源站没有返回响应头部,只返回实体内容。

评论(0) 浏览(916)