自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Spring】深究SpringBoot自动装配原理

早期的Spring项目需要添加需要配置繁琐的xml,比如MVC、事务、数据库连接等繁琐的配置。的出现就无需这些繁琐的配置,因为基于约定大于配置的理念,在项目启动时候,将约定的配置类自动装配到IOC容器里。这些都因为有自动装配的特性。接下来将会逐步从源码跟踪进去,一步步掀开自动装配的面纱。注解导入类;执行方法调用扫描所有jar下面的对应的文件;限定为对应的value,将这些装配条件的装配到IOC容器中。自动装配简单来说就是自动将第三方的组件的bean装载到IOC容器内,不需要再去写bean。

2023-08-02 17:19:54 608 1

转载 【JVM】万字长文!深入详解Java垃圾回收(GC)机制

如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。

2023-08-01 22:10:49 4395

原创 【JVM】什么是双亲委派机制

双亲委派模型(Parents Delegation Medel)是指各种类加载器之间的层级关系。该模型要求除了顶层的启动类加载器外,其余的类加载器都应有自己的父类加载器。同时这里类加载器之间的父子关系一般是通过组合关系来复用父加载器的代码而非继承。

2023-08-01 15:22:35 1057

原创 【计网】TCP在可靠传输中都干了啥

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议,处于OSI模型的第四层传输层。那么什么是可靠传输呢?可靠传输就是保证接收方收到的字节流和发送方发出的字节流是完全一样的。也就是说,通过 TCP 连接传输的数据,无差错、不丢失、不重复、并且按序到达。网络层是没有可靠传输机制的,尽自己最大的努力进行交付。校验和 Checksum序列号和确认应答机制重传机制流量控制(滑动窗口协议)拥塞控制在错综复杂的网络,并不一定能够顺利的传输报文,报文存在丢失的可能性。

2023-07-29 19:56:03 1015 4

原创 【计网】一起聊聊TCP的粘包拆包问题吧

在TCP中,粘包和拆包问题是十分常见的,如基于TCP协议的RPC框架、Netty等。粘包(Packet Stickiness)指的是在网络通信中,发送方连续发送的多个小数据包被接收方一次性接收的现象。这可能是因为底层传输层协议(如TCP)会将多个小数据包合并成一个大的数据块进行传输,导致接收方在接收数据时一次性接收了多个数据包,造成粘连。拆包(Packet Splitting)指的是在网络通信中,发送方发送的一个大数据包被接收方拆分成多个小数据包进行接收的现象。

2023-07-28 11:40:09 1161 1

原创 【计网】什么是三次握手四次挥手

TCP 是面向连接的、可靠的、基于字节流的传输层通信协议,处于OSI模型的第四层传输层。面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息,也就是一对多是无法做到的;可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。

2023-07-27 07:00:00 245 1

原创 【Redis】如何实现一个合格的分布式锁

在多线程的环境下,为了保证一个代码块在同一时间只能由一个线程访问,Java中我们一般可以使用语法和去保证,这实际上是本地锁的方式。而在如今分布式架构的热潮下,如何保证不同节点的线程同步执行呢?实际上,对于分布式场景,我们可以使用分布式锁,分布式锁是用于分布式环境下并发控制的一种机制,用于控制某个资源在同一时刻只能被一个应用所使用。

2023-07-26 20:14:38 447

原创 【Redis】搞懂过期删除策略和内存淘汰策略

Redis 是可以对 key 设置过期时间的,因此需要有相应的机制将已过期的键值对删除,而做这个工作的就是过期键值删除策略。每当我们对一个 key 设置了过期时间时,Redis 会把该 key 带上过期时间存储到一个过期字典(expires dict)中,也就是说「过期字典」保存了数据库中所有 key 的过期时间。

2023-07-25 06:45:00 162 1

原创 【Redis】都有Map了为什么还要Redis

大家都知道,Redis是现在很热门的一个NoSQL数据库,也是最常见的缓存服务,很多原因都是因为它功能多而且嘎嘎快。可是仔细想想,在Java中其实Map也是能够充当缓存的,由于是Java程序内置的,因此Map中缓存的数据也是基于内存的同样嘎嘎快,那么为什么还要快男Redis呢?在本篇文章中将细细道来。

