面试系列-淘天提前批面试
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 使用非对称加密以及对称加密的流程如下:

问题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 多平台发布
相关文章:

面试系列-淘天提前批面试
00-淘天提前批面试 在牛客上看到了淘天提前批的面试题目,这里分析一下淘天面试的问了有哪些内容,面试的重点 是偏向哪些方面 项目相关 1、秒杀架构如何设计? 问了秒杀的架构如何设计,对于秒杀的设计,秒杀符合 写多读少…...

计算机中科学中有哪些空间换时间的操作??
计算机中科学中有哪些空间换时间的操作?? 1. SPOOLing (Simultaneous Peripheral Operations On-Line) 原理:SPOOLing 是一种将输入/输出操作缓存到磁盘或内存中的技术,从而在后台处理它们。这可以防止 CPU 等待慢速的外部设备&…...

Mac安装Manim并运行
1.在macOS上创建Python虚拟环境,可以使用venv模块,这是Python自带的库,也可以使用conda。以下是使用venv创建和使用Python虚拟环境的步骤: 打开终端。 创建一个新的目录来存放你的项目,并进入该目录: mk…...

leetcode58:最后一个单词的长度
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串 。 示例 1: 输入:s "Hello World" 输出ÿ…...

18448 最小生成树
### 思路 使用Kruskal算法求解图的最小生成树。Kruskal算法通过对所有边按权值排序,然后逐步选择最小权值的边,确保不会形成环,直到构建出最小生成树。 ### 伪代码 1. 读取输入的结点数n和边数m。 2. 读取每条边的信息,存储在边列…...

前端工程化 - Vue
环境准备 Vue-cli是Vue官方提供的一个脚手架,用户快速生成一个Vue的项目模板。 Vue-cli提供了如下功能: 统一的目录结构本地调试热部署单元测试集成打包上线 需要安装Node.js 安装Vue-cli npm install -g vue/cli通过vue --version指令查看是否安装成…...

使用 NVIDIA H100 上的 Azure 机密计算释放隐私保护 AI 的潜力
通过 NVIDIA H100 上的 Azure 机密计算释放隐私保护 AI 的潜力 文章目录 前言一、机密计算二、使用 NVIDIA H100 Tensor Core GPU 的 Azure 机密计算1. 安全功能2. 可扩展性和可编程性三、场景1. 模型机密性2. 推理/提示机密性3. 使用私有数据进行微调4. 多方培训结论前言 这是…...

目标检测与图像分类:有什么区别?各自的使用场景是什么?
《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…...

Lua 数据类型
Lua 数据类型 Lua 是一种轻量级的编程语言,因其简单性和灵活性而广受欢迎。在 Lua 中,数据类型是编程的基础,它们决定了变量能够存储哪种类型的数据。Lua 的数据类型可以分为以下几个类别: 1. nil nil 是 Lua 中的一个特殊类型…...

复现文章:R语言复现文章画图
文章目录 介绍数据和代码图1图2图6附图2附图3附图4附图5附图6 介绍 文章提供画图代码和数据,本文记录 数据和代码 数据可从以下链接下载(画图所需要的所有数据): 百度云盘链接: https://pan.baidu.com/s/1peU1f8_TG2kUKXftkpYq…...

东方仙盟——软件终端架构思维———未来之窗行业应用跨平台架构
一、创生.前世今生 在当今的数字化时代,我们的服务覆盖全球,拥有数亿客户。然而,这庞大的用户规模也带来了巨大的挑战。安全问题至关重要,任何一处的漏洞都可能引发严重的数据泄露危机。网络带宽时刻面临考验,稍有不足…...

支持向量机(SVM)基础教程
一、引言 支持向量机(Support Vector Machine,简称SVM)是一种高效的监督学习算法,广泛应用 于分类和回归分析。SVM以其强大的泛化能力、简洁的数学形式和优秀的分类效果而备受机器学 习领域的青睐。 二、SVM基本原理 2.1 最大间…...

Python小示例——质地不均匀的硬币概率统计
在概率论和统计学中,随机事件的行为可以通过大量实验来研究。在日常生活中,我们经常用硬币进行抽样,比如抛硬币来决定某个结果。然而,当我们处理的是“质地不均匀”的硬币时,事情就变得复杂了。质地不均匀的硬币意味着…...

京东web 京东e卡绑定 第二部分分析
声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我删…...

【数据结构与算法】Greedy Algorithm
1) 贪心例子 称之为贪心算法或贪婪算法,核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则,选取当前最优解因为没有考虑所有可能,局部最优的堆叠不一定让最终解最优 贪心算法是一种在每一步选择中都采取在当前状态下最好…...

Ubuntu22.04之mpv播放器高频快捷键(二百七十)
简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布:《Android系统多媒体进阶实战》🚀 优质专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀 优质专栏: 多媒体系统工程师系列【…...

