- 博客(801)
- 收藏
- 关注
原创 Java-分布式面试大全(2025最新整理版)
分布式事务是相对本地事务而言的,对于本地事务,利用数据库本身的事务机制,就可以保证事务的ACID特性。ACID而在分布式环境下,会涉及到多个数据库。多数据库分布式事务其实就是将对同一库事务的概念扩大到了对多个库的事务。目的是为了保证分布式系统中的数据一致性。分布式事务处理的关键是:需要记录事务在任何节点所做的所有动作;事务进行的所有操作要么全部提交,要么全部回滚。什么是幂等性?同一个接口,多次发出同一个请求,请求的结果是一致的。简单说,就是多次调用如一次。什么是幂等性问题?
2025-10-23 21:47:16
481
原创 SpringBoot:一个注解就能帮你下载任意对象!
下载功能应该是比较常见的功能了,虽然一个项目里面可能出现的不多,但是基本上每个项目都会有,而且有些下载功能其实还是比较繁杂的,倒不是难,而是麻烦。如果我说现在只需要一个注解就能帮你下载任意的对象,是不是觉得非常的方便感觉差别不大?那就听听我遇到的一个下载需求我们有一个平台是管理设备的,然后每个设备都会有一个二维码图片,用一个字段存储的 http 地址现在需要导出所有设备二维码图片的压缩包,图片名称需要用设备名称加 .png 后缀,需求上来说并不难,但是着实有点麻烦首先我需要将设备列表查出来。
2025-10-23 21:41:25
527
原创 Redis 分布式锁原理看这篇就够了, 循循渐进!
分布式锁相信大家一定不会陌生, 想要用好或者自己写一个却没那么简单想要达到上述的条件, 一定要掌握分布式锁的应用场景, 以及分布式锁的不同实现, 不同实现之间有什么区别。
2025-10-23 21:40:10
730
原创 Java面试官:缓存一致性问题怎么解决?
我们以先更新数据库,再删除缓存来举例。如果是更新的话,那就是先更新数据库,再更新缓存。举个例子:如果数据库1小时内更新了1000次,那么缓存也要更新1000次,但是这个缓存可能在1小时内只被读取了1次,那么这1000次的更新有必要吗?反过来,如果是删除的话,就算数据库更新了1000次,那么也只是做了1次缓存删除,只有当缓存真正被读取的时候才去数据库加载。首先,我们要明确一点,缓存不是更新,而应该是删除。删除缓存有两种方式:先删除缓存,再更新数据库。解决方案是使用延迟双删。
2025-10-23 21:37:56
513
原创 一个订单 30 分钟未支付自动取消功能,有 5 种实现方案?
该方案使用 Redis 的 Keyspace Notifications,中文翻译就是键空间机制,就是利用该机制可以在 key 失效之后,提供一个回调,实际上是 Redis 会给客户端发送一个消息。该方案是利用 JDK 自带的 DelayQueue 来实现,这是一个无界阻塞队列,该队列只有在延迟期满的时候才能从中获取元素,放入 DelayQueue 中的对象,是必须实现 Delayed 接口的。take(): 获取并移除队列的超时元素,如果没有则 wait 当前线程,直到有元素满足超时条件,返回结果。
2025-10-22 21:53:38
788
原创 Spring面试大全(依赖注入(Ioc)、 Beans、注解、 数据访问、AOP、 MVC)!
Spring 是一个开源应用框架,旨在降低应用程序开发的复杂度。它是轻量级、松散耦合的。它具有分层体系结构,允许用户选择组件,同时还为 J2EE 应用程序开发提供了一个有凝聚力的框架。它可以集成其他框架,如 Structs、Hibernate、EJB 等,所以又称为框架的框架。Spring 配置文件是 XML 文件。该文件主要包含类信息。它描述了这些类是如何配置以及相互引入的。但是,XML 配置文件冗长且更加干净。如果没有正确规划和编写,那么在大项目中管理变得非常困难。
2025-10-21 16:27:08
1490
原创 Java面试题:JDK的运行时常量池、字符串常量池、静态常量池,还傻傻分不清?
本篇核心:JDK各个版本中JDK的运行时常量池、字符串常量池、静态常量池的功能及存储位置。在写本系列文章时,发现一旦追究起底层实现都会涉及到一些内存结构的问题。其中涉及比较多的便是常量池,本篇文章汇总一下JDK的运行时常量池、字符串常量池、静态常量池的功能及存储结构。
2025-10-21 16:20:15
590
原创 深度解读 Java 线程池设计思想及源码实现!
AbstractExecutorService 抽象类派生自 ExecutorService 接口,然后在其基础上实现了几个实用的方法,这些方法提供给子类进行调用。这个抽象类实现了 invokeAny 方法和 invokeAll 方法,这里的两个 newTaskFor 方法也比较有用,用于将任务包装成 FutureTask。定义于最上层接口 Executor中的由于不需要获取结果,不会进行 FutureTask 的包装。
2025-10-21 16:18:45
990
原创 Java面试题:重写了equals方法,为什么还要重写hashCode方法?
这不仅仅是一道面试题,而且是关系到我们的代码是否健壮和正确的问题。在前面两篇文章涉及到了equals方法的底层讲解:《说说==和equals的区别?你的回答可能是错误的》和《Integer等号判断的内幕,你可能不知道?本篇文章,带大家从底层来分析一下hashcode方法重写的意义以及如何实现。
2025-10-21 16:16:20
911
原创 Java:由浅入深揭开 AOP 实现原理!
相信大家或多或少的了解过AOP,都知道它是面向切面编程,在网上搜索可以找到很多的解释。这里我用一句话来总结:AOP是能够让我们在不影响原有功能的前提下,为软件横向扩展功能。那么横向扩展怎么理解呢,我们在WEB项目开发中,通常都遵守三层原则,包括控制层(Controller)->业务层(Service)->数据层(dao),那么从这个结构下来的为纵向,它具体的某一层就是我们所说的横向。我们的AOP就是可以作用于这某一个横向模块当中的所有方法。
2025-10-21 16:12:48
233
原创 面试官:什么是 Next-Key Lock?作用是什么?
Next-Key Lock 是 InnoDB 引擎行锁加间隙锁的组合,它锁住的是一个前开后闭的区间,消除了 REPEATABLE READ 隔离级别下的幻读问题。理解 Next-Key Lock 要把握两点:可重复隔离级别下才会生效;锁住一个前开后闭的区间,但一定条件下可能退化成行锁或者间隙锁。
2025-10-20 11:30:00
898
原创 传统 Spring MVC 项目 集成 Prometheus?
Prometheus提供了4中不同的Metrics类型:Counter, Gauge, Histogram, Summary。Counter - 只增不减的计数器Gauge - 可增可减的仪表盘Histogram - 自带buckets区间用于统计分布统计图Summary - 客户端定义的数据分布统计图至于怎么使用,官方doc中详细的说明,这里简单举两个例子:@Override@Override。
2025-10-19 15:58:28
349
原创 延时消息常见实现方案?
延时消息(定时消息)指的在分布式异步消息场景下,生产端发送一条消息,希望在指定延时或者指定时间点被消费端消费到,而不是立刻被消费。延时消息适用的业务场景非常的广泛,在分布式系统环境下,延时消息的功能一般会在下沉到中间件层,通常是 MQ 中内置这个功能或者内聚成一个公共基础服务。本文旨在探讨常见延时消息的实现方案以及方案设计的优缺点。
2025-10-19 15:52:31
290
原创 Spring Bean 生命周期 (实例结合源码彻底讲透)
本篇文章主要是要介绍如何在Spring IoC 容器中 如何管理Spring Bean生命周期。在应用开发中,常常需要执行一些特定的初始化工作,这些工作都是相对比较固定的,比如建立数据库连接,打开网络连接等,同时,在结束服务时,也有一些相对固定的销毁工作需要执行。为了便于这些工作的设计,Spring IoC容器提供了相关的功能,可以让应用定制Bean的初始化和销毁过程。
2025-10-19 15:51:27
1076
原创 万字长文,带你从源码认识Spring事务原理,让Spring事务不再是面试噩梦!
业务系统的数据,一般最后都会落入到数据库中,例如MySQLOracle等主流数据库,不可避免的,在数据更新时,有可能会遇到错误,这时需要将之前的数据更新操作撤回,避免错误数据。Spring的声明式事务能帮我们处理回滚操作,让我们不需要去关注数据库底层的事务操作,可以不用在出现异常情况下,在 try / catch / finaly 中手写回滚操作。Spring的事务保证程度比行业中其它技术(例如TCC2PC3PC等)稍弱一些,但使用Spring。
2025-10-19 15:49:37
873
原创 面试官:Spring使用了哪些设计模式?
实际上,Spring中使用到的设计模式在源码中随处可见,并不止我列举的这些,所以Spring的源码非常值得去阅读和学习,受益良多。工厂模式在Spring中的应用非常广泛,这里举的例子是ApplicationContext和BeanFactory,这也是Spring的IOC容器的基础。适配器在Spring中是怎么把通知类和拦截类进行转换的呢,我们先看适配器的接口。Spring AOP主要是基于动态代理实现的,如果要代理的类,实现了某个接口,则使用JDK动态代理,如果没有实现接口则使用Cglib动态代理。
2025-10-19 15:47:17
248
原创 SpringBoot怎么用之原理分析与配置?
YML文件格式是YAML (YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP等。YML文件是以数据为核心的,比传统的xml方式更加简洁。YML文件的扩展名可以使用.yml或者.yaml。
2025-10-17 11:30:00
1970
原创 SpringBoot怎么用之简介与快速入门?
Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。
2025-10-17 10:30:00
798
原创 架构设计流程:架构到底是指什么?
其实,“组件”的英文 component 也可翻译成中文的“零件”一词,“零件”更容易理解一些,“零件”是一个物理的概念,并且具备“独立且可替换”的特点。例如,“我们的系统是 MVC 架构”“我们需要将 android app 重构为 MVP 架构”“我们的系统基于 SSH 框架开发”“我们是 SSH 的架构”“XX 系统是基于 Spring MVC 框架开发,标准的 MVC 架构”……单纯从定义的角度来看,框架和架构的区别还是比较明显的,框架关注的是“规范”,架构关注的是“结构”。
2025-10-17 09:30:00
322
原创 聊一聊中台和DDD(领域驱动设计)
领域,名词解释是“领域是从事一种专门活动或事业的范围、部类或部门”,在DDD中领域就是用来确定范围的,范围即边界。在研究和解决业务问题时,DDD会按照一定的规则对业务领域进行细分,当领域细分到一定的程度后,DDD会将问题范围限定在特定的边界内,在这个边界内建立领域模型,进而用代码实现该领域模型,解决响应的业务问题。简而言之,DDD的领域就是这个边界内要解决的业务问题域。子域,既然领域是用来限定业务边界和范围的,那么就会有大小之分,领域越大,业务边界的范围就越大,泛指则相反。领域可以进一步划分为子领域。
2025-10-17 08:30:00
1866
原创 Java进阶【二十七】Service Mesh初体验
⽬前,微服务的架构⽅式在企业中得到了极⼤的发展,主要原因是其解决了传统的单体架构中存在的问题。当单体架构拆分成微服务架构就可以⾼枕⽆忧了吗?显然不是的。微服务架构体系中同样也存在很多的挑战, ⽐如:原来的单个应⽤拆分成了许多分散的微服务,它们之间相互调⽤才能完成⼀个任务,而⼀旦某个过程出错(组件越多,出错的概率也就越⼤),就⾮常难以排查。 如果⽤户请求的响应太慢,我们就需要知道到底哪些地⽅⽐较慢?整个链路的调⽤各阶段耗时是多少?哪些调⽤是并发执⾏的,哪些是串⾏的?
2025-10-17 07:30:00
1024
原创 Java进阶【二十六】将近2万字的Dubbo原理解析,彻底搞懂dubbo (下)
从注册中心发现引用服务:在有注册中心,通过注册中心发现提供者地址的情况下,ReferenceConfig 解析出的URL 格式为: registry://registryhost:/org.apache.registry.RegistryService?通过URL 的registry://协议头识别,就会调用RegistryProtocol#refer()方法查询提供者URL,如 dubbo://service-host/com.foo.FooService?
2025-10-16 19:49:57
1014
原创 Java进阶【二十五】将近2万字的Dubbo原理解析,彻底搞懂dubbo (上)
前面我们研究了RPC的原理,市面上有很多基于RPC思想实现的框架,比如有Dubbo。今天就从Dubbo的SPI机制、服务注册与发现源码及网络通信过程去深入剖析下Dubbo。Dubbo是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的RPC 实现服务的输出和输入功能,可以和Spring框架无缝集成。Dubbo是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。服务容器负责启动,加载,运行服务提供者。
2025-10-16 19:48:49
782
原创 Java进阶【二十四】数据库原理研究与优化前言
在一个大数据量的系统中,这些数据的存储、处理、搜索是一个非常棘手的问题。比如存储问题:单台服务器的存储能力及数据处理能力都是有限的, 因此需要增加服务器, 搭建集群来存储海量数据。读写性能问题:单台数据库服务器的数据存储和数据处理能力都是有限的, 而大多数互联网业务,往往读多写少,而互联网特别是中大型的电商系统,业务都是非常繁忙的, 这个时候最容易出现的就是读性能瓶颈。扩容问题:随着时间的推移,原有的集群中的机器不能够存储这么多的数据量时,这个时候我们就需要考虑扩容。
2025-10-16 19:45:17
679
原创 Java进阶专题【二十三】分布式锁实现业务幂等
现如今很多系统都会基于分布式或微服务思想完成对系统的架构设计。那么在这一个系统中,就会存在若干个微服务,而且服务间也会产生相互通信调用。那么既然产生了服务调用,就必然会存在服务调用延迟或失败的问题。当出现这种问题,服务端会进行重试等操作或客户端有可能会进行多次点击提交。如果这样请求多次的话,那最终处理的数据结果就一定要保证统一,如支付场景。此时就需要通过保证业务幂等性方案来完成。 幂等本身是一个数学概念。即 f(n) = 1^n ,无论n为多少,f(n)的值永远为1。
2025-10-16 19:43:20
832
原创 Java进阶【二十二】RPC深入原理
什么是RPC?它的原理是什么?它有什么特点?如果让你实现一个RPC框架,你会如何是实现?带着这些问题,开始今天的学习。RPC是远程过程调用(Remote Procedure Call)。RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。为实现该目标,RPC 框架需提供一种透明调用机制,让使用者不必显式的区分本地调用和远程调用。系统内核处理 IO 操作分为两个阶段:等待数据和拷贝数据。
2025-10-16 19:39:25
895
原创 Java进阶(二十一) 微服务架构体系-SpringCloudAlibaba
"微服务”一词源于 Martin Fowler的名为 Microservices的,博文,可以在他的官方博客上找到http:/ /martinfowler . com/articles/microservices.html简单地说,微服务是系统架构上的一种设计风格,它的主旨是将一个原本独立的系统拆分成多个小型服务,这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的 RESTfuL AP进行通信协作。
2025-06-15 21:57:12
1193
5
原创 Java进阶(二十) 消息中间件架构体系(3)-- Kafka研究
Kafka 是一款分布式消息发布和订阅系统,具有高性能、高吞吐量的特点而被广泛应用与大数据传输场景。它是由 LinkedIn 公司开发,使用 Scala 语言编写,之后成为 Apache 基金会的一个顶级项目。kafka 提供了类似 JMS 的特性,但是在设计和实现上是完全不同的,而且他也不是 JMS 规范的实现。kafka 作为一个消息系统,早起设计的目的是用作 LinkedIn 的活动流(Activity Stream)和运营数据处理管道(Pipeline)。
2025-06-15 21:55:45
838
原创 Java进阶【十九】消息中间件架构体系(2)-- RabbitMQ研究
接上文,这个继续介绍RabbitMQ,并理解其底层原理。RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message Queue 高级消息队列协议)协议实现的消息队列。为什么使用RabbitMQ呢?1、使得简单,功能强大。2、基于AMQP协议。3、社区活跃,文档完善。4、高并发性能好,这主要得益于Erlang语言。5、Spring Boot默认已集成RabbitMQ。
2025-06-15 21:54:06
1140
原创 Java进阶【十八】消息中间件架构体系(1)-- ActiveMQ研究
ActiveMQ 是完全基于 JMS 规范实现的一个消息中间件产品。是 Apache 开源基金会研发的消息中间件。ActiveMQ主要应用在分布式系统架构中,帮助构建高可用、 高性能、可伸缩的企业级面向消息服务的系统。Java 消息服务(Java Message Service)是 java 平台中关于面向消息中间件的 API,用于在两个应用程序之间,或者分布式系统中发送消息,进行异步通信。
2025-06-15 21:52:49
859
原创 Java进阶【十七】系统缓存架构设计 (下)
上章节介绍了Redis相关知识,了解了Redis的高可用,高性能的原因。很多人认为提到缓存,就局限于Redis,其实缓存的应用不仅仅在于Redis的使用,比如还有Nginx缓存,缓存队列等等。这章节我们会将讲解Nginx+Lua实现多级缓存方法,来解决高并发访问的场景。
2025-06-15 21:51:31
1004
原创 Java进阶【十七】系统缓存架构设计 (下)
上章节介绍了Redis相关知识,了解了Redis的高可用,高性能的原因。很多人认为提到缓存,就局限于Redis,其实缓存的应用不仅仅在于Redis的使用,比如还有Nginx缓存,缓存队列等等。这章节我们会将讲解Nginx+Lua实现多级缓存方法,来解决高并发访问的场景。
2025-06-13 21:53:50
929
原创 Java进阶【十六】系统缓存架构设计 (上)
我们将先从Redis、Nginx+Lua等技术点出发,了解缓存应用的场景。通过使用缓存相关技术,解决高并发的业务场景案例,来深入理解一套成熟的企业级缓存架构如何设计的。本文Redis部分总结于蒋德钧老师的《Redis核心技术与实战》。Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
2025-06-13 21:52:42
1009
原创 Java进阶【十五】数据结构与算法的应用
学习算法,我们不需要死记硬背那些冗长复杂的背景知识、底层原理、指令语法……需要做的是领悟算法思想、理解算法对内存空间和性能的影响,以及开动脑筋去寻求解决问题的最佳方案。相比编程领域的其他技术,算法更纯粹,更接近数学,也更具有趣味性。 本文将回顾数据结构与算法的基础知识,学习日常所接触场景中的一些算法和策略,以及这些算法的原理和他背后的思想,最后会动手写代码,用java里的数据结构来实现这些算法,如何去做? 本文基本知识概念有借鉴《漫画算法-小灰的算法之旅》相关篇幅与图片。1)概述。
2025-06-13 21:50:59
757
原创 Java进阶【十四】从电商系统角度研究多线程(上)
本章节继上章节继续梳理:线程相关的基础理论和工具、多线程程序下的性能调优和电商场景下多线程的使用。put过程:1.根据key的hash值定位到桶位置2.如果table为空if,先初始化table。3.如果table当前桶里没有node,cas添加元素。成功则跳出循环,失败则进入下一轮for循环。4.判断是否有其他线程在扩容,有则帮忙扩容,扩容完成再添加元素。5.如果桶的位置不为空,遍历该桶的链表或者红黑树,若key已存在,则覆盖,不存在则将key插入到链表或红黑树的尾部。
2025-06-13 21:49:28
878
原创 Java进阶【十三】从电商系统角度研究多线程(上)
本章节主要分享下,多线程并发在电商系统下的应用。主要从以下几个方面深入:线程相关的基础理论和工具、多线程程序下的性能调优和电商场景下多线程的使用。
2025-06-13 21:46:37
554
原创 Java进阶【十二】 探究JMM
多线程下,共享变量的读写顺序是头等大事,内存模型就是多线程下对共享变量的一组读写规则共享变量值是否在线程间同步代码可能的执行顺序需要关注的操作就有两种Load、StoreLoad 就是从缓存读取到寄存器中,如果一级缓存中没有,就会层层读取二级、三级缓存,最后才是MemoryStore 就是从寄存器运算结果写入缓存,不会直接写入Memory,当Cache line 将被eject 时,会writeback 到MemoryJMM 是研究的是。
2025-06-09 21:34:05
964
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