整理-浪潮面经

杨大大...大约 10 分钟

自我介绍

面试官,您好。我叫杨路恒,今年24岁,山东济宁人,就读于陕西师范大学,今年研三,软件工程专业,研究方向为知识图谱。大学时间到研究生期间的主要技术栈是Java 。在校期间参与了全国大学生数学建模竞赛和全国大学生英语竞赛,并且在数学建模比赛中担任队长并获得了陕西省一等奖。另外最近一段在联想实习的经历,主要在是对大模型进行开发应用。说到业余爱好的话,一个是比较喜欢通过博客整理分享自己所学知识,现在在CSDN上的访问量达到了44W+。 另一个是喜欢旅游和骑行的方式来放松。这就是我的自我介绍,感谢。

1.mysql主键数值和字符的差别

主键使用数值类型时通常会比使用字符类型更快。这是因为数值类型是直接储存在计算机内存中的,而字符类型需要转换为二进制码储存。在数据量较大时,这一差别会变得尤为明显。

此外,当主键使用数值类型时,排序和索引操作也会变得更加高效。排序时直接比较数值大小即可,而使用字符类型则需要进行字母表排序。索引操作时,数值类型同样是直接进行计算的,而字符类型则需要进行转换。

相反,如果使用字符类型为主键,就需要通过一些优化手段来提高查询效率。例如,在创建主键时添加前缀,这样能够缩小比较范围,从而提高效率。

综上所述,虽然MySQL中主键可以使用数值类型和字符类型,但为了提高数据检索和查询的效率,建议尽量使用数值类型作为主键。

2.实习工作内容,遇到什么技术难点

负责标书趋势分析平台和对话机器人测试平台的开发,都是内部平台。首先是mentor让写了用Java+kafka+线程池做一个爬虫demo,搭个框架出来。然后开始写python,学习数据分析的新技术以及前端技术。

遇到的技术难点就是Kafka如何保证消息的可靠性,然后还有python的生成器如何使用,以及新的前端技术。

3.spring boot平时用什么注解

@RestController:复合注解,@RestController注解= @ResponseBody+@Controller,效果是将方法返回的对象直接在浏览器上展示成json格式。

@RequestMapping():将请求映射到控制器的处理方法上,提供路由信息,负责URLController中的具体函数的映射。

@PostMapping():将post请求映射到特定处理程序的方法注解。

@RequestBody:主要用来接收前端传递给后端的数据。

@GetMapping():将get请求映射到特定处理程序的方法注解。

@PathVariable:获取url中的数据

4.map,set 哪些是有序的

TreeMap是有序的(二叉树),LinkedHashMap是有序的,hashMap用来保证存储的值键值对,list用来保证插入的顺序和存储的顺序一致。

TreeSet是有序的(二叉树),LinkedHashSet是有序的,其中haseSet用来保证数据唯一,List用来保证插入的顺序和存储的顺序一致。

5.你投的是浪潮信息,对这个公司有了解吗(浪潮有很多子公司)

印象中浪潮就是做电脑的,是一家做云计算、大数据的企业,旗下拥有浪潮信息、浪潮软件和浪潮国际三家上市公司。

6.spring中bean的生命周期

  • 1.实例化Bean对象
  • 2.设置Bean属性
  • 3.如果通过各种Aware接口声明了依赖关系,则会注入Bean对容器基础设施层面的依赖。Aware接口集体包括BeanNameAware、BeanFactoryAware和ApplicationContextAware,分别注入Bean ID、BeanFactory和ApplicationContext
  • 4.如果实现了BeanPostProcesser,调用BeanPostProcesser的前置初始化方法postProcessBeforeInitialization
  • 5.如果实现了initializingBean接口,则会调用afterPropertiesSet方法
  • 6.调用Bean自身定义的init方法
  • 7.调用BeanPostProcesser的后置方法postProcessAfterInitializaiton
  • 8.容器关闭前调用DisposableBean的destroy方法和自身的destroy方法

7.spring ioc了解过吗

IOC: 控制反转是一种设计思想,而不是一个具体的技术实现。

8.nginx怎么样做到同一个用户发的请求可以命中同一个服务器

upstream 指令块中增加了 ip_hash 指令。该指令就是告诉 nginx 服务器,同一个 IP 地址客户端发送的请求都将分发到同一个 Tomcat 服务器进行处理。

9.缓存击穿,缓存雪崩,缓存穿透的先后顺序是怎么样的,各自对应的解决策略是什么

缓存雪崩

在使用缓存时,通常会对缓存设置过期时间,一方面目的是保持缓存与数据库数据的一致性,另一方面是减少冷缓存占用过多的内存空间。

但当缓存中大量热点缓存采用了相同的实效时间,就会导致缓存在某一个时刻同时实效,请求全部转发到数据库,从而导致数据库压力骤增,甚至宕机。从而形成一系列的连锁反应,造成系统崩溃等情况,这就是缓存雪崩(Cache Avalanche)。

