面试总结
1、说一下SpringCloud的常用组件
Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还
可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台
Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求
Hystrix:发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题
Zuul:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务
2、SpringCloud各组件之间是怎么配合工作的
3、Redis主要在哪用到了
- 在项目中短信验证码存储到Redis缓存中
- 支付时生成的二维码存储到缓存中
4、mongoDB和Redis的区别
内存管理:
Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。
MongoDB 数据会优先存于内存,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。
数据结构:
Redis 支持的数据结构丰富,包括String、Hash、Set、List、Zset等。
MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。
5、SSM和SpringBoot的区别,它们的优点和缺点是什么
SSM使用的时候需要配置大量的配置文件,使用起来非常的繁琐。而SpringBoot使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置,让你无需手动进行配置)的理念让你的项目快速运行起来。使用后用SpringBoot很容易创建一个独立运行(运行jar,内嵌Servlet容器)、准生产级别的基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。
6、ArrayList和LinkedList的区别
7、 你对线程的安全是怎么考虑的
采用synchronized关键字给代码块或方法加锁
8、synchronized和volatile的区别
- volatile 关键字是线程同步的轻量级实现,所以 volatile 性能肯定比synchronized 关键字要好。但是 volatile 关键字只能用于变量而synchronized 关键字可以修饰方法以及代码块。
- 多线程访问 volatile 关键字不会发生阻塞,而 synchronized 关键字可能
会发生阻塞 - volatile 关键字能保证数据的可见性,但不能保证数据的原子性。
synchronized 关键字两者都能保证。
9、 get和post的区别
- GET请求在URL中传送的参数是有长度限制的,而POST没有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET参数通过URL传递,POST放在Request body中。
10、请求头里都包含哪些信息
Accept:浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集。
Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。
Content-Length:表示请求消息正文的长度。
Cookie:设置cookie,这是最重要的请求头信息之一
Host:初始URL中的主机和端口。
Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。
User-Agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关则该值非常有用。
11、我看你在项目中用到了MyBatis和Spring Data Jpa,为什么会同时使用这两个技术,它们有什么区别
Spring Data JPA是Spring 提供的一套JPA接口,使用Spring Data JPA主要完成一些简单的增、删、改、查功能。
对于复杂的查询功能会使用MyBatis编写SQL语言来实现,因为使用Spring Data JPA来做一些复杂的查询是没有
MyBatis方便的,Spring Data JPA是面向的对象,而MyBatis直接面向SQL语句。
12、项目中涉及到金额小数方面的问题,可能会出现什么问题(精度丢失问题),怎么解决这个问题
会出现精度丢失问题
解决方案:
- 对外提供时DTO对象金额类型属性采用String类型,且单位为元
- 数据库以BigDecimal类型存储,不设小数位,且单位为分
- DO对象金额属性采用Long包装类型,便于计算
- 计算时采用分作为单位来进行运算
13、说一下使用Spring的优点
- 方便解耦,简化开发 ;通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。
- AOP编程的支持 , 通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
- 声明事物的支持 , 在Spring中,我们可以从单调烦闷的事务管理代码中解脱出来,通过声明式方式灵活地进行事务的管理,提高开发效率和质量。
- 方便集成各种优秀框架 , Spring不排斥各种优秀的开源框架,相反,Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持
14、为什么使用雪花片算法,而不用自增Id算法
因为使用自增会知道大概的数据量,而雪花片是随机生成的Id,不会知道大概的数据量。
15、SpringBoot是怎么加载配置文件
Spring加载配置文件是通过Listener监听器实现的(观察者模式)
SpringBoot就是通过ConfigFileApplicationListener 这个类来加载配置文件的
当加载配置文件时,程序先会读取配置文件的spring.profiles.active属性,确定加载什么环境的配置文件
16、MySQL去重的关键词用的什么
distinct
17、什么情况下会导致索引失效
-
尽量不要在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索
引而进行全表扫描 -
应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而
进行全表扫描。 -
应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字
段没有索引,将导致引擎放弃使用索引而进行全表扫描 -
使用模糊查询 like,如果是 ‘%aaa’ (%开头)不会使用到索引
18、什么时候会使用索引,使用索引的规范是什么
19、悲观锁和乐观锁的区别
适用场景:
乐观锁:并发写入少,大多数都是读操作。例如Git提交到远程仓库
悲观锁:并发写入多的情况
实现手段:
乐观锁:CAS算法。数据库中加个版本号字段或者使用AtomicInteger类。
悲观锁:使用synchronized和Lock类。
其它:
CAS算法:对于内存中的某一个值V,提供一个旧值A和一个新值B。如果提供的旧值V和A相等就把新值B写入V。这个过程是原子性的,执行结果要么成功要么失败,对于失败的情形采用不断重试(回旋)。或者放弃。
ABA问题:ABA问题是CAS机制中出现的一个问题。如果另一个线程修改V值假设原来是A,先修改成B,再修改回成A。当前线程的CAS操作无法分辨当前V值是否发生过变化。
解决ABA问题方案:除了AtomicStampedReference类,还有一个原子类也可以解决,就是AtomicMarkableReference,它不是维护一个版本号,而是维护一个boolean类型的标记,用法没有AtomicStampedReference灵活。因此也只是在特定的场景下使用。
20、了解分布式事务吗
在分布式系统中一次操作由多个系统协同完成,这种一次事务操作涉及多个系统通过网络协同完成的过程称为分布式事务。这里强调的是多个系统通过网络协同完成一个事务的过程,并不强调多个系统访问了不同的数据库,即使多个系统访问的是同一个数据库也是分布式事务
另外一种分布式事务的表现是,一个应用程序使用了多个数据源连接了不同的数据库,当一次事务需要操作多个数据源,此时也属于分布式事务,当系统作了数据库拆分后会出现此种情况。
21、索引
1.索引是什么?
索引其实是一种数据结构,能够帮助我们快速的检索数据库中的数据
2.索引具体采用的哪种数据结构呢 ?
常见的MySQL主要有两种结构:Hash索引和B+ Tree索引,我们使用的是InnoDB引擎,默认的是B+树
3.数据库的存储引擎有哪些?区别是什么?
常用的3种 ,InnoDB、Myisam、Memory
InnoDB跟Myisam的默认索引是B+tree,Memory的默认索引是hash
区别:
①InnoDB支持事务,支持外键,支持行锁,写入数据时操作快,MySQL5.6版本以上才支持全文索引
②Myisam不支持事务。不支持外键,支持表锁,支持全文索引,读取数据快
③Memory所有的数据都保留在内存中,不需要进行磁盘的IO所以读取的速度很快, 、
但是一旦关机的话表的结构会保留但是数据就会丢失,表支持Hash索引,因此查找速度很快
4.既然你提到InnoDB使用的B+ 树的索引模型,那么你知道为什么采用B+ 树吗?这和Hash索引比较起来有什么优缺点吗?
因为Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。而B+ 树是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描
哈希索引适合等值查询,但是无法进行范围查询
哈希索引没办法利用索引完成排序
哈希索引不支持多列联合索引的最左匹配规则
如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题
22、Dubbo和SpringCloud的区别
1.通讯协议:
Dobbo:dobbo(默认)、RMI、Hessian、HTTP、WebService
SpringCloud:HTTP协议的REST API
2.性能比较:
dubbo支持各种通信协议,而且消费方和服务方使用长链接方式交互,通信速度上略胜Spring Cloud,如果对于系统的响应时间有严格要求,长链接更合适
3.组件对比:
dubbo只有一个注册中心,而SpringCloud有完整的组件规范。
23、Git常用的命令有哪些
-
git push 推送至远程版本库
-
git pull 拉取远程版本库的提交
-
git log 显示提交日志
-
git commit 提交
-
git clone 克隆版本库
-
git config 查询和修改配置
-
git add 添加至暂存区
-
git status 显示工作区文件状态
24、Linux常用的命令有哪些
- ifconfig 查看ip
- ls 列出当前文件夹下文件名称
- ls -a 查看隐藏文件
- ll 列出当前文件夹下文件名称和详细信息
- cd ~ : 切换至当前用户的跟目录
- cd / : 切换至跟目录
- cd … : 切换至上一级
mkdir(make directory)
命令可用来创建子目录- tar –cvf xxx.tar 目录名 (打包)
- tar –zcvf xxx.tar.gz 目录名 (打包并且压缩)
- tar –xvf xxx.tar 解压
- ps –ef 查看所有进程
- kill 2868 杀掉2868编号的进程