- 博客(389)
- 收藏
- 关注
原创 RocketMQ 11种消息类型,你知道几种?
RocketMQ事务消息的实现主要是先将消息存到这个中间Topic,有些资料会把这个消息称为半消息(half消息),这是因为这个消息不能被消费之后会执行本地的事务,提交本地事务的执行状态RocketMQ会根据事务的执行状态去判断commit或者是rollback消息,也就是是不是可以让消费者消费这条消息的意思在一些异常情况下,生产者无法及时正确提交事务执行状态RocketMQ会向生产者发送消息,让生产者去检查本地的事务,之后再提交事务状态。
2025-10-22 21:50:53
830
原创 SQL 优化经历:从 30248.271s 到 0.001s!
将会更高,从另外一个角度看,该表的数据是300w,以后会更多,就索引存储而言,都是不小的数目,随着数据量的增加,索引就不能全部加载到内存,而是要从磁盘去读取,这样索引的个数越多,读磁盘的开销就越大,因此根据具体。发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。快了3w多倍,大大缩短了查询时间,看来索引能极大程度的提高查询效率,建索引很有必要,很多时候都忘记建。的结果是897,即这两个字段联合起来的区分度是比较高的,因此建立联合索引查询效率。
2025-10-22 21:48:02
911
原创 你管这破玩意叫 B+ 树?
看完本文相信大家能明白索引的由来了,此外对页以及磁盘预读对性能的提升应该也有不少了解,其实 MySQL 的页结构与我们推演的结构有些许出入,不过不影响整体的理解,如果大家有兴趣深入了解 MySQL 的页结构,强烈建议大家看看文末的<MySQL是怎样运行的>这本书,讲解得非常细致.
2025-10-22 21:47:08
351
原创 Java面试官:请说说 Redis 九种数据类型和应用场景?
String 是最基本的 key-value 结构,key 是唯一标识,value 是具体的值,value其实不仅是字符串, 也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是512M。List 列表是简单的字符串列表,按照插入顺序排序,可以从头部或尾部向 List 列表添加元素。列表的最大长度为2^32 - 1,也即每个列表支持超过40 亿个元素。。Hash 特别适合用于存储对象。Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。
2025-10-22 21:42:32
1010
原创 高并发系统设计的15个建议!
在计算机网络中,限流就是控制网络接口发送或接收请求的速率,它可防止DoS攻击和限制Web爬虫。限流,也称流量控制。是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。可以使用。
2025-10-22 21:33:43
608
原创 Java面试必备:Java线程池解析!
掌握线程池是后端程序员的基本要求,相信大家求职面试过程中,几乎都会被问到有关于线程池的问题。我在网上搜集了几道经典的线程池面试题,并以此为切入点,谈谈我对线程池的理解。如果有哪里理解不正确,非常希望大家指出,接下来大家一起分析学习吧。
2025-10-22 21:32:25
992
原创 大厂是如何防止订单重复支付的?三分钟彻底搞懂!
如图是一个简化的下单流程,首先是提交订单,然后是支付。支付的话,一般是走支付网关(支付中心),然后支付中心与第三方支付渠道(微信、支付宝、银联)交互。支付成功以后,异步通知支付中心,支付中心更新自身支付订单状态,再通知业务应用,各业务再更新各自订单状态。这个过程中经常可能遇到的问题是掉单,无论是超时未收到回调通知也好,还是程序自身报错也好。总之由于各种各样的原因,没有如期收到通知并正确的处理后续逻辑等等,都会造成用户支付成功了,但是服务端这边订单状态没更新。
2025-10-22 21:30:19
293
原创 再有人问你 Java 内存模型是什么,就把这篇文章发给他
前面提到的,缓存一致性问题、处理器器优化的指令重排问题是硬件的不断升级导致的。那么,有没有什么机制可以很好的解决上面的这些问题呢?最简单直接的做法就是废除处理器和处理器的优化技术、废除CPU缓存,让CPU直接和主存交互。但是,这么做虽然可以保证多线程下的并发问题。但是,这就有点因噎废食了。所以,为了保证并发编程中可以满足原子性、可见性及有序性。有一个重要的概念,那就是——内存模型。
2025-10-21 16:11:00
295
原创 Spring 最常用的 7 大类注解,史上最强整理!
此注解使用在Spring的组件类上。此注解也可以使用在被@Configuration注解的类上,表示其中所有被@Bean注解的方法都会延迟初始化。当此注解用在Class上时,就创造了一个基础url,其所有的方法上的@RequestMapping都是在此url之上的。此注解使用在Class上,声明测试使用的配置文件,此外,也可以指定加载上下文的类。此注解用在请求handler方法的参数上,用于将web请求中的属性(request attributes,是服务器放入的属性值)绑定到方法参数上。
2025-10-21 16:09:58
410
原创 Java对象不再使用时,为什么要赋值为 null ?
鉴于网上有太多关于此问题的误导,本文将通过实例,深入JVM剖析“对象不再使用时赋值为null”这一操作存在的意义,供君参考。本文尽量不使用专业术语,但仍需要你对JVM有一些概念。
2025-10-21 16:09:10
383
原创 Java面试题:Integer等号判断的内幕,你可能不知道?
面试过程中关于Integer的比较“==”的问题内容层出不穷,但无论怎么变化,只要了解了其中的底层原理,马上就可以得出答案,再也不用死记硬背考题了。《Java开发手册》中有这样一项强制要求:“所有整形包装类对象之间值的比较,全部使用equals方法比较。说明:对于Integer var=?
2025-10-21 16:03:42
932
原创 Java面试题:new String()创建几个对象?有你不知道的
图中两个String对象的value值的引用均为{char[3]@1355},也就是说,虽然是两个对象,但它们的value值均指向常量池中的同一个地址。按照上面的分析,如果s1+s2的结果在常量池中存了一份,那么s3中的value引用应该和s4中value的引用是一样的才对。当然,如果检索常量池时发现已经存在了对应的字符串,那么只会在堆内创建一个新的String对象,此过程只创建了1个对象。也就是说,String对象的value值直接指向了一个已经存在的数组,而并没有指向常量池中的字符串。
2025-10-21 15:55:14
796
原创 Java面试题:说说==和equals的区别?你的回答可能是错误的
String除了通过new的形式进行定义,还可以通过等号赋值的形式:代码语言:javascript代码运行次数:0运行AI代码解释String str = "程序新视界";这是一种非常特殊的形式,不需要new就可以产生对象,和new有本质的区别。这种形式的赋值在java中叫直接量,它是存在于常量池中,而不是像new一样存放在堆中。当声明这样一个字符串时,JVM会在常量池中先查找有没有对应值的对象。如果有,把它赋给当前引用,即原来的引用和现在的引用指向了同一对象。
2025-10-21 15:37:12
785
原创 你有被代理过吗?讲讲开源框架都在用的代理模式
客户端生成一个代理对象实例,通过代理对象调用目标对象方法的时候,就会进入invoke()方法,最后是通过反射的方式调用目标对象的方法。动态代理工厂:ProxyFactory,这里的动态代理工厂,不需要实现接口,直接采用反射的方式生成一个目标对象的代理对象实例。用户找到客服,提出问题,客服又找到开发同学,让开发同学去解决问题,开发同学解决完,最后反馈给客服,客服再反馈到用户。我们也观察到,JDK动态代理,目标对象必须得实现接口,也就是说它是面向接口的,假如我们不想要接口怎么办呢?——确切说是动态代理呢?
2025-10-20 21:45:41
979
原创 Java面渣逆袭:图详计算机网络六十二问(建议收藏)!
为什么不能是两次?为了防止服务器端开启一些无用的连接增加服务器开销防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。由于网络传输是有延时的(要通过网络光纤和各种中间代理服务器),在传输的过程中,比如客户端发起了 SYN=1 的第一次握手。如果服务器端就直接创建了这个连接并返回包含 SYN、ACK 和 Seq 等内容的数据包给客户端,这个数据包因为网络传输的原因丢失了,丢失之后客户端就一直没有接收到服务器返回的数据包。
2025-10-20 21:42:45
564
原创 MySQL单表为何别超2000万行?揭秘B+树与16KB页的生死博弈!
因此,在设计表结构时,需要根据索引列的数据类型和字符集等因素,合理设置索引长度,以充分利用索引的优势。需要注意的是,不同的排序方式可能会对性能产生影响,因此需要根据具体需求选择合适的排序方式,并进行必要的测试和验证。需要注意的是,如果对长字符串进行排序,可能会影响索引查询的性能,因此可以考虑使用前缀索引或全文索引来优化。B树将行数据都存在非叶子节点上,假设每个数据页还是16kb,掐头去尾每页剩15kb,并且一条数据表行数据还是占1kb,就算不考虑各种页指针的情况下,也只能放个15条数据。
2025-10-20 11:30:00
1168
原创 如何设计一个企业级消息推送系统架构?
我们将整个平台系统拆解为:消息融合接收服务,消息处理分发服务,消息模版服务,渠道发送服务,后台管理服务等多个关键服务模块,全面覆盖从请求接入到消息推送、再到后续分析的全流程。为了解决这样的问题,设计一个统一的企业级消息推送系统就变得至关重要,本文是腾讯云架构师技术同盟系列策划文集的新文章,带你手把手设计一个从混乱到统一的企业级消息推送系统架构。比如收到订单系统「订单支付成功」的推送请求,会先匹配「支付通知」模板,确定接收人,设为消息推送的优先级「高」(必须立即推),再判断发送渠道,调用对应的消息推送服务。
2025-10-20 11:00:00
717
原创 Java面试官:聊聊MyBatis缓存机制?
MyBatis是常见的Java数据库访问层框架。在日常工作中,开发人员多数情况下是使用MyBatis的默认缓存配置,但是MyBatis缓存机制有一些不足之处,在使用中容易引起脏数据,形成一些潜在的隐患。个人在业务开发中也处理过一些由于MyBatis缓存引发的开发问题,带着个人的兴趣,希望从应用及源码的角度为读者梳理MyBatis缓存机制。
2025-10-19 16:15:16
673
原创 Java面渣逆袭:二十问彻底搞定MyBatis!
先吹一下Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。再说一下缺点。
2025-10-19 16:12:46
684
原创 消息幂等(去重)如何解决?来看看这个方案!
消息中间件是分布式系统常用的组件,无论是异步化、解耦、削峰等都有广泛的应用价值。我们通常会认为,消息中间件是一个可靠的组件——这里所谓的可靠是指,只要我把消息成功投递到了消息中间件,消息就不会丢失,即消息肯定会至少保证消息能被消费者成功消费一次,这是消息中间件最基本的特性之一,也就是我们常说的“AT LEAST ONCE”,即消息至少会被“成功消费一遍”。
2025-10-19 16:10:05
350
原创 面试被问到RocketMq,我懵了!
今天主要讲了RocketMq的基本架构以及消息是怎么发送,存储和消费的,要掌握NameServer、Broker、Producer、Consumer各自的职责是什么,在消息这方面都做了什么努力,比如保证高可用、保证顺序、保证分布式、实现过滤、实现去重以及怎么做负载均衡等等。作者:写代码的强哥链接:https://juejin.cn/post/6873844931945824270来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2025-10-19 16:09:12
238
原创 Java面渣逆袭:RocketMQ二十三问(含答案文档)!
类比一下我们生活的邮政系统——邮政系统要正常运行,离不开下面这四个角色, 一是发信者,二 是收信者, 三是负责暂存传输的邮局, 四是负责协调各个地方邮局的管理机构。对应到 RocketMQ 中,这四个角色就是 Producer、 Consumer、 Broker 、NameServer。在操作系统中,使用传统的方式,数据需要经历几次拷贝,还要经历用户态/内核态切换。从磁盘复制数据到内核态内存;从内核态内存复制到用户态内存;然后从用户态内存复制到网络驱动的内核态内存;
2025-10-19 16:08:17
793
原创 这几个关于Spring 依赖注入的问题你清楚吗?
本章的内容主要是想探讨我们在进行Spring 开发过程当中,关于依赖注入的几个知识点。@Autowired@Resource@Inject三个注解的区别当你在使用@Autowired时,是否有出现过的警告?你知道这是为什么吗?Spring 依赖注入有哪几种方式?官方是怎么建议使用的呢?如果你对上述问题都了解,那我个人觉得你的开发经验应该是不错的👍。下面我们就依次对上述问题进行解答,并且总结知识点。@Autowired。
2025-10-19 15:59:58
413
原创 Java面试官:Spring 中的bean 是线程安全的吗?
分析这个结果发现,多实例模式下普通变量,取配置的变量还有ThreadLocal变量都是线程安全的,而静态变量和user(看他的hashCode都是一样的)对象中的变量都是非线程安全的。我们可以看到3次请求结果里面只有ThreadLocal变量值每次都是从0+1=1的,其他的几个都是累加的,而user对象呢,默认值是0,第二交取值的时候就已经是1了,关键他的hashCode是一样的,说明每次请求调用的都是同一个user对象。答:默认配置下不是的。以外的操作,那么这个单例Bean是线程安全的。
2025-10-18 20:57:38
669
原创 MySQL查询 limit 1000,10 和limit 10 速度一样快吗?如果我要分页,我该怎么办?
比limit size要慢,且offset的值越大,sql的执行速度越慢。当offset过大,会引发深度分页问题,目前不管是mysql还是es都没有很好的方法去解决这个问题。只能通过限制查询数量或分批获取的方式进行规避。遇到深度分页的问题,多思考其原始需求,大部分时候是不应该出现深度分页的场景的,必要时多去影响产品经理。如果数据量很少,比如1k的量级,且长期不太可能有巨大的增长,还是用的方案吧,整挺好,能用就行。
2025-10-18 20:50:13
850
原创 Java面渣逆袭:Spring三十五问,四万字+五十图详解!
Java 是面向对象的编程语言,一个个实例对象相互合作组成了业务逻辑,原来,我们都是在代码里创建对象和对象的依赖。所谓的IOC(控制反转):就是由容器来负责控制对象的生命周期和对象间的关系。以前是我们想要什么,就自己创建什么,现在是我们需要什么,容器就给我们送来什么。也就是说,控制对象生命周期的不再是引用它的对象,而是容器。对具体对象,以前是它控制其它对象,现在所有对象都被容器控制,所以这就叫控制反转。DI(依赖注入):指的是容器在实例化对象的时候把它依赖的类注入给它。
2025-10-18 20:49:11
578
原创 程序员必备基础:Git 命令全方位学习!
掌握Git命令是每位程序员必备的基础,之前一直是用smartGit工具,直到看到大佬们都是在用Git命令操作的,回想一下,发现有些Git命令我都忘记了,于是写了这篇博文,复习一下~文章目录Git是什么?Git的相关理论基础日常开发中,Git的基本常用命令Git进阶之分支处理Git进阶之处理冲突Git进阶之撤销与回退Git进阶之标签tagGit其他一些经典命令百度百科定义是酱紫的~版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。
2025-10-18 20:45:02
672
原创 Java面渣逆袭:Redis连环五十二问,图文详解,这下面试稳了!
Redis是一种基于键值对(key-value)的NoSQL数据库。比一般键值对数据库强大的地方,Redis中的value支持string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogLog、GEO(地理信息定位)等多种数据结构,因此 Redis可以满足很多的应用场景。而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常出色。
2025-10-17 21:20:49
553
原创 Java面渣逆袭:微服务三十三问,两万字图文详解!
微服务(Microservices)是一种软件架构风格,将一个大型应用程序划分为一组小型、自治且松耦合的服务。每个微服务负责执行特定的业务功能,并通过轻量级通信机制(如HTTP)相互协作。每个微服务可以独立开发、部署和扩展,使得应用程序更加灵活、可伸缩和可维护。在微服务的架构演进中,一般可能会存在这样的演进方向:单体式-->服务化-->微服务。单体服务(Monolithic Service)是一种传统的软件架构方式,将整个应用程序作为一个单一的、紧耦合的单元进行开发和部署。
2025-10-17 21:17:50
961
原创 Spring知识大全:Spring MVC的工作流程?SpringBoot启动原理?
自动配置:内置了大量常用场景的配置,开发者只需要少量配置。比如加上,就能快速构建 Web 应用。starter机制:提供一系列start依赖包,整合第三方框架很方便,spring-boot-starter-redis。内嵌服务器:传统的方式写完代码后,要把项目打包成WAR包,还要准备一个外部的应用服务器(如Tomcat),把war包放到服务器的webapps目录下,重启tomcat才能跑。
2025-10-17 13:00:00
871
原创 Spring知识点大全:依赖注入?循环依赖?Bean?AOP?
装配:把bean之间的依赖关系配置清楚自动装配:让Spring容器自己根据规则把依赖对象诸如进去,而不是开发者手动写。这样可以减少配置,提升开发效率。两个或多个Bean互相依赖,形成“死循环”,只在单例下会出现。如果是prototype的话会无限套娃。那Spring能解决哪些情况?两边都是构造器注入(不支持):无法提前暴露“半成品”对象,会直接报错。两边都是setter/字段注入(支持):Spring创建A会调用构造方法得到一个空对象,把A的工厂放到三级缓存。给A注入依赖时发现需要B,就去创建B。
2025-10-17 12:30:00
1215
原创 Spring篇知识点:Spring框架的特性及组成?常用注解?Spring用了哪些设计模式?
Java是一个面向对象的语言,我们在代码里就是创建对象和对象的依赖。IOC是控制反转的思想,就是由容器来负责控制对象的生命周期和对象间的关系。引入IOC之后控制对象生命周期的不再是引用它的对象,而是容器。DI(依赖注入),指的是容器在实例化对象的时候把它依赖的类注入给它。所以我理解的是IOC是思想,DI是实现。那使用IOC的最主要的目的就是为了让对象间不再过度耦合,写代码的时候可以专注于业务,而不是复杂的对象的生命周期的管理和依赖。① 直接编码(最底层)
2025-10-17 12:00:00
560
原创 MySQL InnoDB加锁规则分析
1. 基础知识回顾1、索引的有序性,索引本身就是有序的2、InnoDB中间隙锁的唯一目的是防止其他事务插入间隙。间隙锁可以共存。一个事务取得的间隙锁并不会阻止另一个事务取得同一间隙上的间隙锁。共享和独占间隔锁之间没有区别。它们彼此之间不冲突,并且执行相同的功能。3、MySQL默认隔离级别是 REPEATABLE-READ4、加锁的对象是索引,加锁的基本单位是next-key锁,而行锁和间隙锁,是由next-key锁退化而来的5、记录锁,锁的是索引,而非数据本身。
2025-10-16 20:28:43
723
原创 Dubbo本地调试方法
比如,开发环境上跑的服务版本是1.0.0,那么为了在本地打断点调试某个服务,可以在本地启动,将version设置为2.0.0。然后在映射文件 xxx.properties 中加入配置,其中 key 为服务名,value 为服务提供者 URL。如果服务比较多,用 -Ddubbo.resolve.file 指定映射文件路径。或者,启动的时候,通过 -D 参数指定。或者,通过文件映射指定。
2025-10-16 20:27:53
375
原创 基于Redis有序集合实现滑动窗口限流?
Redis有序集合每个value有一个score(分数),基于score我们可以定义一个时间窗口,然后每次一个请求进来就设置一个value,这样就可以统计窗口内的请求数量。value在这里不那么重要,因为我们只需要统计数量,因此value可以就设置成时间戳,但是如果value相同的话就会被覆盖,所以我们可以把请求的数据做一个hash,将这个hash值当value,或者如果每个请求有流水号的话,可以用请求流水号当value,总之就是要能唯一标识一次请求的。那么,问题来了,如果获取注解参数呢?
2025-10-16 20:27:02
366
原创 SpringBoot Seata 死锁问题排查
现在,回到项目中来,由于我们的项目中有一个比较耗时的操作,超时时间固定是60秒,这个方法本来应该在Seata代理数据源之后做,不知道为什么服务器上先执行了,导致main线程等待了60秒,之后才执行SeataDataSourceBeanPostProcessor#postProcessAfterInitialization()因此,main线程很有可能会先持有该锁,当初始化到Seata的时候,又要获取该锁,于是出现了锁争用。(PS:我猜测可能是环境不同造成的,包括操作系统不同和JDK版本不同)
2025-10-16 20:25:58
702
原创 Spring Boot 源码分析 - Jar 包的启动实现
Spring Boot 提供了 Maven 插件,可以很方便的将我们的 Spring Boot 项目打成jar包或者war包。考虑到部署的便利性,我们绝大多数(99.99%)的场景下,都会选择打成jar包,这样一来,我们就无需将项目部署于 Tomcat、Jetty 等 Servlet 容器中。那么,通过 Spring Boot 插件生成的jar包是如何运行,并启动 Spring Boot 应用的呢?这个就是本文的目的,我们一起来弄懂 Spring Bootjar包的运行原理。BOOT-INF。
2025-10-16 20:20:52
761
原创 ConcurrentLinkedQueue详解(图文并茂)
是基于链接节点的无界线程安全队列。此队列按照FIFO(先进先出)原则对元素进行排序。队列的头部是队列中存在时间最长的元素,而队列的尾部则是最近添加的元素。新的元素总是被插入到队列的尾部,而队列的获取操作(例如poll或peek)则是从队列头部开始。与传统的LinkedList不同,使用了一种高效的非阻塞算法,被称为无锁编程(Lock-Free programming),它通过原子变量和CAS(Compare-And-Swap)操作来保证线程安全,而不是通过传统的锁机制。
2025-06-29 21:16:30
1438
原创 CountDownLatch翻车后,我建议大家用CompletableFuture改造
异步编程,利用多线程优化性能这个核心方案得以实施的基础他的目的也很简单,同一个CPU上执行几个松耦合的任务,充分利用CPU核数,实现最大化吞吐量,避免因为阻塞造成等待时间过长;章我主要是根据大家的建议,使用了Java8的CompletableFuture 来进行了原来的业务功能改造.在执行比较耗时的业务操作时候可以使用异步编程来提高性能,加快程序的处理速度。
2025-06-29 21:16:06
785
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