csworkman

个人博客

SpringBoot-Web开发

2022-3-31 Mr Chang springboot

  1. 创建SpringBoot应用,选中我们需要的模块
  2. SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置

评论(0) 浏览(866)

SpringBoot日志

2022-3-28 Mr Chang springboot

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

评论(0) 浏览(808)

配置文件优先级

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) 浏览(827)

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) 浏览(928)

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

2022-3-15 Mr Chang 面试题

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







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

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

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

评论(0) 浏览(871)

什么是二级缓存?

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) 浏览(884)

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) 浏览(798)

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) 浏览(878)

二叉查找树-》平衡二叉树-》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) 浏览(813)

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) 浏览(881)