面试系列-淘天提前批面试

news2024/12/24 17:32:30

00-淘天提前批面试

在牛客上看到了淘天提前批的面试题目,这里分析一下淘天面试的问了有哪些内容,面试的重点 是偏向哪些方面

项目相关

1、秒杀架构如何设计?

问了秒杀的架构如何设计,对于秒杀的设计,秒杀符合 写多读少 的场景,那么针对 写比较多 的场景,可以将 Redis 作为 主存储 来操作,这样并发度比较高,Redis 扣减成功之后,再通过 异步 去 DB 中扣减库存,将耗时操作从主干流程中剥离出去,提升主干流程的响应速度,这是从性能的方面进行设计

不过基于 Redis 进行操作的话,Redis 集群部署时,在极端情况下,如果 Redis Master 上扣减库存之后,宕机,此时数据还没来得及同步到 Slave 节点,此时就会出现 库存超卖 的情况,不过这种情况概率很低,并且如果库存超卖的话,只要在订单系统中有防超卖机制即可

2、项目的 QPS 是多少?

这个问的是有没有对项目接口进行压测,一般部署 Prometheus、Grafana 对机器、应用进行监控,再通过 JMeter 进行压测即可,不过说 QPS 时,要先说明机器使用的配置,一般我们学生在学习时,使用 2C4G 服务器进行压测居多(比较便宜)

3、TPS 和 QPS 的区别是什么?

这个就是应用的 性能指标 ,TPS 是指应用每秒处理的事务数量,QPS 是指应用每秒处理的请求数量,一般情况下 QPS 是要多于 TPS 的,因为一个事务中可能包含多个增删改查

基础能力

try catch

问题 :在 try catch finally 中,如果在 try 中 return 了,还会执行 finally 吗?

会执行的,这里应该问的就是 try catch finally 的 return 执行顺序,如下:

1、try、catch 中没有 return 语句

当try和catch中都没有return语句时, 执行顺序依次为:

try --> 执行发生异常 --> catch --> finally

2、try、catch 中有 return 语句,finally 中没有 return。

先把 try 或 catch 中的 return 值保存在局部变量中,再去执行 finally 中的语句,最后 return 返回

3、try、catch 中有 return 语句,且 finally 中也有 return finally 中的 return 最后会覆盖 try、catch 中的 return 数据

问题2 :在 finally 中一般关闭资源,如果出现异常怎么处理?

打印日志进行记录就好了

如果在 finally 中关闭资源要再 try catch 的话,那代码也太臃肿了,我看了 RocketMQ 相关的源码,在 finally 中没有在 finally 中再进行其他的一些重试操作(如果不对,请指正)

final

问题1 : final 放在类上有什么用?

final 放在类上表明该类 不可以被继承 ,主要是为了保证 类的安全性

如果 final 修饰方法,则该方法也不可以被 重写

扩展

  • private 方法会被隐式指定为 final 方法
  • final 修饰的成员变量使用前要初始化

问题2 :final 修饰 HashMap,可以向这个 Map 中添加元素吗?

可以的

final 修饰变量的话,有两种情况:

  • final 修饰基础类型变量 :则数值在初始化之后,就无法更改
  • final 修饰引用类型变量 :则初始化之后,不可以再指向其他对象,但是可以修改该引用类型变量内部的值

多线程

问题1 :五个线程 abcde 如果想先执行 a,再执行 bcd,bcd 执行完后执行 e 如何做?

可以使用 CompletableFuture 来 做多个任务的编排 ,如下:

public class Main {
    public static void main(String[] args) {
        CompletableFuture<Void> taskA = CompletableFuture.runAsync(() -> {
            System.out.println("Thread a is running.");
        });

        CompletableFuture<Void> taskB = taskA.thenRun(() -> {
            System.out.println("Thread b is running.");
        });

        CompletableFuture<Void> taskC = taskA.thenRun(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("Thread c is running.");
        });

