JAVA秋招面试题精选-第一天总结

news2025/1/16 12:45:21

目录

分栏简介:

问题一:订单表每天新增500W条数据,分库分表应该怎么设计?

问题难度以及频率:

问题导向:

满分答案:

举一反三:

问题总结:

问题二:解释一下JAVA的内存模型和happens-before的规则?

问题难度以及频率:

问题导向:

满分答案:

举一反三:

问题总结:


分栏简介:

        欢迎来到我的“面试”专栏!在这里,我精心记录并分享各类面试中的高频问题及深度解析。无论你是即将步入职场的应届生,还是寻求跳槽晋升的职场人,都能在这里找到宝贵的面试经验和答题技巧。从编程基础到算法难题,从项目管理到行业趋势,每一篇文章都力求让你在面试中更加游刃有余。关注我,让我们一起在面试之路上步步为赢,迈向职业生涯的新高峰!

问题一:订单表每天新增500W条数据,分库分表应该怎么设计?

问题难度以及频率:

 ✮  ✮  ✮  ✮  

问题导向:

        面试官问这个问题的意图很明显,就是考察你对分库分表的理解,特别是多增加了两个条件,涉及到多个分片键查询的问题,给求职者失职了一定的困难。更重要的是,每天有500万的增量数据,一个月就有1.5个亿,数据库单表支撑一亿数据的快速检索,性能上一定是很差的。

        要注意,这种没有边界的问题,主要是考察求职者的思路,解决方案能不能落地不重要,下面我们来看看这和问题的解决思路

满分答案:

        这个问题要从两个方面来回答:第一个部分就是分库分表的方案,分库分表很简单,但是要分多少个表多少个库,是要做好提前的规划的,由于数据的增量比较大,我们要避免分库分表之后,又出现容量满了的情况,或者单表数据量过大的问题,如果这个时候再去做容量扩充,数据迁移和扩容的成本会非常高。

        一天500万的增量,一年大概有18亿的数据量,我们按照保留两年的热数据量,大概就是接近40亿,然后我们做一些空间的预留,算50亿的数据,那我们可以按照32个库,每个库32张表来规划,一共1024张表, 每个表里面存放500万数据量,那么就可以满足50亿数据的容量规划。

        在这个方案中,我们可以选择orderID作为分片键,采用一致性hash算法来进行路由,在性能层面,假设每个库正常写入的并发量是1000,那32个库可以承载32000的并发量。如果每个库的写性能再优化到1500.就意味着这个方案能支持接近5W每秒的写并发,这个已经能够满足大部分互联网公司的并发需求了。

举一反三:

        需要考虑的问题,这个方案并不能完整的满足面试官的需求,还有几个问题需要考虑:* 业务需要根据用户ID进行查找,而用户ID不是分片键,导致查询的时候变得很复杂。

        对于这样的问题,我们可以采用基因算法,来确保用户ID对应的订单ID路由到同一个何库或者同一个表,在生成订单ID的时候,把用户ID的基因片段拼接到订单ID中,从而保证不管是通过订单ID查询还是根据用户ID进行查询都能路由到同一个表中。

        第二、虽然我们设计了32个库和32个表,但是也只能存储50亿的数据,也就是差不多三年时间,那三年之后这个方案就不满足了,该怎么办呢?

        通常订单类的业务,我们频繁访问的数据一般在一年以内,超过一年的数据基本就不用太关心了,所以我们可以设计冷热数据分离的方案,热数据保持一年,一年以后得数据迁移到历史库,历史库也就是冷库,只保存两年,超过这个时间的数据直接归档,从而实现一个1+2的数据存储方案。

问题总结:

        除了以上的方案,我们还可以采取如今比较主流的HTAP存储方案,比如TIDB、PolorDB等,这类数据库的好处是可以支持在线扩容,比如分片、迁移,这种扩展对业务完全无感知,同时支持强一致性的分布事务的方案,也就是跨分片跨节点的事务一致性,可以跨机房部署实现跨机房容灾,支持多节点写入。

问题二:解释一下JAVA的内存模型和happens-before的规则?

问题难度以及频率:

 ✮  ✮  ✮  ✮  ✮ 

问题导向:

        面试官考察这个问题,主要是考察你对Java多线程、并发控制、内存模型以及数据同步等底层原理的理解,他们希望看到的是你对这些复杂概念的深入理解,和能够清晰表述的能力,以此来评估你在实际工作中处理并发问题的能力。

        在回答这个问题的时候,你不仅要能够清晰地表述JMM和happens-before的规则,还应该能够举例说明这些概念如何在实际编程中去使用,并解决并发问题。

