首页 > 其他分享 >面试总结

面试总结

时间:2023-04-09 14:44:30浏览次数:28  
标签:总结 事务 索引 spring 查询 面试 数据 主键

1、框架

  1、spring

    1、定义

      spring框架是一个为java应用程序提供一个综合,广泛的基础支持的java平台,帮开发者解决一些基础性问题,使开发者能更专注的进行应用的开发,而且它本身也是按照设计模式精心制造的,可以更方便集合spring框架。

    2、使用spring的好处

      1.轻量:spring是轻量的,基本的版本大约2MB

      2.控制反转(IOC):spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖对象们

      3.面向切面的编程(AOP):spring支持面向切面的编程,并且可以把业务逻辑和系统服务分开

      4.容器:spring包含并管理应用中对象的生命周期和配置

      5.MVC框架:spring 的 web 框架是个精心设计的框架,是 web 框架的一个很好的替代品

      6.事务管理:spring提供了一个持续的事务管理接口,可以扩展到下至本地事务,上至全局事务

      7.异常处理:Spring 提 供 方 便 的 API 把 具 体 技 术 相 关 的 异常 ( 比 如 由 JDBC,Hibernate or JDO 抛 出 的 ) 转 化 为一 致 的 unchecked 异 常 

    3、spring事务使用

      在你需要事务的方法上加上@Transactional注解,那么这个方法就加上了事务,如果遇到异常,整个方法中的数据修改的逻辑都会被回滚,避免造成数据的不一致性。

    4、Spring事务有哪几种事务传播行为?(propagation

      支持当前事务的情况:

      1.REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务(spring默认的)

      2.SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行

      3.MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常(mandatory:强制)

      不支持当前事务的情况:

      4.REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起(暂停)

      5.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,则把当前事务挂起(暂停)

      6.NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常

      其他情况

      7.NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套(NESTED)事务来运行;如果当前没有事务,则该取值等价于REQUIRED

    5、spring有哪些隔离级别(isolation)

      1.DEFAULT:底层数据库存储的默认隔离级别,其他级别对应于JDBC隔离级别,eg:MySQL默认采用的是REPEATABLE_READ隔离级别,Oracle默认采用的是READ_COMMITTED隔离级别

      2.READ_UNCOMMITTED:最低的隔离级别,允许读取尚未提交的数据,可能导致脏读、幻读或不可重复读

      3.READ_COMMITTED:允许读取并发事务以及提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生

      4.REPEATABLE_READ:对同一字段的多次读取结果都是一致的,除非数据是被事务自己修改的,可以阻止脏读和不可重复读,但幻读仍有可能发生

      5.SERIALIZABLE:最高的隔离级别,所有事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读和幻读。但是这将严重影响程序性能,通常也不会用到

 

 

  2、springmvc

  3、springboot

  4、mybatisPlus

  5、springcloud

    1、定义

      首先要明白微服务,它是一种架构风格,是由一个或者多个服务组成。可以由业务拆分成多个服务,每个服务都是独立部署的,也是可以去耦合的。

      spring cloud是关注全局的微服务协调整理治理框架,它把这些拆分的服务整合并管理起来,为各个服务之间提供服务发现,远程调用,断路器,路由,配置管理等集成服务。

2、数据库

  1、mysql

    1、定义

      MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性

    2、说说你对SQL优化的理解

      1.应当尽量避免 select *, 使用指定具体字段的形式,读取越多数据查询越慢还会增加网络传输的负载

      2.当只要一行数据时使用 limit 1,这样数据库引擎会在找到第一条数据停止搜索

      3.为经常用来搜索字段建立索引

      4.尽量不要让字段出现null值,因为null值在存储的时候不仅需要占用额外的空间,而且在查询的时候还有可能使索引失效

      5.查询时避免索引失效

    2、什么情况索引会失效(模型数空运最快)

      1.首先索引要在使用索引作为查询条件才会生效

      2.模糊查询前置%

      3.数据类型不一样

      4.对索引列使用函数计算

      5.使用is not null

      6.最左前缀匹配原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配

      7.组合索引:如果全部字段建立索引,使用or不会失效,但是正常业务不可能所有都建立,所有会失效

    3、MyISAM 和 InnoDB的区别

      1.InnoDB支持事务,MyISAM不支持,InnoDB对于每一条sql都默认封装成事务,自动提交,这样会影响速度,所以可以多条sql语句组成一个事务一起执行

      2.InnoDB支持外键,而MySAM不支持

      3.InnoDB支持表锁和行锁,但是myisam只支持表锁

      4.innodb在5.6版本之后支持全文索引,myisam一直支持

      5.InnoDB最后叶子节点是存放时数据,而MySAM是存放地址,最后在通过地址找到数据

    4、Btree 和 Hash 索引的区别

      1.Hash索引只能用等值查询,不能用范围查询,等值查询速度比Btree高;Btree既可以使用等值查询,也可以使用范围查询

    5、四大特性

      1.原子性:一个事务,要么全部执行,要么不全不执行

      2.一致性:一个事务的更新和提交后数据的一致性(例:A向B转账,不可能A扣了钱,B没收到)

      3.隔离性:多个事务之间互相不影响

      4.持久性:一个事务的提交是永久性的,就算服务器重启了,也不影响

    6、隔离级别

      1.读未提交(Read uncommitted):读取到还没提交的数据

      2.读提交(Read committed):同一个事务内,多次读取不一样的数据

      3.可重复读(Repeatable read):同一个事务内,不会读到其他事务对已有的数据的修改

      4.串行化(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

        1.脏读:一个事务读到另外一个事务还没有提交的数据

        2.不可重复读:不可重复读是指一个事务先后读取同一条记录,但两次读取的数据不同

        3.幻读:在一个事务的两次查询中数据笔数不一致(不可重复读和幻读的区别:一个是针对单条记录,侧重于修改,幻读则是针对查询总记录,侧重于新增和删除)

        

 

 

    7、为什么mysql要使用B+Tree,而不是其他的

      1、hash索引格式缺点

        1.需要把所有数据加载到内存,比较浪费内存(可以看下扰动函数)

        2.如果所有的查询时等值查询,那hash确实比较快,但是实际开发中的范围查询更多,所有hash就不太合适了

      2、二叉树或红黑树

        1.无论是二叉树还是红黑树都会因为数的深度而造成 io 的读写次数,从而影响读取效率

      3、B+树

        1.多叉树

        2.节点有序

        3.每一个节点可以存放多条记录

        局部性原理:数据和程序都有聚集成群的倾向,分为空间局部性和时间局部行

        磁盘预读:内存跟磁盘交互的时候要保证每次读取是一个逻辑单位,而这个逻辑单位叫做页,也叫datapage,一般都是4k或者8k,在进行读取的时一般都是4k的整数倍,而 innodb 每次读取默认是16k的数据

    8、使用索引的出现的情况

      1.回表 :通过查询的id,再去查找整行数据(例:select * )

      2.索引覆盖:直接通过 id 查找数据(例:select id)

      3.最左原则:聚合索引必须从最左开始

      4.索引下推(mysql5.6后):查找一个有聚合索引的 (name,age),原本是直接从磁盘拿出所有的有 name 的,然后在内存中筛选有 age的,索引下推则是在磁盘中直接 拿到 name, 然后在根据 name 筛选出 age,因为数据是聚集存放的,而且整体的io次数减小,还能提升性能

    9、mysql的索引一般有几层?

      一般的情况下,3到4层就足以千万级别的表查询了

    10、创建索引的字段是长了好还是短了好?

      短了好,因为在层数不变的情况下,可以存储更多的数据量

    11、我们在创建表的时候是用代理主键还是自然主键好?

      尽量使用代理主键,自然主键的维护成本比较高

    12、主键设置好之后,要不要自增?

      在满足业务的情况下,可以使用自增,不自增会增加索引的维护成本

    13、在分布式应用场景中,自增id还适用吗?

      雪花算法,snowflack,自定义自增id生成器

    14、聚簇索引和非聚簇索引

      1.聚簇索引:数据跟索引是否是聚集储存的(innodb的主键索引就是聚簇索引,必须要包含一个主键列的:key,如果创建表的时候设置了主键,那么key就是主键,如果没有设置,那么key就是唯一键,如果唯一键也没有,那么就是key就是6字节的rowid)

      2.非聚簇索引:myisam都是非聚簇索引,innodb的二级索引(普通索引,辅助索引)

    15、建立索引的必要条件

      1.对查询频次较高, 且数据量比较大的表, 建立索引

      2.唯一性强的

      3.需要作为其他表外键的字段

      4.排序字段上, 因为排序效率低, 添加索引能提高查询效率

      5.where条件后面可以考虑建立组合索引

 

9、CRC32(循环冗余校验规则)

 

 

  2、redis

    1、定义

      redis是一个key-value类型的内存数据库,数据是在内存中操作的,定期通过异步操作吧数据库数据flush到硬盘上保存

    2、常用数据类型

      1.String(常用的字符串)

      2.Hash(适合存储对象)

      3.List(可以用来做消息队列)

      4.Set(因为它是无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。应用场景:列表功能的自动排重(共同好友),也可用来求交集、并集、差集等)

      5.Sorted Set(有序集合的成员是唯一的,但分数(score)却可以重复。应用场景:排行榜)

    3、线程是否安全

      1.从内部来讲:因为是串行的,所以安全

      2.从外部来讲:可能无法保障,要自己在程序里做处理(可以使用Lua去实现)

    4、常见问题

      1、缓存雪崩

        1、定义

        由于大量热点key同时失效,导致所有的请求直接打到数据库上

        2、解决方案

        1.随机初始化失效时间(这样就不会造成全部同时失效)

        2.不设置失效时间(不太友好)

        3.如果是redis集群,可以把热点key分散在各个节点上

        4.设置定时任务,快过期的时候更新一下

      2、缓存穿透

        1、定义

        通过不存在的key去请求,然后redis上没有,就会打到数据库上

        2、解决方案

        1.不管是否是null值,都缓存到redis上

        2.做筛选过滤,对于不存在的直接return

        3.把那个故意请求的ip拉黑

        4.布隆过滤器

      3、缓存击穿

        1、定义

        缓存热点key忽然失效

        2、解决方案

        1.设置缓存不失效

        2.分布式锁(单体可以使用互斥锁:让只有一个请求抢到锁,去数据库请求数据,其他等待,等后面这个拿到数据缓存到redis上,后面直接到redis去数据)

        

3、消息队列

4、设计模式

5、java基础

  1、集合

  2、多线程

  3、反射

6、JVM

7、项目

 

 

标签:总结,事务,索引,spring,查询,面试,数据,主键
From: https://www.cnblogs.com/ki16/p/17300306.html

相关文章

  • 面试题 17.05. 字母与数字
    题目链接:面试题17.05.字母与数字方法:TwoSum解题思路(1)将字符量化为\(+1\),数字量化为\(-1\),那么当子数组的和\(subSum=0\)时,表示子数组中的字符和数字的数量相等;(2)\(subSum=s[j]-s[i],j>=i,i=1,2,...\),\(s[i]\)表示前\(i\)个元素的和;(3)即找\(s[j]-s[i]=0\),也即......
  • 每日总结2023-04-08
    今天实现了AndroidStudio的高德地图APK定位packagecom.example.math.www_user;importandroidx.annotation.NonNull;importandroidx.appcompat.app.AppCompatActivity;importandroid.Manifest;importandroid.os.Bundle;importandroid.util.Log;importandroid.wid......
  • 每日总结 4.8
    今天进行了蓝桥杯的考试,考完试后进行了androdi的补货功能。代码如下:packagecom.example.jjt;importandroidx.appcompat.app.AppCompatActivity;importandroid.app.VoiceInteractor;importandroid.os.Bundle;importandroid.os.Handler;importandroid.view.View;imp......
  • IP交付标准总结血泪史。
    RTL顶层代码,IP内部需要IP自己完成连接并保证正确,CM/PLL/MCU/SRAM/TX/RX内部模块不接受外部进行拼接,DFT内部自己处理。IP用到的宏,名称功能文档要说明清楚。优先使用硬核IP。软核需要IP保证质量。不能只提供各个模块,需要外部拼接。文档,集成设计文档,用户手册,寄存器手册,接口管脚与......
  • 面试题 05.02. 二进制数转字符串
    题目链接:面试题05.02.二进制数转字符串方法:找规律解题思路(1)题目要求:将一个\(0-1\)之间的实数通过二进制进行表示,并通过字符串形式输出。(2)由于二进制的小数只能表示\(\frac{1}{2}\frac{1}{4}\frac{1}{8}...\frac{1}{2^n}\)数之间的和的十进制小数,因此有些十进制小数不能......
  • 计算机408考研攻略及总结
    复习资料王道单科书数据结构严蔚敏计算机组成原理白中英计算机组成原理唐朔飞计算机网络谢希仁操作系统汤子瀛真题王道真题讲解模拟题王道模拟题五轮复习法第一轮学习王道四门单科书第一轮只需要做选择题一两天搞不懂的内容直接跳过例子:组成原理的二......
  • Linux内核Oops调试方法总结
    前言:内核开发比用户空间开发更难的一个因素就是内核调试艰难。内核错误往往会导致系统宕机,很难保留出错时的现场。调试内核的关键在于你的对内核的深刻理解。1、调试前的准备在调试一个bug之前,我们所要做的准备工作有:有一个被确认的bug。包含这个bug的内核版本号,需要分析出这......
  • #yyds干货盘点# LeetCode面试题:爬楼梯
    1.简述:假设你正在爬楼梯。需要n 阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输入:n=3输出:3解释:有三种方法可以爬到楼顶。1.1阶+1阶+1阶2.1阶......
  • 面试题百日百刷-HBase中HTable API有没有线程安全问题,在程序是单例还是多例?
    锁屏面试题百日百刷,每个工作日坚持更新面试题。请看到最后就能获取你想要的,接下来的是今日的面试题: 1.HBase内部机制是什么?Hbase是一个能适应联机业务的数据库系统物理存储:hbase的持久化数据是将数据存储在HDFS上。存储管理:一个表是划分为很多region的,这些region分布式地......
  • Python 日期和时间用法超强总结
    Python中处理日期和时间的模块Python提供了time和datetime模块,可以帮助我们轻松获取和修改日期和时间,下面让我们来逐一了解一下。time模块该模块包括使用时间执行各种操作所需的所有与时间相关的功能,它还允许我们访问多种用途所需的时钟类型。内置函数:请看下表,它描述了时......