【21-30期】Java技术深度剖析:从分库分表到微服务的核心问题解析

🚀 作者 :“码上有前”
🚀 文章简介 :Java
🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬

在这里插入图片描述

在这里插入图片描述
文章题目:Java技术深度剖析:从分库分表到微服务的核心问题解析

摘要
本文针对Java开发中21-30期的常见面试问题进行了深入分析。从分布式系统中的分库分表设计、MySQL索引优化,到线程池的创建方式、线程状态切换以及网络协议对比等问题,提供详细的理论解析与实践案例,帮助开发者掌握这些核心技术点,为应对高难度的面试问题提供坚实的技术支持。


1. 美团外卖的分库分表怎么设计?

回答
分库分表是为了应对大规模数据访问压力,将数据分散到多个库或表中。

原理与逻辑

  • 分库:按业务拆分库(如订单库、用户库);
  • 分表:基于数据特征(如订单ID或时间范围)水平拆分表。
  • 中间件支持:使用ShardingSphere等工具实现动态路由和分片。

最佳实践
假设按订单ID进行分表:

CREATE TABLE orders_0 LIKE orders;
CREATE TABLE orders_1 LIKE orders;
-- 路由规则
SELECT * FROM orders_{orderId % 2};

2. MySQL中InnoDB的索引结构以及使用B+树实现索引的原因

回答
InnoDB的索引基于B+树组织数据。主键使用聚簇索引,其他列使用辅助索引。

原理与逻辑

  • B+树有较低的查找复杂度(O(log n));
  • 叶子节点链表支持范围查询;
  • 磁盘IO次数较少,适合大规模数据存储。

最佳实践
在一个订单表中创建索引:

CREATE TABLE orders (id BIGINT AUTO_INCREMENT PRIMARY KEY,user_id BIGINT NOT NULL,INDEX (user_id)
) ENGINE=InnoDB;

3. JDK 1.8 创建线程池的几种方式?

回答

  1. 使用Executors创建(如newFixedThreadPool);
  2. 手动创建ThreadPoolExecutor
  3. ForkJoinPool(用于并行计算)。

最佳实践
推荐直接使用ThreadPoolExecutor

ExecutorService executor = new ThreadPoolExecutor(2, 4, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(10),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());

4. Java线程的状态及转换

回答
Java线程有以下6种状态:

  • NEW:新建;
  • RUNNABLE:运行中;
  • BLOCKED:被阻塞;
  • WAITING:无限等待;
  • TIMED_WAITING:限时等待;
  • TERMINATED:终止。

状态转换示例

Thread t = new Thread(() -> {synchronized (lock) {// 执行任务}
});
t.start(); // NEW -> RUNNABLE

5. Hash碰撞是什么?如何解决?

回答
Hash碰撞是不同的键映射到相同的哈希值上。

解决方案

  1. 开放地址法:寻找下一个可用位置;
  2. 链地址法:将冲突的键值存储到链表中。

最佳实践
Java的HashMap采用链地址法结合红黑树优化:

HashMap<Integer, String> map = new HashMap<>();
map.put(1, "value");

6. TCP和UDP协议的原理和区别

回答

  • TCP:面向连接,可靠,顺序传输;
  • UDP:无连接,不可靠,速度快。

应用场景

  • TCP适用于文件传输、HTTP;
  • UDP适用于视频流、游戏通信。

最佳实践
使用Java实现TCP通信:

ServerSocket server = new ServerSocket(8080);
Socket client = server.accept();

7. 线程池中线程抛出异常,该如何处理?

回答
线程任务抛出异常后不会影响线程池,但可能导致任务丢失。

解决方案

  1. 在任务中捕获异常;
  2. 自定义线程池afterExecute方法处理异常。

最佳实践

ExecutorService executor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue<>()) {@Overrideprotected void afterExecute(Runnable r, Throwable t) {if (t != null) {System.err.println("任务抛出异常: " + t.getMessage());}}
};

8. 什么是微服务?

回答
微服务是一种架构模式,将应用拆分为多个小型服务,独立部署和维护。

特点

  • 服务独立、部署灵活;
  • 通过API通信;
  • 适合DevOps和CI/CD。