2023-07-24 06:30:00 419 5

原创 【Redis】所以延迟双删有啥用

延迟双删(Delay Double Delete)是一种在数据更新或删除时为了保证数据一致性而采取的策略。这种策略通常用于解决数据在缓存和数据库中不一致的问题。具体来说,在某些场景下,我们需要先更新或删除数据库中的数据,然后再更新或删除缓存中的数据,以保证数据的一致性。但在某些情况下,由于网络延迟、服务器故障或其他原因,可能导致缓存中的数据更新或删除失败,从而导致数据库和缓存中的数据不一致。

2023-07-23 16:19:01 9025 16

原创 【Redis】缓存问题小记

缓存穿透产生的原因是什么?用户请求的数据在缓存中和数据库中都不存在,不断发起这样的请求,给数据库带来巨大压力缓存穿透的解决方案有哪些?缓存null值布隆过滤增强id的复杂度,避免被猜测id规律做好数据的基础格式校验加强用户权限校验做好热点参数的限流。

2023-07-21 01:00:00 257

原创 【Redis】剖析RDB和AOF持久化原理

Redis是一个内存数据库,当机器重启之后内存中的数据都会丢失。众所周知,数据在很多情况下都是最最最重要的一部分,所以对Redis来说,持久化显得尤为重要。在Redis中提供了两种持久化的方式,分别是AOF日志 和 RDB快照。这两种技术都会用各用一个日志文件来记录信息,但是记录的内容是不同的。AOF 文件的内容是操作命令;RDB 文件的内容是二进制数据。

2023-07-20 16:42:24 156

原创 【实用工具】MapStruct—性能无限接近原生手写的对象转换工具

MapStruct 是一个代码生成器,用于创建实现Java Bean之间转换的扩展映射器,它基于约定优于配置的方法极大地简化了 Java bean 之间映射的实现,我们只需要创建接口,MapStruct就会在编译时自动创建一个具体的实现进行对象的转换。MapStruct 旨在通过尽可能自动化来简化这项工作。与其他映射框架相比,MapStruct 在编译时生成 bean 映射,这确保了高性能,允许快速的开发人员反馈和彻底的错误检查。

2023-06-28 14:09:20 1353

原创 【行为型模式】迭代器模式

迭代器模式(Iterator)是一种行为设计模式,它允许我们遍历一个复杂的集合对象而无需暴露其内部表示。它提供了一种统一的方式来访问一个聚合对象中的各个元素,而不用暴露该对象的内部结构。迭代器模式可以让我们在遍历过程中删除、添加或修改元素,而不会影响到迭代器的正确性。有时候,对于某些复杂的对象,我们可能需要对其中的元素进行遍历操作,但是这个对象的内部结构比较复杂,我们不能直接通过索引来访问其中的元素。此时,就需要采用迭代器模式,通过提供一个迭代器来遍历该对象的元素,而无需了解该对象的内部实现细节。

2023-04-18 00:45:00 638 4

原创 【行为型模式】观察者模式

观察者模式(Observer)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,其他所有依赖于它的对象都会自动被通知并更新。这个模式也被称为发布/订阅模式。观察者模式通常用于需要实现事件驱动系统的场景中。例如,当用户订阅了一个新闻网站的推送服务后,当这个网站发布了新的文章时,它会将这些更新通知给所有的订阅用户。在这个例子中,订阅用户是观察者,新闻网站是被观察者。观察者模式的好处是减少了对象之间的耦合性,使得它们可以独立地进行修改和扩展。

2023-04-17 13:40:48 690

原创 【行为型模式】责任链模式

责任链模式(Chain of Responsibility)是一种行为型设计模式,它允许对象在链上依次处理请求,用户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递,从而避免了请求发送者和接收者之间的直接耦合。具体来说,当一个请求进入责任链时,每个对象都有机会对该请求进行处理,如果当前对象无法处理该请求,则将其传递给下一个对象,直到找到能够处理请求的对象为止。责任链模式在实际开发中非常常用,它可以帮助我们简化代码结构,提高可维护性和可扩展性。

