Day16

1. 请你说说索引怎么实现的B+树,为什么选这个数据结构?

  1. 索引本质上就是通过预排序+树形结构来加快检索的效率,而mysql中使用的innodb和Myisam引擎时都是用了b+树实现索引。他是一颗平衡多路查找树,是在二叉查找树基础上的改进数据结构。
  2. 在二叉查找树上查找一个数据时,最坏的情况的查找次数为树的深度,当数据量很大时,查询次数可能还是很大,造成大量的磁盘IO,从而影响查询效率;为了减少磁盘IO的次数,必须降低树的深度,因此在二叉查找树的基础上将树改成了多叉,再加上一些限制条件,就形成了b树;
  3. b+树中的所有叶子结点值的总集就是全部关键字的集合;b+树为所有叶子节点增加了链接,从而实现快速的范围查找;在b+树中,所有记录节点都是按照键值大小顺序存放在同一层的叶子结点上,由各个叶子结点指针进行连接
  4. 在数据库中,b+树的高度一般都在2~4层,这也就是说查找某一键值的行记录时最多只需要2到4次IO。这很不错,因为当前一般的机械磁盘每秒至少可以做100次IO,2~4次的IO意味着查询时间只需0.02~0.04秒。
  5. 在数据库中,b+树的索引还可以分为聚集索引和辅助索引,但不管是聚集索引还是辅助索引,其内部都是b+树的,即高度平衡的,叶子结点存放着所有的数据。聚集索引和辅助索引不同的是,叶子结点是否存放的是一整行的信息。

2. 请你说说乐观锁和悲观锁

  1. 乐观锁:乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。
  2. 乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提高给你的类似于write_condition机制,其实都是提供的乐观锁。
  3. 悲观锁:悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁;传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁,读锁,写锁等,都是在操作之前先上锁
  4. GIT,SVN,CVS等代码版本控制管理器,就是一个乐观锁使用的很好场景
  5. 悲观锁的好处在于可以减少并发,一般在并发量不是很大,并且一旦出现的并发情况导致的异常使得用户和系统都难以接受的情况下,会选择悲观锁进行;但是当系统并发量非常大的时候,由于锁消耗资源、锁定时间过长等原因,很容易导致系统性能下降,资源消耗严重

3. 说说你对Spring Boot的理解,以及它和Spring的区别?

  1. 其实从本质上来说,springboot就是spring,他帮你完成了一些springbean的配置。springboot使用“约定大于配置”的理念让你的项目可以快速运行起来,使用springboot能很快地创建一个能独立运行、准生产级别、基于spring框架的项目。但springboot本身不提供spring的核心功能,而是作为spring的脚手架框架,达到快速构建项目,预设第三方配置,开箱即用的目的。
  2. springboot有许多优点:
    1. 可以快速构建项目,可以对主流开发框架的无配置集成,项目可以独立运行,无需外部依赖servlet容器,提供运行时的应用监控,可以极大地提高开发、部署效率,可以与云计算天然集成。
    2. 自动配置:针对很多spring应用程序常见的应用功能,springboot能自动提供相关配置
    3. 起步依赖:springboot通过起步依赖为项目的依赖管理提供帮助,利用了传递依赖解析,把常用库聚合在一起,组成了几个为特定功能而定制的依赖
    4. 端点监控:springboot可以对正在运行的项目提供监控

4. 说说Spring Boot常用的注解

  1. @SpringBootApplication注解:在springboot入口类中,唯一的一个注解就是@SpringbootApplication。他是Springboot项目的核心注解,用于开启自动配置,准确地说是通过注解内组合的@EnableAutoConfiguration开启了自动配置
  2. @EnableAutoConfiguration注解:主要功能是启动spring应用程序上下文时进行自动配置,他会尝试猜测并配置项目可能需要的Bean。自动配置通常是基于项目classpath中引入的类和已经定义的Bean来实现的。在此过程中,被自动配置的组件来自项目自身和项目依赖的jar包中
  3. @Import注解:@EnableAutoConfiguration的关键功能是通过@Import注解导入的ImportSelector来完成的。从源码得知@Import(AutoConfigurationImportSelector.class)是自动配置功能的核心实现者
  4. @Conditional注解:可以根据是否满足指定的条件来决定是否进行Bean的实例化

5. 说说Spring Boot的启步依赖

  1. springboot将日常企业应用研发中的各种场景都抽取出来,做成一个个的starter(启动器),starter中整合了该场景下各种可能用到的依赖,和用户只需要在Maven中引入starter依赖,springboot就能自动扫描到要加载的信息并启动相应的默认配置。
  2. 有时在引入starter时,我们并不需要指明版本,这是因为starter版本信息是由spring-boot-starter-parent(版本仲裁中心)统一控制
最后修改:2024 年 06 月 08 日
如果觉得我的文章对你有用,请随意赞赏