最佳实践
使用Spring Boot和Spring Cloud实现微服务:

@SpringBootApplication
@EnableDiscoveryClient
public class MicroserviceApplication {public static void main(String[] args) {SpringApplication.run(MicroserviceApplication.class, args);}
}

9. 将Bean放入Spring容器中的方式有哪些?

回答

  1. 使用@Component注解;
  2. @Configuration类中定义@Bean
  3. XML配置文件。

最佳实践

@Configuration
public class AppConfig {@Beanpublic MyService myService() {return new MyService();}
}

10. 当JVM堆内存溢出后,其他线程是否可以继续工作?

回答
堆内存溢出后,JVM可能抛出OutOfMemoryError,部分线程仍可继续工作,但全局资源可能受限。

最佳实践
监控和优化内存使用:

-Xms512m -Xmx1024m

结合工具(如JVisualVM)排查内存泄漏。


总结
本篇文章详细剖析了21-30期Java面试中的高频问题,涵盖了数据库优化、网络协议、线程池异常处理和微服务等技术点,并结合实际代码展示了解决方案。这些内容不仅能帮助开发者深入掌握Java核心知识,还能为面试提供实用技巧。

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

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

相关文章

C#里怎么样List类进行拷贝?

演示的代码: using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { internal class Program { static void Main(string[] args) …

Flutter 权限申请

这篇文章是基于permission_handler 10.2.0版本写的 前言 在App开发过程中我们经常要用到各种权限&#xff0c;我是用的是permission_handler包来实现权限控制的。 pub地址&#xff1a;https://pub.dev/packages/permission_handler permission_handler 权限列表 变量 Androi…

C#:时间与时间戳的转换

1、将 DateTime 转换为 Unix 时间戳&#xff08;秒&#xff09; public static long DateTimeToUnixTimestamp(DateTime dateTime) {// 定义UTC纪元时间DateTime epochStart new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);// 计算从UTC纪元时间到指定时间的总秒数Tim…

【Spring】Spring IOCDI:架构旋律中的“依赖交响”与“控制华章”

前言 &#x1f31f;&#x1f31f;本期讲解关于Spring IOC&DI的详细介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么…

在CentOS7上更换为阿里云源

在CentOS 7上更换为阿里云YUM源可以通过以下步骤进行&#xff1a; 备份当前的YUM源配置文件 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下载阿里云的YUM源配置文件 sudo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirr…

【小白学机器学习34】基础统计2种方法:用numpy的方法np().mean()等进行统计,pd.DataFrame.groupby() 分组统计

目录 1 用 numpy 快速求数组的各种统计量&#xff1a;mean, var, std 1.1 数据准备 1.2 直接用np的公式求解 1.3 注意问题 1.4 用print() 输出内容&#xff0c;显示效果 2 为了验证公式的背后的理解&#xff0c;下面是详细的展开公式的求法 2.1 均值mean的详细 2.2 方差…

Oracle 19C Data Guard 单实例1+1部署(Duplicate方式)

环境描述 项目主库备库操作系统CentOS 7.9CentOS 7.9数据库版本Oracle 19.3.0.0Oracle 19.3.0.0ORACLE_UNQNAMEhishisdgIP地址10.172.1.10110.172.1.102Hostnamehisdb01hisdb02SIDhishisdb_namehishisdb_unique_namehishisdg 说明 主库和备库建议采用相同服务器配置。主库和…

ubuntu20配置mysql注意事项

目录 一、mysql安装 二、初始化配置密码 三、配置文件的位置 四、常用的mysql命令 五、踩坑以及解决方法 一、mysql安装 1.更新apt源 sudo apt update 2.安装mysql服务 sudo apt-get install mysql-server 3.初始化配置 sudo mysql_secure_installation 4.配置项 VALI…

开展网络安全成熟度评估:业务分析师的工具和技术

想象一下,您坐在飞机驾驶舱内。起飞前,您需要确保所有系统(从发动机到导航工具)均正常运行。现在,将您的业务视为飞机,将网络安全视为飞行前必须检查的系统。就像飞行员依赖检查表一样,业务分析师使用网络安全成熟度评估来评估组织对网络威胁的准备程度。这些评估可帮助…

MySql(面试题理解B+树原理 实操加大白话)

数据的定位 通过磁道和扇区定位到数据的位置 扇区为512字节 黄色地方数据位置为2磁道3扇区 黑色地方数据位置为1磁道1扇区 通过磁道和扇区还有偏移量定位到数据的位置 比如这里有一张表 由id、name、no、address组成id为主键 列占有大小&#xff08;字节&#xff09; id int …

目标检测,图像分割,超分辨率重建

目标检测和图像分割 目标检测和图像分割是计算机视觉中的两个不同任务&#xff0c;它们的输出形式也有所不同。下面我将分别介绍这两个任务的输出。图像分割又可以分为&#xff1a;语义分割、实例分割、全景分割。 语义分割&#xff08;Semantic Segmentation&#xff09;&…

K8s内存溢出问题剖析:排查与解决方案

文章目录 一、背景二、排查方案&#xff1a;1. 可能是数据量超出了限制的大小&#xff0c;检查数据目录大小2. 查看是否是内存溢出2.1 排查数据量&#xff08;查看数据目录大小是否超过limit限制&#xff09;2.2 查看pod详情发现问题 三、解决过程 一、背景 做redis压测过程中…

python3 + selenium 中用PIL获取全屏幕截图

获取当前屏幕截图非常简单&#xff0c;需要import PIL.ImageGrab。调用grab函数即可得到Image对象&#xff0c;显示图片如图所示。 高版本的PIL中的grab函数还提供有一些参数。要查看当前PIL包的版本&#xff0c;可以import然后查看其__version__属性。 如果是较高版本的PIL…

openssl编译安装升级为新版本

文章目录 1、下载版本2、上传并解压3、编译安装4、验证 1、下载版本 https://www.openssl.org/source/old/1.1.1/ 2、上传并解压 tar zxvf openssl-1.1.1s.tar.gz 3、编译安装 注意&#xff1a;要提前安装好 gcc perl cd openssl-1.1.1s ./config --prefix/usr/local/open…

请求(request)

目录 前言 request概述 request的使用 获取前端传递的数据 实例 请求转发 特点 语法 实例 实例1 实例2 【关联实例1】 域对象 组成 作用范围&#xff1a; 生命周期&#xff1a; 使用场景&#xff1a; 使用步骤 存储数据对象 获得数据对象 移除域中的键值…

2039:【例5.6】冒泡排序

【题目描述】 编程输入n(1≤n≤20)个小于1000非负整数&#xff0c;然后自动按从大到小的顺序输出。&#xff08;冒泡排序&#xff09; 【输入】 第一行&#xff0c;数的个数n; 第二行&#xff0c;n个非负整数。 【输出】 由大到小的n个非负整数&#xff0c;每个数占一行。 【输…

离线安装 Docker-IO:详细步骤指南

离线安装 Docker-IO:详细步骤指南 一、准备工作1.1 下载 Docker 离线安装包1.2 准备安装环境1.3 配置防火墙和 SELinux(可选)二、上传和解压离线安装包2.1 上传安装包2.2 解压安装包三、安装 Docker-IO3.1 移动 Docker 文件到系统目录3.2 配置 Docker 服务3.3 赋予服务文件执…

python图像彩色数字化

效果展示&#xff1a; 目录结构&#xff1a; alphabets.py GENERAL {"simple": "%#*-:. ","complex": "$B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_~<>i!lI;:,\"^. " } # Full list could be found here…

.net core 创建linux服务,并实现服务的自我更新

目录 创建服务创建另一个服务&#xff0c;用于执行更新操作给你的用户配置一些systemctl命令权限 创建服务 /etc/systemd/system下新建服务配置文件&#xff1a;yourapp.service&#xff0c;内容如下&#xff1a; [Unit] Descriptionyourapp Afternetwork.target[Service] Ty…

TongWeb8 错误码查询方法及说明

TongWeb8可通 过 ./admin.[bat|sh] error-code [Error Code] 命令查 找错误码 说 明。 如&#xff1a;./admin.sh error-code 显示所有错误码说明。 ./admin.sh error-code 008 显示008错误码的说明。 Execute the command: error-code ****** TongWeb ErrorCode Info ***…