解决方案是将key的过期时间后面加上一个随机数(比如随机1-5分钟),让key均匀的失效。

缓存击穿

缓存雪崩是指只大量热点key同时失效的情况,如果是单个热点key,在不停的扛着大并发,在这个key失效的瞬间,持续的大并发请求就会击破缓存,直接请求到数据库,好像蛮力击穿一样。这种情况就是缓存击穿(Cache Breakdown)。

从定义上可以看出,缓存击穿和缓存雪崩很类似,只不过是缓存击穿是一个热点key失效,而缓存雪崩是大量热点key失效。因此,可以将缓存击穿看作是缓存雪崩的一个子集。

解决方案:热点数据不设置过期时间。

缓存穿透(cache penetration)是用户访问的数据既不在缓存当中,也不在数据库中。出于容错的考虑,如果从底层数据库查询不到数据,则不写入缓存。这就导致每次请求都会到底层数据库进行查询,缓存也失去了意义。当高并发或有人利用不存在的Key频繁攻击时,数据库的压力骤增,甚至崩溃,这就是缓存穿透问题。

方案:缓存空值(null)或默认值

分析业务请求,如果是正常业务请求时发生缓存穿透现象,可针对相应的业务数据,在数据库查询不存在时,将其缓存为空值(null)或默认值。需要注意的是,针对空值的缓存失效时间不宜过长,一般设置为5分钟之内。当数据库被写入或更新该key的新数据时,缓存必须同时被刷新,避免数据不一致。

10.jvm内存了解过吗,简单说一下

jvm内存。

11.int和Integer对象分别放在jvm哪里

int放在jvm栈,Integer对象放在jvm堆。

12.int 128和Integer128相等吗

相等。

13.mybatis分页方式

img
img

14.redis的主要应用

缓存、分布式锁、消息队列、排行榜

15.数据库中的左连接和右连接

MySQL的左连接和右连接:左连接是先查询出左表(即以左表为主),然后查询右表,右表中满足条件的显示出来,不满足条件的显示NULL。右连接就是先把右表中所有记录都查询出来,然后左表满足条件的显示,不满足显示NULL。

16.索引分类

从索引字段特性分类:

  • 主键索引
  • 唯一索引
  • 普通索引
  • 前缀索引

从索引字段个数分类:

  • 单列索引
  • 联合索引(复合索引)

17.如何解决死锁

破坏四个条件。

18.常见的设计模式(工厂模式的原理)

工厂模式提供了一种将对象的实例化过程封装在工厂类中的方式。通过使用工厂模式,可以将对象的创建与使用代码分离,提供一种统一的接口来创建不同类型的对象。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

19.spring的aop

一般称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。

SpringAop的工作过程:

1.Spring 创建IOC容器 先扫扫描包中的所有由@Service 和@Component修饰的类,并为它们创建对象,放在Spring IOC容器中。 2.寻找切面类 Spring在创建完对象后,开始寻找由 @Aspect 修饰的切面类并获取切面类中的所有方法。 3.寻找切面类的方法中带有表达式的部分 接下来,Spring找到所有由合法表达式修饰的方法 4.查找有相应方法的类 随后,Spring检查它所扫描到的所有类,并将上一步中找到的方法与所有类进行对照,找出有这个(些)方法的类(这个类就是被代理类)。 5.创建动态对象 最后,Spring根据上一步找到的被代理类以及切面类创建动态类的动态对象并放入Spring IOC容器中。

20.注册中心用什么做的,nacos和gateway怎么用的

nacos做,gateway实现鉴权。

21.项目中有做过压测吗,平时会看那些指标

JeMeter。

并发用户数 (The Number Of Concurrent Users):在同一时刻与服务器进行了交互的在线用户数量。

吞吐量 (Total Throughput):单次业务中或一段时间内,客户端与服务器端进行的数据交互总量。

22.==和equals区别

  • “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值
  • equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值

23.多线程共享变量用什么实现

使用volatile、synchronized。

24.JVM双亲委派机制

(1)当加载一个类时,先判断此类是否已经被加载,如果类已经被加载则返回;

(2)如果类没有被加载,则先委托父类加载(父类加载时会判断该类有没有被自己加载过),如果父类加载过则返回;如果没被加载过则继续向上委托;

(3)如果一直委托都无法加载,子类加载器才会尝试自己加载。

打破双亲委派需要重写findClass()方法。

25.HashMap多个key相同会怎么样

在HashMap中,相同key的value会被覆盖,即最后一次put进去的value会成为该key对应的值。

26.MySQL回表、索引失效

指的是在进行索引查询时,首先通过索引定位到对应页,然后再根据行的物理地址找到所需的数据行。换句话说,回表是指根据索引查询到的主键值再去访问主键索引,从而获取完整的数据记录。

查询条件中有or,即使有部分条件带索引也会失效。

like查询是以%开头。

索引列上参与计算会导致索引失效。

违背最左匹配原则。