自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(67)
  • 收藏
  • 关注

原创 动态链接是什么?在JVM中,类、对象、方法是如何交互的?

常量池是JVM中存储字面量(literal)和符号引用(symbolic reference)的地方。在类加载的过程中,类文件的常量池中的符号引用会被解析成直接引用,这个过程就是动态链接。

2024-04-18 00:40:15 421

原创 RocketMQ之Topic和Tag最佳实践

RocketMQ的主题用于对消息进行分类和组织。通过为不同类型的消息分配不同的主题,可以使消息更具可读性和可管理性。每个主题都有自己的消息队列,用于存储该主题下的消息。每个队列都可以并行地接收和处理消息,从而实现高吞吐量和负载均衡。生产者在发送消息时指定目标主题,消费者则通过订阅感兴趣的主题来接收对应的消息。RocketMQ根据主题将消息路由到相应的队列上,然后再由消费者消费。

2024-04-09 08:15:00 758

原创 Sql优化篇-干货总结大全

在Innodb中,表存储主要依赖两个文件,分别是,frm文件和.ibd文件。.frm文件用于存储表结构定义信息,而.ibd文件则用于存储表数据。分区之后,表面看其实还是一张表,但是它数据存储的位置就分开来了。表的分区意味着将表的数据存储在不同的.ibd文件中,而不是像普通的表一样将所有数据存储在一个.ibd和一个.frm文件中。每个分区对应一个.ibd和一个.frm文件,这些文件可以分布在不同的磁盘上,从而实现数据的分散存储,提高了I/O并发性能。

2024-04-08 03:47:22 1037

原创 Mysql【索引覆盖、索引下推、索引合并、索引跳跃】介绍

上图来自MySQL官方文档。MySQL服务层:包括NoSQL和SQL接口、查询解析器、优化器、缓存和Buffer等组件。存储引擎层:各种插件式的表格存储引擎,实现事务、索引等各种存储引擎相关的特性。文件系统层: 读写物理文件。MySQL服务层负责SQL语法解析、触发器、视图、内置函数、binlog、生成执行计划等,并调用存储引擎层去执行数据的存储和检索。我们后续说到的“索引下推”,它的“下”其实就是指将部分上层(服务层)负责的事情,交给了下层(存储引擎)去处理。

2024-04-07 06:18:23 833

原创 缓存最佳实践

缓存策略写入时读取时适用场景旁路先更新DB,再删cachemiss后查询DB回写cache高一致性穿透hit则更新DB和cache,miss仅更新DBmiss后查询DB回写cache冷热分区异步只更新cache,异步更新DBmiss后查询DB回写cache高频写入兜底直接写DB先读DB,hit则更新cache,miss则读cache高可用只读直接写DB只读cache,并通过其它更新方式异步更新缓存最终一致性回源直接写DB查询DB回写cache缓存降级。

2024-04-02 06:20:23 1772

原创 红黑树是什么,为什么HashMap使用红黑树代替数组+链表?

红黑树是一种自平衡的二叉搜索树,它是一种在插入和删除操作时能够自我调整以保持平衡的数据结构。红黑树之所以称为红黑树,是因为每个节点都具有颜色属性,可以是红色或黑色,这些颜色属性必须满足一定的约束条件,以确保树的平衡性。红黑树必须满足四个条件!根节点是黑色的。每个叶子节点(NIL节点,即空节点)是黑色的。如果一个节点是红色的,则它的两个子节点都是黑色的(不能有连续的红色节点)。从任一节点到其每个叶子的所有路径都包含相同数量的黑色节点(黑色节点的数量被称为该节点的“黑色高度”)。

2024-04-01 02:53:43 915

原创 Spring设计模式-实战篇之责任链模式

解耦合:你无需关注你的下一个链条是如何实现的,只需要把自己的模块实现好即可,并且链条之间的顺序可以随意切换,在构建责任链时指定Next即可,无需去各个实现类中进行修改代码;当需要新增加或者修改支付回调处理的步骤时,可以通过添加新的处理器来实现,而无需修改已有的代码。每一个步骤的实现代码都在独立的类中实现,这样可以更容易地理解和调试代码,不像很多业务代码一样,一大堆业务处理逻辑放在一个方法里面调来调去,很容易搞迷糊。

