当前位置: 首页 > news >正文

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

目录

分栏简介:

问题一:订单表每天新增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规则,并能举例说明其在解决并发问题中的应用,以展现对并发控制的深入理解。

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

相关文章:

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

目录 分栏简介: 问题一:订单表每天新增500W条数据,分库分表应该怎么设计? 问题难度以及频率: 问题导向: 满分答案: 举一反三: 问题总结: 问题二:解释…...

服务器卸载安装的 Node.js

卸载安装的 Node.js 版本,具体步骤取决于你是通过包管理器(如 yum 或 dnf)安装的,还是通过 nvm (Node Version Manager) 安装的。以下是针对这两种情况的指南。 通过包管理器卸载 Node.js 如果你是通过 yum 或 dnf 安装的 Node.…...

深度解析 Ansible:核心组件、配置、Playbook 全流程与 YAML 奥秘(下)

文章目录 六、playbook运行playbook方式Playbook VS ShellScripts忽略错误 ignore_errorshandlers和notify结合使用触发条件playbook中tags的使用playbook中变量的使用invertory参数模板templates迭代与条件判断迭代:with_items迭代嵌套子变量roles 六、playbook 运…...

使用go生成、识别二维码

1、下载 # 创建目录 # 进入目录 # 执行 go mod init xxx 命令(即:在当前目录初始化创建一个模块)# 下载gozxing go get github.com/makiuchi-d/gozxing 2、生成二维码 package mainimport ("image/png""os""gith…...

LLama系列模型简要概述

LLama-1(7B, 13B, 33B, 65B参数量;1.4T tokens训练数据量) 要做真正Open的AI Efficient:同等预算下,增大训练数据,比增大模型参数量,效果要更好 训练数据: 书、Wiki这种量少、质量高…...

2022 年“泰迪杯”数据分析技能赛A 题竞赛作品的自动评判

2022 年“泰迪杯”数据分析技能赛A 题竞赛作品的自动评判 完整代码请私聊 博主 一、背景 在各类学科竞赛中,常常要求参赛者提交 Excel 或/和 PDF 格式的竞赛作品。 本赛题以某届数据分析竞赛作品的评阅为背景,要求参赛者根据给定的评分准则和标准答案&a…...

MYSQL表联接算法深入研究

在关系型数据库中,表联接是一种常见的操作,它使得我们可以根据不同的条件将多个表中的数据进行连接。而MySQL作为一种常用的关系型数据库,其表联接算法包括NLJ、BNL、BKA、BNLH等多种,在实际应用中选择不同的算法还需要考虑到数据…...

markdown中画图功能mermaid

mermaid Mermaid 是一种开源的可交互式的数据可视化库,它使用 Markdown 标记语言来生成图表和流程图。它通常用于生成网站或文档中的图表。Mermaid 不属于任何公司,而是一个由社区开发和维护的开源项目。 官方网站: https://mermaid-js.git…...

SCI论文丨机器学习与深度学习论文

目录 第一章、ChatGPT-4o使用方法与技巧 第二章、ChatGPT-4o辅助文献检索、总结与分析 第三章、ChatGPT-4o辅助学术论文选题、创新点挖掘与实验方案设计 第四章、ChatGPT-4o辅助学术论文开题与大纲生成 第五章、ChatGPT-4o辅助学术论文写作马拉松活动介绍 第六章、ChatGPT…...

linux系统编程(二)

1、fcntl #include <unistd.h> int fcntl(int fd, int cmd, ...)fcntl用于控制文件描述符&#xff0c;该系统调用有很多功能&#xff0c;功能用cmd来控制&#xff0c;fcntl后面的参数根据cmd来填充。 我们常用的cmd有&#xff1a; F_GETFL&#xff1a;获取文件状态标志…...

uni-app登录界面样式