        CompletableFuture<Void> taskD = taskA.thenRun(() -> {
            System.out.println("Thread d is running.");
        });

        CompletableFuture<Void> taskE = CompletableFuture.allOf(taskB, taskC, taskD).thenRun(() -> {
            System.out.println("Thread e is running.");
        });

        taskE.join(); // 等待所有任务执行完成
    }
}

问题2 :用过 CountDownLatch 吗?

CountDownLatch 是 JUC 包下边的工具类,使用场景 为:有多个子任务,此时需要这么多的子任务都执行完毕之后,再去执行主干流程,如果有任何一个任务没有执行完毕都会阻塞等待

如下:

public class Main {
   public static void main(String[] args) throws InterruptedException {

      CountDownLatch countDownLatch = new CountDownLatch(6);

      for (int i = 1; i <= 6; i ++) {
         new Thread(()->{
            System.out.println(Thread.currentThread().getName() + "执行任务");
            countDownLatch.countDown();
         }, String.valueOf(i)).start();
      }

      // 等待子线程执行任务
      countDownLatch.await();

      // 主线程继续向下执行...
   }
}

问题3: Thread.sleep() 有用过吗?会放弃 CPU 锁吗?如果需要让出时间片,该通过什么方式让出?

Thread.sleep() 方法不会让线程放弃 CPU 锁的占用,但是会释放 CPU 时间片

线程还可以通过 Thread.yield() 方法来让出 CPU 时间片,但是可能线程刚刚让出 CPU 时间片,又会重新获取 CPU 时间片继续执行

synchronized

问题1: 你一般会使用 synchronized 锁在方法上吗?如果是锁对象,这个对象如何确定下来呢?

如果是整个方法需要同步的话,那么就可以将 synchronized 放在方法上,synchronized 锁在方法上和锁在对象上的区别就是: 锁的粒度不同

synchronized 锁在对象上,可以让锁的粒度更小,并发度更高

synchronized 锁对象的话,只要保证多个线程去执行 synchronized 并发代码块的时候,可以取到同一个对象即可,也就是保证这个对象是单例的

问题2: synchronized 锁在 this 上可以吗?

可以的,锁定 this 对象就是锁定当前这个实例对象,我们的工程一般都是基于 Spring 的,Spring 中的 Bean 都是单例的,因此通过 synchronized 可以达到同步的效果

HashMap

问题1: HashMap 扩容和树化说一下

HashMap 的 扩容 条件:当 HashMap 中数组的元素个数超过了 当前容量 * 负载因子(默认0.75) 就会触发扩容,会将数组长度扩容为原来的 2 倍

HashMap 的 树化 条件:当数组长度达到 64 并且链表长度超过 8 就会进行树化(如果链表长度超过 8,但是数组长度不到 64,就会对数组扩容 1 次,而不会执行树化)

问题2: 你知道红黑树每次翻转高度差的变化么?

每次翻转之后,要么是左旋要么是右旋,每次旋转之后高度会减 1,来保证稳定

可以在这个网站中自己插入节点看一下红黑树的旋转情况比较直观:cs.usfca.edu

扩展:HashMap 中为什么没有缩容?

因为 HashMap 中 Node 是比较占用空间的,在 remove 时,会将 Node 指针置为 Null,Node 就会被 GC 掉,如果缩容的话,仅仅节省了数组的空间占用,优化并不大

并且缩容操作是要放在 remove 时,那么会导致 remove 的时间复杂度由 O(1) 变为 O(N)

网络

HTTPS

问题1: HTTPS 和 HTTP 的区别?

HTTP 是超文本传输协议,明文传输数据,存在安全风险

HTTPS 使用 HTTP 通信,通过加入 SSL/TLS 安全协议来对数据包进行加密传输

HTTP 是通过 三次握手 来建立连接,而 HTTPS 在 三次握手 之后,还需要进行 SSL/TLS 的握手过程 才可以进入加密报文传输(HTTP默认端口 80、HTTPS 默认端口 443)