2024-03-25 03:23:40 883

原创 Spring设计模式-实战篇之模板方法模式

模板方法模式在项目中的应用是通过定义一个抽象类作为模板,将固定的流程封装在模板方法中,而其中的某些步骤可以由具体子类来实现。这样可以减少重复的代码,并提供一个统一的执行流程,使得开发者可以更方便地编写代码。一般来说在设计某些框架时会使用,因为整体流程都一致,只有某些步骤需要重写方法,来完成具体细节的实现。如JDBCTemplate,RestTemplate,RedisTemplate,MogoTemplate都是这么干的。ps:以下是我整理的java面试资料,感兴趣的可以看看。

2024-03-24 05:39:38 1027

原创 Spring设计模式-实战篇之策略模式 + 工厂模式

对于大量的if-else,特别是大量的嵌套的if-else,可以用策略模式+工厂模式优化,少量的if-else就没必要了;使用设计模式,将会增加代码量,但是解耦性特别强,代码更加清晰易懂,而且具有更强的扩展性和维护性。策略模式将不同的责任分配到不同的类中,实现单一职责原则,提高代码的内聚性。ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!# 《Java面试宝典》

2024-03-23 04:37:37 814

原创 Spring设计模式-实战篇之单例模式

懒汉式是线程不安全的,可以通过synchonized进行加锁,保证它的一个线程安全性;如果你想提高它的效率,可以使用Double-Check这种机制,让它存在实例以后无需再去竞争锁,在外层 if 即可直接判断;当你使用Double-Check这种机制的时候,请注意加上volatile关键字,防止优化器指令重排序带来的影响。ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!# 《Java面试宝典》

2024-03-22 05:31:19 745 1

原创 使用java实现三个线程循环打印A,B,C,并写出三种方式

ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!

2024-03-20 03:08:35 612

原创 innodb三大特性

插入缓冲(Insert Buffer):InnoDB 存储引擎在插入新记录时,会将数据先写入到内存的插入缓冲区中,然后再按一定的规则将数据批量插入到磁盘的数据页中。这个过程可以提高插入操作的性能,减少随机的磁盘写入,而是将随机写入转换为顺序写入,从而提高写入性能。 二次写(Double Write):InnoDB 存储引擎在进行数据写入磁盘时,会先将数据写入到 doublewrite buffer 中,而后再将数据写入到真正的位置。这样做的好处是,在发生异常情况下(例如断电),可以通过 doublewri

2024-03-19 02:23:09 177

原创 图解I/O中的零拷贝技术