新闻推荐系统:Spring Boot的可扩展性
6系统测试 6.1概念和意义 测试的定义:程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为: 目的:发现程序的错误; 任务:通过在计算机上执行程序,暴露程序中潜在的错误。 另一个…...

目录工具类 - C#小函数类推荐
此文记录的是目录工具类。 /***目录工具类Austin Liu 刘恒辉Project Manager and Software DesignerE-Mail: lzhdim163.comBlog: http://lzhdim.cnblogs.comDate: 2024-01-15 15:18:00***/namespace Lzhdim.LPF.Utility {using System.IO;/// <summary>/// The Objec…...

速盾:如何判断高防服务器的防御是否真实?
随着网络攻击日益增多和攻击手段的不断升级,保护网络安全变得越来越重要。高防服务器作为一种提供网络安全保护的解决方案,受到了越来越多的关注。然而,对于用户来说,如何判断高防服务器的防御是否真实,是否能够真正保…...

MySQL连接查询:联合查询
先看我的表结构 emp表 联合查询的关键字(union all, union) 联合查询 基本语法 select 字段列表 表A union all select 字段列表 表B 例子:将薪资低于5000的员工, 和 年龄大于50 岁的员工全部查询出来 第一种 select * fr…...

Gitea 数据迁移
一、从 Windows 迁移 Gitea 1. 备份 Gitea 数据 1.1 备份仓库文件 在 Windows 中,Gitea 仓库文件通常位于 C:\gitea\data\repositories。你可以使用压缩工具将该目录打包: 1.)右键点击 C:\gitea\data\repositories 目录,选择 “…...

MySQL 绪论
数据库相关概念 数据库(DB):存储数据的仓库数据库管理系统(DBMS):操纵和管理数据库的大型软件SQL:操纵关系型数据库的编程语言,定义了一套操作关系型数据库的统一标准主流的关系型数…...

什么是 HTTP Get + Preflight 请求
当在 Chrome 开发者工具的 Network 面板中看到 GET Preflight 的 HTTP 请求方法时,意味着该请求涉及跨域资源共享 (CORS),并且该请求被预检了。理解这种请求的背景,主要在于 CORS 的工作机制和现代浏览器对安全性的管理。 下面是在 Chrome …...

(JAVA)开始熟悉 “二叉树” 的数据结构
1. 二叉树入门 符号表的增删查改操作,随着元素个数N的增多,其耗时也是线性增多的。时间复杂度都是O(n),为了提高运算效率,下面将学习 树 这种数据结构 1.1 树的基本定义 树是我们计算机中非常重要的一种数据结构…...

【Linux】Linux命令与操作详解(一)文件管理(文件命令)、用户与用户组管理(创建、删除用户/组)
文章目录 一、前言1.1、Linux的文件结构是一颗从 根目录/ 开始的一个多叉树。1.2、绝对路径与相对路径1.3、命令的本质是可执行文件。1.4、家目录 二、文件管理2.1、文件操作1、pwd2、ls3、cd4、touch5、mkdir6、cp7、rm8、mv9、rmdir 2.2、查看文件1、cat2、more3、less4、hea…...

Hadoop大数据入门——Hive-SQL语法大全
Hive SQL 语法大全 基于语法描述说明 CREATE DATABASE [IF NOT EXISTS] db_name [LOCATION] path; SELECT expr, ... FROM tbl ORDER BY col_name [ASC | DESC] (A | B | C)如上语法,在语法描述中出现: [],表示可选,如上[LOCATI…...

个人开发主页
网站 GitHubCSDN知乎豆包Google百度 多媒体 ffmpeg媒矿工厂videolanAPPLE开发者官网华为开发者官网livevideostack高清产业联盟github-xhunmon/VABloggithub-0voice/audio_video_streamingdoom9streamingmediaFourCC-wiki17哥Depth.Love BlogOTTFFmpeg原理介绍wowzavicuesof…...

思维+数论,CF 922C - Cave Painting
目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 922C - Cave Painting 二、解题报告 1、思路分析 诈骗题 我们发现 n mo…...

如何下单PCB板和STM贴片服务- 嘉立创EDA
1 PCB 下单 1.1 PCB 设计好,需要进行DRC 检查。 1.2 生成gerber文件、坐标文件和BOM文件 1.3 打开嘉立创下单助手 上传gerber文件 1.4 选择下单数量 1.5 选择板材, 一般常用板材 PR4 板材。 1.6 如果需要阻抗匹配,需要选择设计的时候阻抗叠…...

MySQL连接查询:外连接
先看我的表结构 dept表 emp表 外连接分为 1.左外连接 2.右外连接 1.左外连接 基本语法 select 字段列表 FORM 表1 LEFT [OUTER] JOIN 表2 ON 条件;例子:查询emp表的所有数据,和对应部门的员工信息(左外连接) select e.*, d.n…...