问题2: HTTPS 可以防止哪些攻击?

HTTPS 将数据加密传输,可以防止 传输的数据被窃取

扩展: HTTPS 的加密流程

接下来说一下 HTTPS 是如何保证数据不被窃取的:

HTTPS 使用的 对称加密 + 非对称加密 两者结合的算法

HTTPS 在 HTTPS 握手的时候,使用的是 非对称加密 ,服务器会发送给浏览器 数字证书 ,包含了公钥,浏览器使用公钥加密一个随机生成的 对称密钥 ,发送给服务器

当浏览器和服务器建立通信之后,使用对称密钥来进行数据的加密解密,这个过程使用的 对称加密

为什么要使用两种加密算法的结合呢?

  • 对称加密:加密解密过程中使用相同的密钥,速度很快,但是如何让双方都安全的拿到这个密钥比较困难(因此和非对称加密结合,来安全的传输这个对称密钥)
  • 非对称加密:加密解密过程中使用一对密钥,即公钥和私钥。公钥是公开的,用于加密;私钥只能自己拿到,用于解密,整个过程相对复杂,比较耗时,一般用于密钥的交换

通过了解这两种算法的区别,也就知道了为什么要使用这两种算法的结合了,HTTPS 既想要对称加密的性能,又想要非对称加密的安全性!

整个 HTTPS 使用非对称加密以及对称加密的流程如下:

1707122304326
1707122304326

问题3 : HTTPS 建立连接是几次握手?

这里 HTTPS 的相关内容较为复杂,我写的比较简陋,如果我们的项目不是太偏向于网络的话,个人觉得了解整个流程原理即可

HTTPS 的通信流程为:

  • 客户端向服务器请求获取 公钥
  • 双方协商产生 对称密钥
  • 双方采用 对称密钥 进行加密通信

前两个步骤是建立 SSL/TLS 的过程,HTTPS 是基于 SSL 或 TLS 进行加密的,不过 SSL 已经退出历史舞台了,现在说的 HTTPS 其实就是 HTTP+TLS

那么 TLS 握手的过程总共包含了 4 次通信 ,在 4 次通信之后,TLS 协议也就建立成功了,可以进行 HTTPS 通信了,4 次通信如下:

  • 第一次通信 ClientHello:客户端向服务端发送加密请求,主要是协商 TLS 版本、随机数(生成后续的对称密钥)
  • 第二次通信 ServerHello:服务端向客户端回复,主要协商 TLS 版本、随机数(生成后续的对称密钥)、数字证书(包含公钥)
  • 第三次通信 客户端回应:取出数字证书的公钥,将用于通信的 对称密钥 通过公钥加密发送给服务端
  • 第四次通信 服务端最后回应:使用自己本地的密钥进行解密,得到用于通信的 对称密钥

之后双方就可以使用这个 对称密钥 进行加密通信了

问题4: HTTP1 和 HTTP2 的区别?

常用的 HTTP 协议的版本包含了 HTTP/1.1、HTTP/2.0、HTTP/3.0,不过目前常见的就是 HTTP/1.1 和 HTTP/2.0(通过 F12 控制台可以看到协议版本)

  • HTTP1.0 中为 短连接 ,每次通信都要建立一次 TCP 连接,开销很大

  • 因此在 HTTP/1.1 中优化为 长连接 ,通过管道机制在一个 TCP 连接中,客户端可以发送多个请求,服务端可能会按顺序处理请求,因此会导致 后续的请求被阻塞

  • HTTP/2 是基于 HTTPS 的,相对于 HTTP/1 来说 比较安全 ,并且 HTTP/2 提出了 Stream 的概念,可以在一个 TCP 连接上维护多个 Stream,通过多个 Stream 可以并行发送消息,并且 HTTP/2 将请求和响应数据分割为了更小的帧 ,减少传输无用数据的体积

