
面试题
文章平均质量分 68
小志的博客
随笔笔记,仅供参考
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Mysql——分库分表后id冲突解决方案(即分布式ID的生成方案)
分库分表后ID冲突问题及解决方案 摘要: 分库分表后自增ID会导致主键冲突,本文介绍了5种分布式ID生成方案: 设置自增步长:通过不同表设置不同起始值和步长避免冲突,但无法扩容; 数据库号段:维护号段表,预分配ID范围,但存在单点故障风险; UUID方式:简单易用但影响查询和插入性能; Redis生成:利用incr命令原子自增,需考虑持久化问题; 雪花算法:结合时间戳、节点ID和序列号生成唯一ID,性能优异但存在时间回拨问题。 每种方案都分析了原理、实现方式和优缺点,可根据业务场景选择合适的ID生成策略。原创 2025-08-18 22:46:50 · 1091 阅读 · 0 评论 -
Mysql——前模糊索引失效原因及解决方式
摘要:前模糊索引失效的解决方案 前模糊查询导致索引失效是因为B+树无法对不确定首字符进行有序检索。解决方法包括:1)建立反向索引,将字段值倒序存储,改用后模糊查询;2)限定查询时间范围缩小扫描量;3)使用索引覆盖避免回表;4)引入第三方搜索引擎。这些方案可有效提升模糊查询性能。原创 2025-08-18 22:10:19 · 279 阅读 · 0 评论 -
mysql——count(*)、count(1)和count(字段)谁更快?有什么区别?
本文探讨了MySQL中count()、count(1)和count(属性)的性能差异。通过示例表测试发现,count()和count(1)均统计总行数(包括NULL值),而count(属性)只统计非NULL值行数。MySQL官方文档证实count()和count(1)在功能与性能上完全一致,执行计划显示count()会被优化为count(0)。理论上count(*)略优,因无需SQL优化步骤,但实际性能差异极小。开发者可根据编码规范选择使用,无需过度关注性能差异。原创 2025-08-14 23:19:44 · 508 阅读 · 0 评论 -
MySql——聚簇索引(主键索引)和非聚簇索索引(非主键索引)引区别(即聚集索引和非聚集索引区别)
本文主要介绍了聚簇索引(主键索引)和非聚簇索引(非主键索引)的区别。聚簇索引将索引和数据存储在同一个B+树中,查询效率较高;而非聚簇索引需要先查询索引再回表获取数据,效率较低。在InnoDB引擎中,主键索引采用聚簇索引结构,数据和索引存储在同一个文件中;而MyISAM引擎则采用非聚簇索引结构,数据和索引分开存储,查询时需要进行回表操作。文章通过图解和存储引擎对比,详细说明了两种索引的结构特点和性能差异,为数据库索引选择提供了参考依据。原创 2025-08-14 22:23:58 · 1202 阅读 · 0 评论 -
MySql——binlog和redolog的区别
MySQL中的binlog和redolog虽然都记录数据修改,但二者功能不同。binlog是所有存储引擎共用的日志,记录所有操作日志,主要用于主从同步和数据恢复;redolog是InnoDB引擎特有的日志,用于事务数据恢复和BufferPool的崩溃恢复。两者不能互相替代,binlog针对磁盘数据恢复,redolog则确保事务完整性。原创 2025-08-14 21:39:25 · 184 阅读 · 0 评论 -
MySQL——binlog刷盘机制
MySQL的binlog日志提供三种刷盘策略,通过sync_binlog参数配置:0表示实时写入PageCache但延迟刷盘(性能最高但可能丢失数据);1表示每次事务提交都强制刷盘(最安全但性能低);2表示N次事务提交后刷盘(平衡方案)。MySQL 5.7.7前默认值为0,之后改为1。不同策略在数据安全性和性能间取得平衡,适用于不同业务场景。原创 2025-08-13 23:33:41 · 300 阅读 · 0 评论 -
Mysql——如何做到Redolog崩溃后恢复的
MySQL引擎层BufferPool工作原理:执行修改语句时,InnoDB首先检查BufferPool缓存,若无则从磁盘加载数据页到BufferPool,修改后成为脏页并记录UndoLog。提交时通过RedoLog保证崩溃恢复,其顺序写入特性比直接写磁盘更高效。InnoDB提供三种刷盘策略:0(延迟1秒写)、1(实时写最安全)、2(系统缓存写),默认采用策略1确保数据不丢失。RedoLog结合BufferPool机制实现了事务持久性和高性能的平衡。原创 2025-08-13 22:58:17 · 1170 阅读 · 0 评论 -
MySQL——MySQL引擎层BufferPool工作过程原理
MySQL引擎层BufferPool工作过程:执行修改语句时,首先检查BufferPool中是否存在目标数据,若不存在则从磁盘加载整个数据页到BufferPool。修改数据后,BufferPool形成脏页(与磁盘数据不一致),修改前的数据存入UndoLog用于回滚。提交事务时,脏页数据同步到磁盘文件,恢复为正常页。整个过程通过BufferPool减少磁盘I/O,提高性能。原创 2025-08-12 22:52:04 · 502 阅读 · 0 评论 -
MySql——B树和B+树区别(innoDB引擎为什么把B+树作为默认的数据结构)
本文对比分析了B树和B+树的异同点。二者共同特征是通过有序索引实现快速数据定位,且都遵循"左小右大"的存储原则,减少磁盘IO次数。主要区别在于:B树每个节点存储键值对,适合随机读写;B+树非叶节点仅存键指针,叶节点通过链表连接,存储密度更高,特别适合范围查询和顺序访问。实际应用中,B+树因其更优的查询效率和范围查询性能,成为数据库索引的优先选择。原创 2025-08-12 22:19:10 · 409 阅读 · 0 评论 -
Mysql——单表最多数据量多少需要分表
MySQL单表分表标准及B+树存储容量分析 阿里开发公约建议单表超过500万行或2GB时考虑分表。B+树的存储能力取决于页大小和行数据量,默认16KB的页可存储约16184字节有效数据。以一个包含5列的表为例,每行约100字节,单页可存161条记录。三层B+树理论上可存储约4.2亿条记录(100字节/行)。实际存储量会随行大小变化,如1KB/行时约4000万条。因此,单纯以行数判断是否分表并不准确,需结合数据容量综合评估。原创 2025-08-11 22:54:52 · 894 阅读 · 0 评论 -
Mysql——Sql的执行过程
SQL执行过程主要分为建立连接、服务层处理和引擎层操作三个阶段。首先客户端建立数据库连接并验证身份;随后服务层依次执行缓存查询(5.7后默认关闭)、语法解析、预处理、SQL优化(生成执行计划)等操作;最后引擎层通过缓冲池(BufferPool)查询数据,未命中则访问磁盘,并记录binlog/undolog等日志。整个过程涉及多个组件的协同工作,其中优化器会调整SQL以遵循索引规则(如最左前缀原则),提高查询效率。原创 2025-08-11 21:13:32 · 487 阅读 · 0 评论 -
分布式系统的唯一ID如何生成
目录一、雪花算法的提前二、雪花算法的概述三、雪花算法的代码实现1、雪花算法代码2、测试代码一、雪花算法的提前针对业务数据来说,通常都是需要唯一id的,比如学生的学号、订单的订单号,支付流水的流水号等等。采用最简单的方式,就是插入时候设置主键auto increment的自增方式。那么插入表中的数据都是唯一的,不过方案虽然简单,但是弊端确实很多。(1)、比如通过这种自增的方式,用户很容易就会通过遍历id的方式,获得库中的业务数据,并且如果采用了分库分表的方式,那么就无法通过主键自增的方式来控制原创 2021-12-11 16:08:32 · 626 阅读 · 0 评论 -
分库分表后数据如何迁移
目录一、分库分表后数据如何迁移概述二、停机停服数据迁移的概述三、双写数据迁移的概述一、分库分表后数据如何迁移概述针对单库表中的数据我们如何迁移到新的分库分表上,最先想到的方案应该就是发公告停机停服的数据迁移。二、停机停服数据迁移的概述比如我们已经准备好某一天要进行数据迁移了,那么我会们在当天发布公告,比如通告一下用户,凌晨12点到早上6点系统升级,服务暂不可用。到了凌晨12点,所有服务停机,并观察数据库中是否还有数据写入变更删除等操作,如果发现现在数据库中的数据已经静止了,那么一部分人负责升原创 2021-12-07 22:00:06 · 2116 阅读 · 0 评论 -
分库分表概述及方式
目录一、分库分表概述二、什么情况需要分库分表三、分库分表的方式1、垂直拆分2、水平拆分四、关于水平拆分的查询操作1、方案一:按时间段拆2、方案二:根据hash的方式一、分库分表概述分库分表就是对数据库进行拆分以一种方式或策略。但是在实际场景中,分库和分表并不是要一起出现的。有可能只是需要分表,有可能只是需要分库,如果在大流量高并发的情况下,会出现分库分表同时出现的情况。二、什么情况需要分库分表比如我们负责所业务线是全新的而且非常有潜质的,那么我们设计系统的时候,通常并不会上来就做分库分表的设计原创 2021-12-07 21:52:04 · 1377 阅读 · 0 评论 -
微服务为什么需要配置中心
目录一、配置的了解二、配置需要具备的特性二、配置中心是什么一、配置的了解在项目开发过程中,我们经常会把配置放到properties或yaml或xml文件中,或者放到数据库的配置表中,或者硬编码在代码中,再或者是放到配置中心中等等。二、配置需要具备的特性在应用程序的启动和运行中,再对这些配置进行解析和加载。那么,如果对这些不同场景下的不同配置进行总结的话,我们可以针对“配置”归纳出来一下几个主要的特性:A)、独立于程序的只读信息配置对于运行中的程序来说,应该是只读的,而不应该是程序可以原创 2021-11-23 22:11:44 · 944 阅读 · 0 评论 -
CGLIB与JDK动态代理
一、CGLIB和JDK动态代理的区别1、JDK动态代理利用拦截器(必须实现InvocationHandler)加上反射机制生成一个代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。2、Cglib动态代理利用ASM框架(ASM是一种通用Java字节码操作和分析框架,它可以用于修改现有的class文件或动态生成class文件),对代理对象类生成的class文件加载进来,通过修改其字节码生成子类来处理。二、什么时候用CGLIB什么时候用JDK动态代理目标对象实现接口,默原创 2021-11-20 21:00:00 · 574 阅读 · 0 评论 -
java中retry的用法
一、JUC包中线程池源码retry使用示例线程池ThreadPoolExecutor.execute(Runnable command)源码中,有retry的使用。如下所示:二、retry的用法示例1、代码示例public class TestRetry { public static void main(String[] args) { case1(); case2(); case3(); case4();原创 2021-10-27 20:47:48 · 4167 阅读 · 6 评论 -
java中引用级别的理解及代码示例
目录一、java中引用级别有哪些二、强引用三、软引用(java.lang.ref.SoftReferenct)四、弱引用(java.lang.ref.WeakReferenct)五、虚引用(java.lang.ref.PhantomReference)一、java中引用级别有哪些在Java中,引用级别一共有四种,分别为:强引用软引用弱引用虚引用二、强引用一般程序中的引用,例如 Student student = new Student();如果一个对象具有强引用,那就类似于必不可少的原创 2021-10-26 21:47:50 · 275 阅读 · 0 评论 -
java中isAssignableFrom()方法与instanceof关键字的区别
目录一、isAssignableFrom()方法与instanceof关键字的区别二、isAssignableFrom()方法与instanceof关键字的使用方法三、isAssignableFrom()方法与instanceof关键字具体示例一、isAssignableFrom()方法与instanceof关键字的区别isAssignableFrom()方法是从类继承的角度去判断。父类.class.isAssignableFrom(子类.class)instanceof关键字是从实例继承原创 2021-10-26 21:22:50 · 829 阅读 · 0 评论 -
Class对象的创建方式
一、创建Class对象有3种方式类名.class实例.getClass()Class.forName(“类的全路径”)二、创建Class对象有3种方式示例1、代码示例package com.xz.springboottest.day1;/** * @description: * @author: xz */public class Person { private String name; private int age; //getter、setter方式省略原创 2021-10-24 20:07:51 · 4979 阅读 · 0 评论 -
Forword和Redirect的区别
1、从数据共享上Forword是一个请求的延续,可以共享request的数据Redirect开启一个新的请求,不可以共享request的数据2、从地址栏上Forword转发地址栏不发生变化Redirect转发地址栏发生变化原创 2020-12-07 22:15:38 · 1540 阅读 · 0 评论 -
final、finally、finalize 三者区别
1、finalfinal是一个修饰符当final修饰一个变量的时候,变量变成一个常量,它不能被二次赋值当final修饰的变量为静态变量(即由static修饰)时,必须在声明这个变量的时候给它赋值当final修饰方法时,该方法不能被重写当final修饰类时,该类不能被继承final不能修饰抽象类,因为抽象类中会有需要子类实现的抽象方法,(抽象类中可以有抽象方法,也可以有普通方法,当一个抽象类中没有抽象方法时,这个抽象类也就没有了它存在的必要)final不能修饰接口,因为接口中有需要其实现类来实原创 2020-12-07 22:14:54 · 321 阅读 · 2 评论 -
Ajax的理解
一、AJAX 全称异步JavaScript及 XML(Asynchronous JavaScript And XML)二、Ajax的核心是JavaScript对象XmlHttpRequest(XHR)三、Ajax的优点提高用户体验度(UE)提高应用程序的性能进行局部刷新1、AJAX不是一种新的编程语言,而是一种用于创建更好更快以及交互性更强的 Web 应用程序的技术。2、通过 AJAX,我们的 JavaScript 可使用JavaScript的XMLHttpRequest对象来转载 2020-12-03 22:05:05 · 433 阅读 · 0 评论 -
Get和Post的区别
一、Get和Post的区别get是从服务器上获取数据,post是向服务器传送数据。get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。get安全性非常低,post安全性较高。但是执行效率却比Post方法好。在进行文件上传时只能使用post而不能是get。二、原文链接https://mp.weixin.qq.com/s/Lqa1mn5PtFQM669atlYhBw...转载 2020-12-03 22:03:32 · 156 阅读 · 0 评论 -
String、StringBuffer、StringBuilder 区别
一、特征区别String:字符串常量、不可变、使用字符串拼接时是不同的2个空间StringBuffer:字符串变量、可变、线程安全、字符串拼接直接在字符串后追加StringBuilder:字符串变量 、可变、非线程安全、字符串拼接直接在字符串后追加二、应用场景区别StringBuilder执行效率高于StringBuffer高于StringString是一个常量,是不可变的,所以对于每一次赋值都会创建一个新的对象StringBuffer和StringBuilder都是可变的,当进行字符串转载 2020-12-03 22:02:38 · 221 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第十六模块答案
Zookeeper157. zookeeper 是什么?zookeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 google chubby 的开源实现,是 hadoop 和 hbase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。158. zookeeper 都有哪些功能?集群管理:监控节点存活状态、运行...转载 2019-04-12 14:32:38 · 838 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第三模块答案
多线程35. 并行和并发有什么区别?并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群。所以并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。36. 线程和进程的区别?简而言之,进...转载 2019-04-02 22:51:53 · 881 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第二模块答案
容器18. java 容器都有哪些?常用容器的图录:19. Collection 和 Collections 有什么区别?java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其...转载 2019-04-02 22:35:37 · 925 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第一模块答案
目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态;第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多新的框架,比如 Spring Boot、Spring Cloud 等,但类似的面试题却极少。相比与这些问题,我的这 208 道面试题具备以下优点:披沙拣金提炼出每个 Java 模块中最经典的面试题...转载 2019-04-02 22:26:22 · 1113 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第十二模块答案
Hibernate113. 为什么要使用 hibernate?对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性...转载 2019-04-03 23:17:25 · 1150 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第十一模块答案
Spring Boot / Spring Cloud104. 什么是 spring boot?在Spring框架这个大家族中,产生了很多衍生框架,比如 Spring、SpringMvc框架等,Spring的核心内容在于控制反转(IOC)和依赖注入(DI),所谓控制反转并非是一种技术,而是一种思想,在操作方面是指在spring配置文件中创建,依赖注入即为由spring容器为应用程序的某个对象提供...转载 2019-04-03 23:10:48 · 1215 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第十模块答案
Spring / Spring MVC90. 为什么要使用 spring?1.简介目的:解决企业应用开发的复杂性功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能范围:任何Java应用简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。2.轻量从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小...转载 2019-04-03 23:03:23 · 1287 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第九模块
设计模式88. 说一下你熟悉的设计模式?参考:https://blog.youkuaiyun.com/li1325169021/article/category/865522889. 简单工厂和抽象工厂有什么区别?这个模式本身很简单而且使用在业务较简单的情况下。一般用于小项目或者具体产品很少扩展的情况(这样工厂类才不用经常更改)。它由三种角色组成:厂类角色:这是本模式的核心,含有一定的商业逻辑和...转载 2019-04-03 22:48:22 · 700 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第十三模块答案
Mybatis125. mybatis 中 #{}和 ${}的区别是什么?#{}是预编译处理,${}是字符串替换;Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;Mybatis在处理${}时,就是把${}替换成变量的值;使用#{}可以有效的防止SQL注入,提高系统安全性。126. mybatis 有几种分页...转载 2019-04-12 14:39:40 · 1071 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第十七模块答案
MySql164. 数据库的三范式是什么?第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。第三范式:任何非主属性不依赖于其它非主属性。165. 一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是...转载 2019-04-12 14:55:27 · 978 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第十九模块答案
JVM194.说一下 jvm 的主要组成部分?及其作用?类加载器(ClassLoader)运行时数据区(Runtime Data Area)执行引擎(Execution Engine)本地库接口(Native Interface)组件的作用: 首先通过类加载器(ClassLoader)会把 Java 代码转换成字节码,运行时数据区(Runtime Data Area)再把字节码加载...转载 2019-04-15 13:37:21 · 1112 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第七模块答案
异常74. throw 和 throws 的区别?throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型。75. final、finally、finalize 有什么区别?final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表...转载 2019-04-03 20:17:23 · 925 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第十八模块答案
Redis179. redis 是什么?都有哪些使用场景?Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。Redis 使用场景:数据高并发的读写海量数据的读写对扩展性要求高的数据180. redis 有哪些功能?数据缓存功能分布式锁的功能支持数据持久化支持事务支持消息队列18...转载 2019-04-15 12:39:50 · 1059 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第六模块答案
Java Web64. jsp 和 servlet 有什么区别?jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRe...转载 2019-04-03 20:10:22 · 606 阅读 · 0 评论 -
Java 最常见的 208 道面试题:第五模块答案
对象拷贝61. 为什么要使用克隆?想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。62. 如何实现对象克隆?有两种方式:实现Cloneable接口并重写Object类中的clone()方法;实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下:import java.io...转载 2019-04-03 19:56:39 · 625 阅读 · 0 评论