2023-04-17 00:00:00 955

原创 【行为型模式】策略模式

策略模式(Strategy)是一种设计模式,它允许在运行时根据需要选择算法的行为。这个模式将每个算法封装到一个类中,并使它们可互换。让客户端代码可以独立于算法变化而改变其行为。策略模式通常应用于需要多种算法进行操作的场景,如排序、搜索、数据压缩等。在这些情况下,不同的算法有不同的优缺点和适用性,因此需要进行选择。通过使用策略模式,我们可以轻松地切换算法,而无需修改客户端代码。这使得代码更加灵活、可扩展、易于维护,减少了重复的代码,并提高了代码的可读性。

2023-04-16 14:51:46 243

原创 【行为型模式】模板方法模式

模板方法模式(Template Method)是一种设计模式,它定义了一个算法的框架,并将具体步骤延迟到子类中实现。在该模式中,父类中定义一个模板方法来描述算法的基本流程,在这个过程中,某些步骤可以通过抽象方法或空置来延迟到子类中实现。通常情况下,当我们处理一些相似的任务时,会发现这些任务之间有很多共性,只是其中一些步骤不同而已。如果每次都重复编写代码,既费时又容易出错。因此,为了解决这个问题,就产生了模板方法模式,它把这些共性代码抽象到父类中,子类只需要覆盖特定的步骤即可。

2023-04-16 01:30:00 200

原创 【结构型模式】装饰者模式

装饰者模式Decorator)是一种结构型设计模式,它允许你在不改变对象自身的基础上,动态地给一个对象添加额外的功能。该模式是通过创建一个包装对象来实现的,也就是用一个新的对象来包装真实的对象。这个装饰对象与原始对象拥有相同的接口,因此客户端无需更改代码即可使用装饰后的对象。

2023-04-14 16:43:40 948 1

原创 【结构型模式】适配者模式

适配器模式是一种常用的结构型设计模式,核心思想是将现有的接口转换为客户端所期望的接口。它允许通过将一个接口转换为另一个接口,将不兼容的类或对象组合在一起。这种模式通常用于集成现有系统或库中不兼容的组件。在软件开发中,我们经常会遇到由不同的团队或不同的供应商编写的代码、服务或库,这些组件可能使用不同的协议、数据格式或接口定义,因此无法直接集成在一起。为了解决这个问题,我们可以使用适配器模式来创建一个适配器,它可以将这些不兼容的组件转换为一个统一的接口,从而实现它们之间的互操作性。

2023-04-13 13:53:46 562 1

原创 【结构型模式】代理模式

代理模式(Proxy)是一种常见的设计模式,它允许通过代理对象控制对某个对象的访问。在代理模式中,代理类扮演着客户端和真正的目标对象之间的中介角色,代理类可以为目标对象提供额外的功能,例如远程访问、延迟加载、权限控制等。使用代理模式可以实现对象的封装,同时也能够降低系统耦合度,增强了系统的灵活性和可扩展性。如果在开发过程中需要对某个对象进行控制,并且希望保持系统的高内聚、低耦合特性,那么代理模式是一个不错的选择。

2023-04-12 20:02:13 685 1

原创 【创建者模式】原型模式

用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型对象相同的新对象。这种类型的设计模式属于创建型模式,用于创建重复对象的同时又能保证性能,是创建对象的最佳方式之一。优点为性能高,简单性能高: 使用原型模式复用的方式创建实例对象,比使用构造函数重新创建对象性能要高;(针对类实例对象开销大的情况)流程简单: 原型模式可以简化创建的过程,可以直接修改现有的对象实例的值 , 达到复用的目的;(针对构造函数繁琐的情况)缺点为实现复杂,坑多。

2023-04-12 01:30:00 532 1

原创 【创建者模式】建造者模式