零拷贝是一种计算机系统中的 I/O 优化技术,它的核心思想是在数据传输过程中尽可能地减少或完全避免 CPU 将数据从一个存储区域复制到另一个存储区域的操作,从而减少了上下文切换和 CPU 拷贝时间,提高了系统的性能和效率。在 Java 领域,诸如等框架就使用了零拷贝技术来提高性能和效率,尤其在处理大规模数据传输时表现突出。直接内存访问(技术。简单理解就是,

2024-03-16 05:05:40 1071

原创 BIO、NIO、AIO分别是什么

BIO(Blocking I/O):传统的阻塞式I/O模型,当线程执行输入输出操作时会被阻塞,直到数据准备就绪。每个连接需要独立的线程进行处理,如果连接数量较大,会导致线程资源消耗过多。 NIO(Non-blocking I/O):非阻塞式I/O模型,引入了Channel和Buffer的概念,使得一个线程可以处理多个连接。通过Selector来实现多路复用,一个线程可以监听多个通道上的事件,从而减少线程开销。但需要线程主动去查询是否有IO事件。 AIO(Asynchronous I/O):异步I/O模型

2024-03-16 01:55:45 110

原创 Nginx常用命令

nginx -s reload -squit 重新加载 nginx 配置文件并优雅地停止旧的工作进程。nginx -s reload -squit 重新加载 nginx 配置文件并优雅地停止旧的工作进程。nginx -s stop -wait 停止 nginx 服务并等待旧的工作进程退出。nginx -s stop -wait 停止 nginx 服务并等待旧的工作进程退出。nginx -s reload 重新加载 nginx 配置文件。nginx -s stop 停止 nginx 服务。

2024-03-13 15:31:31 262

原创 Nginx反向代理

Nginx的反向代理是指Nginx作为代理服务器,将客户端请求转发给后端的服务器。反向代理隐藏了后端服务器的真实IP地址,提高了服务器的安全性,并且可以负载均衡地分发请求到多个后端服务器上。

2024-03-13 15:28:45 533

原创 架构师之路:中台和微服务区别

中台架构是一种将业务逻辑和技术能力模块化的架构思想,通过构建统一的中间层服务,将业务能力和技术能力解耦,使得各业务领域的功能和服务能够共享和复用。业务中台:将业务逻辑进行分层,构建通用的业务能力模块,以满足不同业务场景的需求。例如,用户管理、订单管理、支付管理等。技术中台:将技术能力进行分层,构建通用的技术服务模块,以提供统一的技术支持和基础设施。例如,身份认证、权限控制、日志监控等。

2024-03-12 03:29:21 594

原创 分布式事务Seata中的XA和AT区别,通俗易懂!

首先a进行操作,num=num-10,在a提交本地事务之前,会拿到全局锁,这个全局锁就是当前num的值,也就是90,a拿到全局锁之后提交本地事务,然后b开始执行本地事务num=num-10,b在提交本地事务之前,会去拿全局锁,因为此时全局锁是90,假如b拿到的不是90,他就会一直cas重试,直至回滚。首先把a, b的事务状态设置为prepare,并且获取全局锁,在a完成本地事务num=100-10之后,b再执行本地事务num=90-10,直到两个事务都完成之后,才释放全局锁,a,b一起提交给事务协调器。

2024-03-12 03:14:47 1249

原创 SOA、分布式、微服务之间有什么关系和区别?

分布式架构是一种基础架构,可以用于实现 SOA 或微服务架构,它强调系统的分布和通信。 SOA 是一种面向服务的架构风格,可以看作是分布式架构的一种实现方式,它强调服务的组织和重用。 微服务架构是 SOA 的一种演化形式,它将服务设计为小型、独立的服务单元,强调服务的自治性和独立部署。

2024-03-11 20:21:51 89

原创 Spring Cloud核心组件及作用

(双层Map,第一层Key是服务名,第二层Key是实例名,Value是服务地址加端口,同时对服务维持心跳,剔除不可用的服务,eureka集群各节点相互注册,每个实例中都有一样的服务清单。:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求,简化服务间的调用,在Ribbon的基础上进行进一步的封装。:从一个服务的多台服务机器中选择一台(被调用的服务地址有多个),Ribbon也是通过发起http请求来进行调用,只不过通过调用服务名的地址来实现的。

2024-03-11 20:20:28 265

原创 RocketMQ如何实现消息的顺序性

首先,以订单举例,要实现顺序性,并不需要保证各个订单的顺序性,只需保证一个订单中各个操作的顺序性即可。

2024-03-11 03:57:59 592

原创 RocketMQ死信队列

死信队列(Dead-Letter Queue)是存储死信消息(Dead-Letter Message)的特殊队列,这些消息在正常情况下无法被消费者正常消费。这些在正常情况下无法被消费者消费的消息被称为死信消息(Dead-Letter Message),并且会被存储在特殊的队列中,这个队列被称为死信队列(Dead-Letter Queue,简称DLQ)。需要注意的是,死信消息的有效期与正常消息相同,默认为3天,3天后会被自动删除。因此,需要在死信消息产生后的3天内及时处理这些消息,以避免消息丢失。

2024-03-11 02:29:36 500

原创 Spring Cglib动态代理和JDK动态代理区别

如果目标类实现了接口,将会使用JDK动态代理,否则会使用Cglib动态代理; JDK代理使用自己的字节码生成工具生成代理对象,而Cglib会使用ASM字节码生成工具去生成; JDK动态代理是通过反射的方式去实现代理对象的所有方法, 通过InvocationHandler 接口,重写invoke()方法来实现代理逻辑,其中会调用Proxy.newProxyInstance()来创建目标对象,而Cglib是通过继承的方式; JDK只会生成一个代理对象,而Cglib会生成多个,采用空间换取时间的方式,所以生

2024-03-10 23:24:42 88

原创 RocketMQ事务消息

事务消息是一种在发送方和接收方之间保证消息传递的一致性和可靠性的消息传递机制。在消息发送过程中,生产者可以将消息发送到消息队列,但不会立即被消费者接收和处理。相反,消息会先进入一种“准备”状态,然后等待生产者确认消息的状态,最后再决定是否将消息提交给消费者。

2024-03-10 18:49:38 463

原创 RocketMQ消息堆积问题

综上所述,解决RocketMQ中的消息堆积问题需要从多个方面入手,包括优化生产者发送速度、优化消费者消费速度、扩容Broker、调整消息存储策略以及启用消息重试和死信队列等。同时,也需要对RocketMQ集群进行持续的监控和优化,确保系统的稳定性和高效性。当然也有可能是因为Broker宕机,这也是属于broker队列太慢了。消息堆积无非就是从三个方面考虑,第一生产者太快了,第二broker太慢了,第三消费者太慢了。

2024-03-10 18:44:18 462

原创 SpringMVC拦截器和过滤器执行顺序及区别

拦截器和过滤器执行顺序?拦截器和过滤器区别?拦截次数不同: 过滤器:一次请求只能被一个过滤器拦截一次,它们按照在web.xml中的声明顺序依次执行。 拦截器:拦截器可以拦截多次请求,并且可以在请求前、请求时、请求后等多个时机进行处理。 实现原理不同: 过滤器:过滤器是基于回调函数的,它们实现了javax.servlet.Filter接口,在Servlet生命周期中的不同阶段会调用不同的方法。 拦截器:拦截器则是基于Java的反射机制实现的,它们依赖于动态代理,可以在目标方

2024-03-08 01:45:13 415

原创 Spring AOP相关注解及执行顺序

用于标识一个类是切面的注解。通常与其他通知注解一起使用,定义切面类。: 注解来定义切点,它用于描述哪些连接点将会被通知所通知。

2024-03-07 19:01:00 507

原创 Spring容器的启动流程

在Spring启动过程中,还会处理其他注解,比如@Import等,这些注解可能会引入其他配置或者Bean到应用程序上下文中。所有这些步骤完成后,Spring 容器已完全初始化,并准备好处理来自应用程序的请求。启动过程结束,应用程序处于运行状态。ps:以下是我整理的java面试资料,密码是obht,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!带有 @Lazy 标记的 bean 不会在初始启动过程中创建,而是在首次请求时创建。这有助于优化启动时间。

2024-03-07 01:36:35 387

原创 Spring Bean的生命周期

ps:以下是我整理的java面试资料,密码是obht,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!

2024-03-07 00:08:45 365 2

原创 Spring事务失效的八种场景

当Mybatis或JdbcTemplate执行SQL时,会从ThreadLocal中去获取数据库连接对象,如果开启事务的线程和执行SQL的线程是同一个,那么就能拿到数据库连接对象,如果不是同一个,那就拿不到数据库连接对象,这样,Mybatis或JdbcTemplate就会自己新建一个数据库连接用来执行SQL,此数据库连接的autocommit为true,那么执行完SQL就会提交,后续再抛异常也就不能再回滚之前已经提交了的SQL了。ps:以下是我整理的java面试资料,密码是obht,感兴趣的可以看看。

2024-03-06 23:50:22 651

原创 Spring全家桶面试题-学习自测

ps:以下是我整理的java面试资料,密码是obht,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!

2024-03-06 22:08:59 561

原创 Redis的主从、哨兵、集群模式的概念及搭建步骤

主从模式也叫主从复制,主是主服务器,从是从服务器,主服务器(master )的数据如果更新了 也会同步到从服务器(slave),一个主服务器可以搭配很多个从服务器,主服务器负责写入 从服务器只能读取 不能写入。

2024-03-06 16:58:55 993

原创 彻底理解Spring三级缓存解决循环依赖问题

在32位系统下,对象引用占用4个字节,为了节省内存空间,在指针压缩技术下,虚拟机会对对象引用进行压缩,将原本指向对象堆的绝对地址转换为相对于某个基准地址的偏移量。三级缓存是用来存放AOP代理对象的,因为Spring是面向切面编程的,可以在创建的过程中需要做一些其它的事情,比如前置通知,后置通知、事务管理等。这样,对象A和B都初始化完了,也就是在初始化对象A的时候先把对象B初始化好,再把自己的过程走完。(其中,对象B赋的是一个代理对象的A,当然这一步需要先创建B的代理对象,因为B也需要AOP)

2024-03-06 16:46:28 1924

原创 Redis内存淘汰策略

ps:以下是我整理的java面试资料,密码是obht,感兴趣的可以看看。volatile-lru:淘汰所有设置了过期时间的键值中,最久未使用的键值。volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值。volatile-random:随机淘汰设置了过期时间的任意键值。allkeys-lru:淘汰整个键值中最久未使用的键值。allkeys-lfu:淘汰整个键值中最少使用的键值。volatile-ttl:优先淘汰更早过期的键值。allkeys-random:随机淘汰任意键值。

2024-03-04 04:55:21 304

原创 Redis过期删除策略

一旦键过期就立即从内存中删除,节省内存空间,但删除过程会占用大量CPU时间,可能影响服务器的响应时间和吞吐量。并不会立即从内存中删除过期键,而是在需要访问时才会检查是否过期。这样对CPU友好,但可能导致内存泄漏,因为即使键过期也不会被删除。定期对一些键进行检查和删除,可以有效释放过期键占用的内存。虽然可以限制删除操作执行的时长和频率,降低对CPU的影响,但难以确定删除操作执行的时长和频率,执行过于频繁或较少都可能带来问题。

2024-03-04 04:32:49 273

原创 Redis实现分布式锁

分布式锁是用于分布式环境下并发控制的一种机制,用于控制某个资源在同一时刻只能被一个应用所使用。

2024-03-04 04:12:26 995

原创 Redis为什么这么快?

多路复用(Multiplexing)IO 是一种利用操作系统提供的机制同时监控多个文件描述符(sockets)的技术,通过一种非阻塞的方式实现对多个 IO 操作的复用,提高系统的 IO 操作效率。多路复用主要采用 select、poll、epoll 等系统调用来实现,这些调用可以同时监视多个文件描述符的可读、可写、异常等事件。select、poll 和 epoll 都是在网络编程中用于 I/O 复用的机制,它们的主要作用是在多个文件描述符中等待并检测哪些文件描述符已经就绪可进行 I/O 操作。

2024-03-04 03:45:22 478

原创 Redis实现乐观锁+秒杀场景demo

在Redis中,乐观锁通常是通过使用 WATCH、MULTI 和 EXEC 命令实现的。这种乐观锁机制允许客户端在执行事务期间监视一个或多个键,并且只有在事务执行期间没有其他客户端修改被监视的键时,才会执行事务。

2024-03-03 03:03:23 364

原创 Redis的事务

在 Redis 中,事务(Transaction)是一组命令的集合,可以作为一个单独的操作来执行,保证这组命令要么全部执行成功,要么全部执行失败,具有原子性。在 Redis 中,事务是通过 MULTI、EXEC、DISCARD 和 WATCH 这几个命令来实现的。

2024-03-03 01:51:12 484

原创 内存空间担保机制

内存空间担保机制(Memory Space Guarantee)是垃圾回收(Garbage Collection)算法中的一种策略。它用于在进行垃圾回收过程(如Minor GC或Full GC)时,确保老年代有足够的空间来存放从新生代晋升的对象。

2024-03-02 23:25:28 365

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除