HTTP/2 主要就在这 3 个方面做出了优化:安全性、Stream、帧

场景题

最后一个场景题:手机淘宝输入一个商品按下搜索之后,会发生一个怎么样的过程?

这个题如果大家有比较好的想法,可以讨论一下!

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2194435.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【cpp/c++ summary 工具】Visual Studio 2022 安装与cmake项目配置

Visual Studio 2022安装 https://visualstudio.microsoft.com/zh-hans/free-developer-offers/下载后选择c桌面开发安装即可&#xff1a; Visual Studio 2022创建cmake项目 Visual Studio 2022打开cmake项目 点击打开带有cmakelists.txt的项目文件夹 配置缓存&#xff1a;点…

【操作系统考研】2进程管理(1)

在翻看操作系统知识框架的时候&#xff0c;对一些概念的理解还比较模糊&#xff0c;现在我来理清他们的关系。 操作系统、处理器、进程、线程、内存、存储器、设备、文件的关系 咱们可以把计算机系统想象成一个大工厂&#xff0c;来理解这些概念之间的关系。 操作系统&#xf…

小目标检测利器:YOLOv8+SAHI使用教程

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

软考系统分析师知识点三:应用数学

前言 今年报考了11月份的软考高级&#xff1a;系统分析师。 考试时间为&#xff1a;11月9日。 倒计时&#xff1a;34天。 目标&#xff1a;优先应试&#xff0c;其次学习&#xff0c;再次实践。 复习计划第一阶段&#xff1a;扫平基础知识点&#xff0c;仅抽取有用信息&am…

vSAN06:ESA与OSA对比、ESA安装、新架构、工作方式、自动策略管理、原生快照、数据压缩、故障处理

目录 vSAN ESAvSAN ESA 安装ESA新架构ESA工作方式ESA自动策略管理自适应RAID5策略 原生快照支持数据压缩的改进ESA故障处理 vSAN ESA vSAN ESA 安装 流程和OSA完全一致&#xff0c;但要注意要勾选启用vSAN ESA ESA和OSA的底层架构不一样&#xff0c;但是UI上是一致的。 生产环…

【C++】第二节:类与对象(上)

1、面向过程和面向对象初步认识 C 语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C 是面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完成。 …

【ESP32】Arduino开发 | Timer定时器+定时器闹钟例程

有关定时器外设的详细介绍在ESP-IDF的对应文章中&#xff0c;跳转栏目目录可以找到。 1. API 1.1 启动定时器 hw_timer_t * timerBegin(uint8_t timer, uint16_t divider, bool countUp); timer&#xff1a;定时器序号&#xff08;ESP32有4个硬件定时器&#xff0c;所以可填序…

您看这篇就够了:ComfyUI 新手指南!

前言 欢迎来到 ComfyUI 的神奇世界&#xff0c;这是 Stable Diffusion 的一个强大而灵活的图形用户界面。无论你是数字艺术的新手&#xff0c;还是希望将你的图像创作提升到新高度的老手&#xff0c;ComfyUI 都能满足你的需求。在这篇全面的指南中&#xff0c;我们将带你穿越 …

2003经典绝版100%仿盛大服务端火炬引擎原版

;中国游戏制作 本版本为中国游戏制作小组推出的第一个版本&#xff0c;有什么不完美的地方还请大家多多指教&#xff01;&#xff01;&#xff01; 与盛大逼真&#xff01;&#xff01;&#xff01; 本版本M2Server采用“梦幻风”以及“冰眼”M2Server修改器修改的 2004/1/…

vue项目配置cesium

vue中配置cesium ①打开目标文件夹的终端&#xff0c;输入 pnpm install cesium ②这时你的node_models文件夹下&#xff0c;会出现cesium文件夹&#xff1b;然后&#xff0c;其中Build/Cesium文件夹&#xff0c;复制到public文件夹下。 ③打开public/index.html文件&#xf…

Linux下载安装MySQL8.4