满分答案:

        Java内存模型主要定义了Java虚拟机在计算机内存中的工作方式,JVM决定了一个线程对共享变量的写入,何时对另外一个线程可见,happens-before规则,他是一个能够帮助我们理解内存可见性和有序性的一个原则。

        如果操作A,happens-before操作B,那么A的结果必须对B可见,而A的执行顺序应该在B之前,这个规则可以帮助我们确保在多线程开发中没有额外的同步情况下,不会读取到旧的数据,也就是不会产生可见性问题。

        Happens-before规则有很多,下面举几个常见的规则:

        1. 程序顺序规则,在单线程环境中,按照代码的顺序,书写在前面的操作happens-before于书写在后面的操作。

        2. 同步锁规则,对一个锁的释放,一定happens-before于随后对这个锁的加锁操作。

        3. volatile变量规则,对一个volatile变量的写的操作happens-before于任意后续对这个volatile变量的读的操作。

        4. 传递性规则,如果A happens-before B,且B happens-before C,那么A一定happens-before于C。

        以上就是常见的happens-before的操作原则

举一反三:

        Java内存模型也就是JMM,它主要关注的是多线程环境下,如何以安全的方式在主内存和工作内存之间交换信息,我们都知道Java程序是运行在Java虚拟机上的,同时我们也知道JVM是一个跨语言跨平台的实现,也就是Write Once、Run Anywhere。

        那么JVM是如何实现在不同平台上都达到线程安全这样一个目的的呢?所以这个时候JMM的概念就出来了,Java内存模型也就是Java member model,就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。

        Java内存模型规定的所有变量都存储在总内存中,每条线程有自己的工作内存,线程的工作内存中,保存了这个线程中用到的变量的主内存的副本拷贝,线程对变量的所有操作,都必须在工作内存中进行,而不能直接读写主内存。

        不同的线程之间也无法直接访问对方工作内存中的变量,线程之间的变量传输,都需要通过主内存进行一个同步,而happen-before规则是Java内存中定义的一种可见性和有序性关系的一个模型,它用来描述两个操作的先后执行顺序。

问题总结:

        面试中,关于Java内存模型(JMM)及happens-before规则的考察,重点在于理解多线程环境下内存访问的安全性和一致性。要清晰阐述JMM的工作原理和happens-before规则,并能举例说明其在解决并发问题中的应用,以展现对并发控制的深入理解。

如果文章对您有帮助,还请您点赞支持
感谢您的阅读,更多问题请关注博主后续更新

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

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

相关文章

C—初阶结构体

若是阁下满意的话,能否一键三连呢!!!! 结构体基础知识: 概念:结构体是一些值的集合,这些值称为变量,变量可以是不同类型 这里我们再想一下之前的数组,数组是一…

物品识别 树莓派 5 YOLO v5 v8 v10 11 计算机视觉

0. 要实现的效果 让树莓派可以识别身边的一些物品,比如电脑,鼠标,键盘,杯子,行李箱,双肩包,床,椅子等 1. 硬件设备 树莓派 5 raspberrypi.com/products/raspberry-pi-5/树莓派官方摄…

JS学习(1)(基本概念与作用、与HTML、CSS区别)

目录 一、JavaScript是什么? (1)基本介绍 (2)简称:JS? 二、JavaScript的作用。 三、HTML、CSS、JS之间的关系。 (1)html、css。 (2)JavaScript。 …

matlab读取NetCDF文件

matlab对NetCDF文件进行信息获取和读取数据 文章目录 前言一、什么是NetCDF文件二、读取NetCDF文件数据 1.引入库 2.读入数据总结 前言 在气象学中,许多气象数据存储在NetCDF文件中,后缀为.nc,通常可以用NCL、python和MATLAB等对该…

shell自动显示当前git的branch