建造者模式(Builder Pattern)旨在将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。简单来说就是使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式分离了部件的构造(由Builder来负责)和装配(由Director负责)。从而可以构造出复杂的对象。这个模式适用于:某个对象的构建过程复杂的情况。由于实现了构建和装配的解耦。不同的构建器,相同的装配,也可以做出不同的对象;相同的构建器,不同的装配顺序也可以做出不同的对象。

2023-04-11 14:25:22 435

原创 【创建者模式】工厂模式

根据百科的定义,工厂模式是“工厂是用于创建其他对象的对象”。传统开发在不使用任何模式下程序运行正常,但是却有着耦合严重的问题。假如我们要更换/修改对象,所有new对象的地方都需要修改一遍,这显然违背了软件设计的开闭原则。如果我们使用工厂来生产对象,我们就只和工厂打交道就可以了,彻底和对象解耦,如果要更换对象,直接在工厂里更换该对象即可,达到了与对象解耦的目的;所以说,工厂模式最大的优点就是:解耦。

2023-04-10 21:00:00 545

原创 【创建者模式】单例模式

所谓类的单例设计模式 ( singleton ),就是采取了一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的静态方法。由于单例模式只生成了一个实例,减少了系统性能开销,当一个对象的产生需要比较多的资源时,如读取配置、产生其他依赖对象时,则可以通过在应用启动时直接产生一个单例对象,然后永久驻留内存的方式来解决。

2023-04-10 10:58:58 344 1

原创 【设计模式】软件设计原则

设计模式(Design Pattern)是指在软件设计过程中,经过总结和提炼,在特定的上下文环境中,针对普遍存在的某类问题的一种最佳实践,它是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。设计模式本质上是一些定义好的类和对象的交互方式,可以加速代码开发并提高代码的可读性、可维护性和可扩展性。学习设计模式可以帮助程序员编写更好的代码,提高软件的质量和稳定性,同时也可以提高开发效率并增强团队协作。

2023-04-08 14:52:03 385

原创 【Java基础】自己真的懂String原理了吗

基础不牢,地动山摇String 是Java开发中最常见的类型之一,大家对它的第一反应可能是 “这不就是一个字符串嘛,好像还是个不可变的类型”,没错这个人就是我。因此在此对 String 相关知识进行一个总结,搞清楚 String 中的底层实现,以及不同的实现方式的存储方式。

2023-04-01 21:22:04 505

原创 【操作系统】进程和线程是什么之间是如何通信的

进程(process)是计算机中正在运行的程序的实例,是操作系统资源分配的最小单位。在操作系统中,每个进程都有自己的地址空间、内存、数据栈和其他资源,它们与其他进程相互隔离。进程可以是应用程序、系统服务或操作系统本身。操作系统通过管理进程来协调多任务处理,使多个程序能够同时运行,并保证它们之间不会发生冲突或干扰。进程通信需要通过进程间通信机制(IPC)来实现。线程是计算机中能够被操作系统独立调度和执行的最小单位。一个进程可以包含多个线程,每个线程负责执行进程中的一部分任务。同一个进程内多个线程之间可以。

2023-03-28 20:07:56 1164 1

原创 【并发编程】简单化理解AQS和ReentrantLock

在本文中并不会去很深入的去全面的了解AQS和的源码,旨在能够简单直接的去理解AQS的思想和中这些思想的具体体现形式,并且主要以中默认的非公平锁为例子进行介绍,公平锁的差距会略微提及,详细的可查看参考的资料进行查看,相信各位小伙伴看完这一块之后多少会有一点收获和帮助。

2023-03-27 20:33:34 339

原创 【JVM】搞清类加载机制

总所周知,在Java中每一个类或者接口,在编译之后都会生成相对应的.class文件,Java虚拟机把描述类的数据从Class文件中加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程就是JVM的类加载机制。在Java中,类的加载、连接、初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加性能开销,但是却为Java程序提供了比较高的灵活性。对于类的生命周期共有7个阶段,分别是加载、验证、准备、解析、初始化、使用、卸载前5个阶段便是类的加载过程。

2023-03-15 06:00:00 359 1

原创 【并发编程】CAS到底是什么