非常简洁的登录、注册界面模板&#xff0c;使用uni-app编写&#xff0c;直接复制粘贴即可&#xff0c;无任何引用&#xff0c;全部公开。 废话不多说&#xff0c;代码如下&#xff1a; login.vue文件 <template><view class"screen"><view class"…...

windows C#-定义抽象属性

以下示例演示如何定义抽象属性。 抽象属性声明不提供属性访问器的实现&#xff0c;它声明该类支持属性&#xff0c;而将访问器实现留给派生类。 以下示例演示如何实现从基类继承抽象属性。 此示例由三个文件组成&#xff0c;其中每个文件都单独编译&#xff0c;产生的程序集由…...

ERROR: KeeperErrorCode = NoNode for /hbase/master

原因分析 通过上面的情景模拟&#xff0c;我们可以看到报错的原因在于zookeeper中出现问题&#xff0c;可能是zookeeper中的/hbase/master被删除&#xff0c;或者是在hbase集群启动之后重新安装了zookeeper&#xff0c;导致zookeeper中的/hbase/master节点数据异常。 1. 停止…...

Deepin 23 踩坑记

&#xff08;首发地址&#xff1a;学习日记 https://www.learndiary.com/2024/12/deepin23-questions/&#xff09; Deepin 23 是由统信软件技术有限公司牵头开发一款开源 Linux 桌面操作系统&#xff08;参考链接1&#xff09;&#xff0c;从2022年发布预览版&#xff08;参考…...

mysql笔记——索引

索引 InnoDB采用了B树索引结构。 相比于二叉树&#xff0c;层级更少&#xff0c;搜索效率高。 B树中叶子节点和非叶节点都会存储数据&#xff0c;导致段页式存储中一页存储的键值减少&#xff0c;指针也会减少&#xff0c;要同样保存大量数据&#xff0c;只能增加树的高度&a…...

考研数据结构——简答题总结

数据结构的4种基本结构及特点&#xff1a; 数组&#xff08;Array&#xff09;&#xff1a; 特点&#xff1a;数组是一种线性数据结构&#xff0c;使用连续的内存空间存储元素&#xff0c;可以通过索引直接访问任意位置的元素。优点&#xff1a;访问速度快&#xff0c;因为元…...

Qt Creator 里面设置MSVC 为 utf-8

在使用 Qt Creator 和 MSVC(Microsoft Visual C++)编译器进行开发时,我们可能会遇到中文乱码的问题。这通常是由于编码设置不正确导致的。 在 Qt Creator 中,你可以通过以下步骤设置默认编码为 UTF-8: 打开 Qt Creator,选择菜单栏中的“工具”(Tools) > “选项”(Opti…...

Java阶段三06

第3章-第6节 一、知识点 理解MVC三层模型、理解什么是SpringMVC、理解SpringMVC的工作流程、了解springMVC和Struts2的区别、学会使用SpringMVC封装不同请求、接收参数 二、目标 理解MVC三层模型 理解什么是SpringMVC 理解SpringMVC的工作流程 学会使用SpringMVC封装请求…...

Helm安装Mysql8主从复制集群

目录 一、Helm安装 二、安装mysql 1、拉取镜像 2、修改配置文件 3、创建mysql-secret 4、安装 一、Helm安装 这里不再赘叙&#xff0c;具体安装请参考官网 Helm | 快速入门指南 二、安装mysql 1、拉取镜像 #添加仓库 helm repo add bitnami https://charts.bitnami.c…...

嵌入式基础:Linux C语言:Day7

重点&#xff1a; strlen()函数\strcpy()函数\strcat实现\strcmp()实现 数组的清空&#xff1a;bzero函数、memset函数 一、字符数组 <1> 概念 字符数组本质上就是一个数组&#xff0c;保存一个个字符&#xff0c;也一般用来保存字符串 字符串由多个字符组成的一个字符…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径

目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1&#xff1a;修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本&#xff1a;CentOS 7 64位 内核版本&#xff1a;3.10.0 相关命令&#xff1a; uname -rcat /etc/os-rele…...