效果简介: 1. 如果没在git仓库,显示无变化 2. 如果在git仓库,显示当前分支 实现方法: 在~/.bashrc 里添加: function git_branch { test -d .git && branch"git branch | grep "^\*" | sed…

第四十一天 ASP应用 HTTP.sys 漏洞 iis6文件解析漏洞和短文件漏洞 access数据库泄露漏洞

前言 随着时代的发展现在呀,这个ASp已经淡出大众的视线了 ,ASP之前的火爆程度无异于现在的PHP 大家的童年 4399 什么的网站都是这个搭建的ASP 简介 | 菜鸟教程 那大家想问为什么你妹的 这个这么火的网站搭建语言被淘汰了呢 其实多半是以为它的不开…

Java——常用类(下)

时间类 “时间如流水,一去不复返”,时间是一维的。所以,我们需要一把刻度尺来表达和度量时间。在计算机世界,我们把1970 年 1 月 1 日 00:00:00定为基准时间,每个度量单位是毫秒(1秒的千分之一),如图所示。…

ARMv8-A MacOS调试环境搭建

文章目录 简介安装qemu交叉编译工具链C语言插件 gdb调试测试代码添加调试配置 JLink 调试树莓派 简介 本节主要介绍基于Visual Studio Code在MacOS下调试环境的搭建,Linux发行版上的过程也类型,它主要使用到以下工具链: aarch64 架构的交叉…

万字长文解读深度学习——dVAE(DALL·E的核心部件)

🌺历史文章列表🌺 深度学习——优化算法、激活函数、归一化、正则化 深度学习——权重初始化、评估指标、梯度消失和梯度爆炸 深度学习——前向传播与反向传播、神经网络(前馈神经网络与反馈神经网络)、常见算法概要汇总 万字长…

Javaweb 前端 ajax

作用:和后端交互 script 是 js axios(这里是函数的调用方式){封装的是对象} {}是对象 案例 。then的含义,请求后端之后,后端把数据放在回调 点了清空之后,还要查询全部 await等待请求执行完之后,接收这个结果 代码…

IdentityServer4框架、ASP.NET core Identity

OAuth2.0 IdentityServer4 ASP.NET Core Identity提供了一个用来管理和存储用户账户的框架. IdentityServer4是基于ASP.NET Core实现的认证和授权框架,是对OpenID Connect和OAuth 2.0协议的实现。 IdentityServer是一个中间件,它可以添加符合OpenID Connect和OAut…

Linux系统nginx版本升级

最近公司漏扫有涉及到需要升级nginx的部分, 以下是一些总结经验 检查当前nginx版本 执行命令: nginx -V 如果没有设置环境变量则需要进入到nginx目录sbin目录下执行: ./nginx -V 下载最新版nginx nginx下载地址: https://nginx.org/en/download.html 1)选择稳定版本 wget h…

给建筑物“穿毛衣”:AI绘图新玩法

随着气温的骤降,我们不仅感受到了自然界的寒冷,甚至连城市的建筑物似乎也在寒风中“颤抖”。在这样的背景下,一种新颖的AI绘图玩法——给建筑“穿毛衣”在网络上迅速走红。本文将详细介绍这一创意玩法,并提供手把手的教学指导。 A…

第2章:CSS基本语法 --[CSS零基础入门]

CSS(层叠样式表,Cascading Style Sheets)是用来描述HTML或XML(包括各种XML:SVG, MathML 或 XHTML)等文档的外观和格式的语言。以下是CSS的基本语法: 1.选择器 1.元素选择器 元素选择器是基于HTML标签名称来选择元素的。当你使用元素选择器时,你是在告诉浏览器对页面…

SpringMvc完整知识点二(完结)

SpringMVC获取请求参数 环境准备工作等均省略,可详见快速入门,此处只写非共有部分代码 该部分示例项目SpringMvcThree已上传至Gitee,可自行下载 客户端请求参数的格式为:namevalue&passwordvalue... ... 服务端想要获取请求…

Spring完整知识点一

Spring简介 额外知识点 在之前的学习中我们在Service业务层创建Dao/Mapper数据访问层(持久层)的对象是通过工具类来获取对应Dao/Mapper数据访问层(持久层)的接口代理对象在此处我们不用工具类来获取对应Dao/Mapper数据访问层&…

Jupyter Notebook认识、安装和启动以及使用

Jupyter Notebook认识、安装和启动以及使用 Jupyter Notebook认识、安装和启动以及使用 Jupyter Notebook认识、安装和启动以及使用一、认识Jupyter Notebook1.1 Jupyter Notebook概述1.2 Jupyter Notebook 重要特性(1)交互式代码执行(2)支持多种编程语言(3)富文本编辑(4)代码高…

React 组件中 State 的定义、使用及正确更新方式

​🌈个人主页:前端青山 🔥系列专栏:React篇 🔖人终将被年少不可得之物困其一生 依旧青山,本期给大家带来React篇专栏内容React 组件中 State 的定义、使用及正确更新方式 前言 在 React 应用开发中,state …

AIDD-人工智能药物设计-化学自然语言引导的扩散式类药分子编辑:DiffIUPAC的魔法之旅

J. Pharm. Anal. | 化学自然语言引导的扩散式类药分子编辑:DiffIUPAC的魔法之旅 AIDD药研. 制药工程和生命科学背景,重点关注于计算机辅助药物设计(CADD)/药物筛选、分子动力学模拟MD,兽药信息学VetInformatics&…

服务器数据恢复—硬盘掉线导致热备盘同步失败的RAID5阵列数据恢复案例

服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障&#…