秋招面经记录

MySQL

9.Mysql中有1000万条数据,每次查询10条,该如何优化(答:Limit子查询优化)
在这里插入图片描述
在这里插入图片描述
10.有了解过mysql索引吗
11.项目中使用到索引的情况(答:覆盖索引,避免回表)
12.B+树和b树区别

  1. 内连接和外连接区别

  2. Innodb 和myisam区别

  3. explain命令查询出的字段
    6.B+树结点区别
    7.数据库中有某个二级索引name,有若干行数据为null,现在使用name is null统计null的行数,是否会走索引。

    例如:select * from table where name is null
    非聚簇索引是通过B+树的方式进行存储的,null值作为最小数看待,全部放在树的最左边,形成链表,
    如果获取is null的数据,可以从最左开始 直到找到记录不是null结束。
    决定is null或者is not null走不走索引取决于执行成本,是否走索引取决于优化器。
    通过非聚簇索引查询需要回表才能获得记录数据(覆盖索引除外),那么在这过程中优化器发现回表次数太多,
    执行成本已经超过全表扫描.例如:几乎所有数据都命中,都需要回表.这个时候,优化器会放弃索引,走效率更高全表扫描

Redis

  1. Redis中bitmap的原理,如何做签到统计

     Bitmap,即位图,是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素。BitMap通过最小的单位bit来进行0|1的设置,
     表示某个元素的值或者状态,时间复杂度为O(1)。Bitmap 本身是用 String 类型作为底层数据结构实现的一种统计二值状态的数据类型。
     String 类型是会保存为二进制的字节数组,所以,Redis 就把字节数组的每个 bit 位利用起来,用来表示一个元素的二值状态,
     你可以把 Bitmap 看作是一个 bit 数组。由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,
     特别适合一些数据量大且使用二值统计的场景。
    
  2. redis持久化方式,区别

  3. redis的使用场景

  4. 为什么使用redis作为缓存
    秋招面经记录_第1张图片

  5. Redis高性能高并发的原因

     (1)基于内存的存储:Redis将数据存储在内存中,相对于磁盘存储来说,内存访问速度更快。这使得Redis能够快速读取和写入数据,
     	从而实现高性能。
     (2)单线程模型:Redis采用了单线程模型,即每个Redis实例都由一个主线程来处理所有请求。虽然看起来似乎不会支持高并发,但实际上,
     	这种单线程模型通过异步非阻塞的方式处理多个客户端请求,从而避免了线程切换的开销。这使得Redis能够有效地处理大量并发请求。
     (3)事件驱动:Redis使用事件驱动的方式来处理客户端请求,它依赖于事件循环(event loop)来监听和处理事件。
     	这种事件驱动的机制允许Redis在一个线程中高效地处理多个客户端连接,而无需创建大量线程,从而减少了线程管理的开销。
     (4)非阻塞IO操作:Redis使用非阻塞IO操作,这意味着它可以在等待IO完成的同时继续处理其他请求,而不会被阻塞。
     	这对于高并发场景非常重要,因为它允许Redis在处理多个客户端请求时保持高响应性。
     (5)高效的数据结构:Redis内置了许多高效的数据结构,如哈希表、跳跃表和位图,
     	这些数据结构在不同场景下提供了高性能的数据操作。
     (6)持久性选项:尽管Redis主要是一个内存数据库,但它提供了多种持久性选项,可以将数据定期保存到磁盘上。
     	这可以确保即使在服务器重启时,数据也不会丢失,同时不会牺牲太多性能。
     (7)集群和复制:Redis支持主从复制和集群模式,这可以通过多个Redis实例来提高性能和可用性。
     	主从复制可以将负载分散到多个节点上,而集群模式可以水平扩展以应对更多的并发请求。
     (8)优化的网络协议:Redis使用自己的高效二进制协议,该协议具有较低的开销,可以在网络上传输更少的数据,从而提高了网络性能。
    
  6. IO多路复用
    秋招面经记录_第2张图片
    秋招面经记录_第3张图片
    IO多路复用-select方式:
    秋招面经记录_第4张图片
    内核数据准备好或者超时后会将数据拷贝到用户空间,然后用户空间遍历fd_set,找到就绪的fd,读取其中的数据
    秋招面经记录_第5张图片
    IO多路复用-poll方式:

秋招面经记录_第6张图片
IO多路复用-epoll方式:
秋招面经记录_第7张图片
秋招面经记录_第8张图片
秋招面经记录_第9张图片
信号趋动IO
秋招面经记录_第10张图片

  1. Redis中的IO(网络模型IO多路复用)
    前提:
    秋招面经记录_第11张图片
    秋招面经记录_第12张图片
    秋招面经记录_第13张图片
    以一个基于epoll的web服务为例理解redis中网络模型对应的api

秋招面经记录_第14张图片

秋招面经记录_第15张图片

  1. redis mysql区别(从处理业务的角度回答

秋招面经记录_第16张图片
11. Redis setnx分布式锁

(1)获取锁:
	key:自定义前缀+参数name,name为模块名+用户ID,可以实现对同一用户加锁
	value: UUID+当前线程ID
	设置过期时间
(2)释放锁:
	lua脚本:根据value判断是否是自己的锁,然后del key删除锁
(3)自动续期:
	在获取到锁的同时,启动一个定时任务或者后台线程,定时使用 Lua 脚本更新锁的过期时间。
	Lua 脚本可以通过比较当前锁的值是否与之前设置的唯一标识符相同来确保只有持有锁的客户端可以进行续期操作。
	续期时间应该小于锁的过期时间,以确保在客户端因故障或其他原因导致无法续期时,锁能够最终过期释放。
(4)注意
	锁的过期时间需要根据业务操作的预估时间和系统负载来设置,避免锁的过期时间过短或过长。
	续期操作需要保证原子性,可以使用 Lua 脚本将获取锁和续期操作原子化执行。
	锁的持有时间应该有一个上限,避免因为某个客户端发生故障而导致锁无法被释放。
	客户端在获取锁前,可以设定一个尝试获取锁的超时时间,避免长时间的等待。
  1. 守护线程可以续期(如何实现),当过期时间为10,守护线程在9时进行续期,但是如果此时发生gc,出现stw,此时续期会失败。该如何解决。
    秋招面经记录_第17张图片

  2. Redission原理
    https://blog.csdn.net/qq_36010886/article/details/131966273

项目

1.实习遇到的问题
2.两个项目上线了吗,单独完成还是合作
3.项目redis各种数据结构使用场景
1.项目中三方库替换后,如果后续又超期再次替换是否还会很麻烦:
不会:本次替换已经将所有涉及api封装到工具类,下次直接修改该脚本
2.项目中用到了es,了解的底层原理吗
只了解倒排索引
1. 介绍一下实习项目,以及负责的excel上传下载接口的逻辑
2. 你们项目中如果程序出错了怎么处理的
用户导致的:抛出错误提示。
系统内部:回滚
1.项目中的工作量(安全连线、三方库替换)
2.三方库替换将设计函数封装为utils,java中那些场景需要封装工具类
3.例如:string相关的操作需要封装工具类吗
4.封装工具类仅仅是为了维护和修改方便吗,有其他原因吗
5.项目遇到的困难
6.Python、Java的掌握程度、学习时间及方式

分布式及场景

3. 异步业务:类似于购物下单,异步处理如果失败了怎么办
重试+死信队列(你这个思路业务太复杂,不好实现)
(1)业务逻辑有问题
(2)依赖的第三方服务有问题:例如mysql宕机了
秋招面经记录_第18张图片

4. 访问量过高,系统如何设计(高可用)
高可用设计
集群、限流(令牌桶)、熔断、降级、超时重试、异步调用
秋招面经记录_第19张图片
秋招面经记录_第20张图片
12.分布式事务场景:向mysql和mq写入数据
13.1000万条数据,找出出现次数最多的前100条数据(内存有限)

外部排序内次取10万条放入内存,找出前100条数据,然后归并
特殊场景:某个数据并不是在前100,但是由于其分散不均匀,导致其在某块中位于前100,这种情况该如何解决。

5. 0-68包含2,或7数字的个数

	有规律,可以写出递推公式吗?(听她讲了好久还是没明白)
	假设范围内的最大数字有n位,则从最高位开始计算,f(n)表示第n位为2,7的数字个数。
	则f(n) = x * 10 ^(n-1),其中x是判断第n位的数可以取2,7的数字个数。
	所以解答的核心是如何确定x:
	(1)针对于最高位,要防止越上界,最高位为6,只能包含2,所以x=1
	(2)针对于最低为,要防止越上界,最低为为8,可以包含2,7,所以x=2
	(3)针对于中间位,x值为题目要求包含的数字个数。Eg:2,7都可以,所以为2
	以6为例,只包含2所以x=1。最高位和最低位的x要分开处理,中间位置的x取值均为2(要求包含数字的个数)
	以0-68为例, n = 2;
	F(2) = 1 * 10^1
	F(1)= 2 * 10^0
	最终将f(0) + ... + f(n)求和即可。
	以0-100为例,求包含2或7数字的个数
	F(3) = 0 * 10 ^2
	F(2) = 2 * 10 ^ 1
	F(3) = 0 * 10 ^ 0
	最终结果为20个数字即(2,12,...92和20,21,...29)

6. 20个服务节点,结点有输入输出均为list,某个节点的输出list中的某个值可能是其他节点的输入,如何能快速执行完20个结点。
拓扑图。如何构建拓扑图是一个问题
面试官:可以用空间换时间,一直在问空时复杂度

14.MQ的设计模式

(1)发布-订阅模式(Publish-Subscribe Pattern):
	描述:发布-订阅模式允许一个消息发布者将消息发送到多个订阅者,而不需要订阅者知道消息来自哪个发布者。
	用例:用于实现广播消息,例如新闻订阅、实时通知等。
	实现:通常通过主题(Topic)或交换机(Exchange)来实现,发布者将消息发布到特定主题,
	订阅者订阅感兴趣的主题。
(2)点对点模式(Point-to-Point Pattern):
	描述:点对点模式中,消息从一个发送者传递到一个接收者,每个消息只能被一个接收者消费。
	用例:用于实现任务队列,例如工作排队、负载均衡等。
	实现:通常通过队列(Queue)来实现,消息被发送到队列,接收者从队列中获取消息。
(3)请求-响应模式(Request-Reply Pattern):
	描述:请求-响应模式允许客户端发送请求消息并等待服务器响应消息,通常用于同步通信。
	用例:用于RPC(远程过程调用)或需要精确响应时间的场景。
	实现:客户端发送请求消息到队列或主题,服务器接收请求并发送响应消息。
(4)消息过滤模式(Message Filter Pattern):
	描述:消息过滤模式允许订阅者根据特定条件过滤消息,只接收满足条件的消息。
	用例:用于筛选感兴趣的消息,减少不必要的消息传递。
	实现:订阅者可以定义消息过滤条件,MQ将消息传递给满足条件的订阅者。
(5)消息重试模式(Message Retry Pattern):
	描述:消息重试模式允许在消息传递失败时进行重试,以确保消息被成功处理。
	用例:用于处理失败恢复或消息可靠性要求高的场景。
	实现:通常通过设定重试策略、延迟重试或死信队列来实现。
(6)消息确认模式(Message Acknowledgment Pattern):
	描述:消息确认模式允许消费者发送确认消息,告知MQ消息已经被成功处理。
	用例:用于确保消息不会被重复处理。
	实现:通常有手动确认和自动确认两种方式,消费者发送确认消息以确认消息处理完成。

15.Mq的使用场景
16.下单的完整流程(包含付款,判断库存、异步等操作的前后顺序)

(1)下单请求:
	客户端发起下单请求,将订单信息发送到服务器。
(2)库存检查:
	服务器接收到下单请求后,首先进行库存检查,确保所需商品的库存足够。
	并把用户欲购买的商品锁定,设定一个锁定时间,锁定时间内没有付款则释放库存。
	如果库存不足,服务器发送一条库存不足的通知给客户端,客户端可以选择修改订单或者取消订单。
(3)付款处理:
	如果库存检查通过,服务器将订单信息发送给付款系统进行付款处理。这可以是同步或异步的过程,具体取决于付款系统的设计和性能要求。
	付款系统处理付款请求,返回付款结果。
(4)订单创建:
	服务器接收到付款结果后,将订单信息保存到数据库中,创建订单。
	订单创建成功后,服务器生成订单号等相关信息。
(5)异步处理其他操作:
	除了上述基本流程,可能还有其他后续操作,如发货、通知物流、发送发票等。这些操作通常是异步的,可以通过消息队列来处理。
	服务器将这些操作封装成消息,发送到相应的消息队列,等待后续处理。
(6)后续处理:
	后续处理可以由独立的服务或者工作者来完成。这些工作者从消息队列中接收消息,执行相应的操作。
	例如,发货工作者会从消息队列中接收到需要发货的订单信息,然后进行发货操作。
	这些后续操作可以并行执行,提高了系统的性能和可伸缩性。
(7)通知客户端:
	在完成后续操作后,服务器可以发送通知给客户端,告知订单的状态更新,如发货通知、物流跟踪信息等。

10.大数据了解吗?Eg:分库分表
11.分布式事务实现方式

框架

13.Spring 和springboot区别,springboot特点
14.ioc aop
3.循环依赖问题
14.Mvc原理

java

15.Java对象和spring bean的区别
16.Java创建对象的流程
17.有遇到过内存溢出的情况吗:栈溢出、堆溢出。
18.堆溢出的原因,什么时候进行gc
19.Arraylist get put
1. Java和python的区别
2. Java代码一次编译,可以随时运行的原理
3. Int和Integer的区别

(1)数据类型:
	int 是一种基本数据类型(primitive data type)
	Integer 是一个类,通常被称为包装类(wrapper class)。
(2)可空性:
	int 是一个原始数据类型,不能表示为 null,即它不具备可空性。如果不初始化,它将有一个默认值,如 0。
	Integer 是一个对象,可以具备可空性。它可以被设置为 null,表示没有值。
(3)自动装箱和拆箱:
	在Java等支持自动装箱和拆箱的语言中,可以将 int 自动转换为 Integer 和反之,
	这种过程称为自动装箱(autoboxing)和自动拆箱(unboxing)。
(4)可空性、泛型、集合等都需要Integer

4. Arraylist和linkedlist区别
5. 线程池设计
秋招面经记录_第21张图片
根据题目要求:1s内可以执行两个任务,所以核心线程数设置为100,最大线程数可以设置为200
4. Hashmap扩容

网络

8.Tcp和udp区别
9.Udp场景
10.聊天框使用那种协议,具体到应用层

(1)WebSocket:WebSocket 是一种全双工通信协议,通常用于实时聊天应用程序。它建立在 TCP 协议之上,允许客户端和服务器之间双向通信,
从而实现实时消息传输。WebSocket 在现代Web应用中广泛使用,因为它提供了低延迟和高效的实时通信。
(2)HTTP(Hypertext Transfer Protocol):虽然 HTTP 主要用于 Web 页面的请求和响应,但也可以用于长轮询(long polling)
和 Server-Sent Events(SSE)等技术来实现实时消息传输。然而,相对于WebSocket,HTTP在实时聊天中的性能和效率通常较低。

13.学习技术的途径

HR

7.职业规划

手撕

20.合并两个有序数组
4.算法题:java实现输出字符串中第一个出现不重复的字符详解
没有通过全部测试用例(答案:队列+map)

18.k个一组反转链表

你可能感兴趣的:(面试)