这里写目录标题 一、准备工作查看系统环境查看系统架构卸载已安装的版本 二、下载MySQL安装包官网地址 三、安装过程上传到服务器目录解压缩&#xff0c;设置目录及权限配置my.cnf文件初始化数据库配置MySQL开放端口 一、准备工作 查看系统环境 确认Linux系统的版本和架构&am…

[单master节点k8s部署]31.ceph分布式存储(二)

Ceph配置 Ceph集群通常是一个独立的存储集群&#xff0c;可以部署在 Kubernetes 集群之外。Ceph 提供分布式存储服务&#xff0c;能够通过 RADOS、CephFS、RBD&#xff08;块存储&#xff09;、和 RGW&#xff08;对象存储&#xff09;等方式与 Kubernetes 集成。即使 Ceph 部…

SumatraPDF一打开就无响应怎么办?

结论&#xff1a;当前安装版不论32位还是64位都会出现问题。使用portable免安装版未发现相关问题。——sumatrapdf可以用于pdf, epub, mobi 等格式文件的浏览。 点击看相关问题和讨论

如何使用 Python 的 logging 模块记录日志

如何使用 Python 的 logging 模块记录日志 在编写 Python 程序时&#xff0c;日志记录是一个非常重要的部分。日志不仅帮助你在开发过程中调试代码&#xff0c;还可以在程序正式运行时提供诊断信息&#xff0c;帮助定位问题。如果你正在构建一个复杂的系统或者开发大型应用程序…

【数据结构】【队列】算法汇总

一、顺序队列【相当于一维数组】 1.准备工作 #define MAXQSIZE 100 typedef struct{QElemType*base;int front;int rear; }SqQueue; 2.队满&#xff0c;队空。入队&#xff0c;出队 二、链式队列 1.准备工作 typedef struct Qnode{ElemType data;struct Qnode*next; }Qnod…

深入浅出解析大模型:探索智能体(Agent)

大语言模型 vs 人类 大语言模型很强大&#xff0c;就像人类的大脑一样拥有思考的能力。如果人类只有大脑&#xff0c;没有四肢&#xff0c;没有工具&#xff0c;是没办法与世界互动的。如果我们能给大模型配备上四肢和工具呢&#xff1f;大模型是不是就会打破次元壁&#xff0…

GD32F4xx USB MSC Host调试记录

本文记录GD32F4xx MCU的RTX系统工程内移植USB MSC Host的例程代码,适配自制的电路板,实现向USB内写入数据。有关USB的一些基础信息,可以参考本专栏的另一篇文章《GD32 MCU USB开发学习记录》。 目录 1. USB MSC host 例程1.1、硬件接口2.2、USB msc host 例程2.2.1 工程目录…

dz论坛可可积分商城插件价值399元

界面简洁美观大方&#xff0c;适合各类站点。支持多用户商城&#xff0c;可让商家入驻站点发布商品&#xff0c;亦可站长自己发布商品。支持向商家抽佣抽成功能&#xff0c;可设置商家在成交商品后按一定比例扣除抽成&#xff0c;达到网站盈利目的采用队列技术处理&#xff0c;…

【ubuntu22.04】 搭建自己的镜像站 【harbor】【docker compose】【超详细】

文章目录 什么是 harbor特点主要功能 部署配置 dns初始化下载 dns编辑 named.conf.local编辑 named.conf.options配置正向解析配置反向解析解析扩展 部署 harbor修改配置执行 prepare执行 install.sh查看镜像访问 自制镜像创建镜像仓库上传镜像开始推送拉取镜像 什么是 harbor …

宏队列和微队列

1、javascript是一个单线程语言。 javascript 语言的目的&#xff08;待补充&#xff09; 2、主线程执行完成之后&#xff0c;再执行微队列&#xff0c;微队列执行完成后再执行宏队列 3、promise的构造函数传入的回调函数是同步执行 4、promise的then函数会直接加入微队列&…