CAS是Compare-And-Swap(比较并交换)的缩写,是一种轻量级的同步机制,主要用于实现多线程环境下的无锁算法和数据结构,保证了并发安全性。它可以在不使用锁(如synchronized、Lock)的情况下,对共享数据进行线程安全的操作。

2023-03-12 00:00:00 4950 1

原创 【并发编程】volatile的原理我好像又懂了

在多线程编程中,确保线程安全和正确的执行顺序是非常重要的。由于多线程环境下,不同线程之间共享内存资源,因此对这些资源的访问必须进行同步以避免出现竞态条件等问题。Java中提供了多种方式来实现同步,其中 volatile 是一种非常轻量级的同步机制。

2023-03-10 23:30:00 228

原创 【并发编程】深入理解Java内存模型及相关面试题

JMM(Java Memory Model)是Java内存模型的缩写,是一种抽象的概念,定义了Java虚拟机如何在计算机内存中存储和访问Java对象的方法。JMM规范主要用于解决多线程访问共享内存时的可见性、有序性和原子性问题。

2023-03-09 23:00:00 480

原创 【MySQL】InnoDB存储引擎的行结构

MySQL服务器上负责对表中数据的读取和写入工作的部分是存储引擎,而服务器又支持不同类型的存储引擎,如InnoDB、MyISAM、Memory。不同的存储引擎一般是由不同的人为实现不同的特性而开发的,真实数据在不同存储引擎中存放的格式一般是不同的。

2023-01-07 20:06:59 628 5

原创 【MySQL】深入理解数据库事务

对于大部分程序员来说,他们的任务就是把现实世界的业务场景映射到数据库世界中。从文中的小案例中可以看出,因为小鸡子的鸡爪,导致二狗和五郎的转账出现了事故,但在我们现实世界中却很难出现这种情况,要么就是我把钱顺利的给你了,要么就是中间出现了什么事故我把拿出来的钱收回来了,事故出现的概率极低。而数据库世界中为了避免这种事故的发生,便引入了广大求职人又爱又恨的事务(Transaction)。

2022-12-27 17:15:13 611 10

原创 【MySQL】基于InnoDB的数据库索引

MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如“精通MySQL”、“SQL语句优化”、“了解数据库原理”等要求。我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。

2022-12-21 00:29:21 1113 6

原创 【LeetCode】动态规划专题

这里面记录的是自己刷力扣题目的过程,这一部分记录的则是动态规划相关的题目,分享的同时方便后续自己回顾,如果发现有什么问题欢迎提出。

2022-11-01 09:24:40 321 2

原创 【LeetCode】图解KMP算法

KMP算法是由Knuth、Morris和Pratt同时设计实现的,该算法可以在 O(m+n) 的时间数量级上完成串的模式匹配操作。相对于暴力破解,其好处在于:每当一趟匹配过程中字符比较不等时,指针不需要再次回溯,而是利用已经得到的“部分匹配”的结果将模式串向右“滑动”尽可能远的一段距离后,继续进行比较。

2022-10-19 23:20:23 1155 3

原创 SpringBoot集成WebSocket实现在线聊天

WebSocket是HTML5规范中的一个部分,它借鉴了socket这种思想,为web应用程序客户端和服务端之间提供了一种全双工通信机制。同时,它又是一种新的应用层协议,WebSocket协议是为了提供web应用程序和服务端全双工通信而专门制定的一种应用层协议,其基于TCP传输协议,并复用了HTTP的握手通道。通常它表示为:ws://echo.websocket.org/?encoding=text HTTP/1.1。

2022-09-29 01:18:48 6200 8

原创 【OSS】SpringBoot搭配线程池整合阿里云OSS实现图片异步上传

在之前写过阿里OSS图片上传的案例和文章【OSS】服务端签名后直传实现阿里云存储上传文件前端传递单个或多个图片到后端;后端对图片进行处理,并上传至图床;上传完毕之后,返回图片链接给前端。【OSS】服务端签名后直传实现阿里云存储上传文件之中的章节1到3.1相同,因此这里不再过多重复了。

2022-09-21 23:56:24 1860

空空如也

空空如也

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

TA关注的人

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