自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Morty的技术乐园

记录为更好的前行

  • 博客(308)
  • 收藏
  • 关注

原创 Java 函数式编程思考

在多路调用的场景中,通常会需要在被调用方法中使用到调用者的一些数据,传统的编程方式是直接将数据作为参数传递过去,或者通过一些业务标识用if-else的方式来实现延迟加载的要求。直接传递数据的方式,提前将数据准备好,会有性能问题,可能在被调用方法的校验逻辑执行中断,用不到数据了,浪费系统资源;而通过普通的if-else 分支,又需要将调用者注入到被依赖方,虽然实现了延迟加载,但本身形成了循环依赖,造成了高耦合,存在潜在的开发成本。

2023-09-17 16:05:50 477

原创 JVM——CPU缓存架构与Java 内存模型

导航一、现代计算机存储器的层次结构二、JMM Java 内存模型一、现代计算机存储器的层次结构二、JMM Java 内存模型JMM 全称是 “Java Memory Model”,Java 内存模型。JMM 中规定所有的变量都存储在主内存 (Main Mem)中,每条线程都有自己的工作内存(Work Mem),工作内存中保存的是线程的变量从主内存中的拷贝副本,线程对变量的读和写都必须在工作内存中进行。...

2021-07-20 22:09:10 1221 6

原创 Java 多线程 —— AQS 详解

引言

2021-06-13 15:39:03 2122 3

原创 Redis 缓存实战——缓存、数据库一致性问题分析与解决方案

引言缓存与数据库一致性的问题自从出现了缓存概念后就一直被提及,它是一个缓存方案的先天缺陷,只要存在缓存,就势必会讨论缓存与数据库一致性的问题。一致性问题还广泛存在于各种分布式存储场景中,如主从一致性等等。本篇博客讨论和整理了缓存、数据库一致性问题的一些思路,在实际的缓存业务场景中,可以对技术实现的起到一定指导作用。一、为什么会出现一致性问题缓存作为应用程序与数据库之间的数据存储池,主要作用就是热数据备份的作用,它的主要目的就是提高热数据的查询效率。因此,在读取缓存方面,普遍的做法是没有疑

2021-05-09 14:27:43 535

原创 荷兰国旗问题

一、问题描述荷兰国旗问题,顾名思义,就是按照荷兰国旗的形式,给定一个数 x ,将 <x 的数放到左边,=x 的数放中间,>x 的数放右边,将数组中的元素分成三块,有的时候可能要求 <= x 的放左边:二、解题思路首先,数组是无序的,如果要求 <= x 放左边,>x 的放右边,将数组分成两部分,该如何做?我们应当在数组的左边设定一个指针,指针位置以左,代表 <=x 的区域,然后再设计一个指针代表当前数 ,如果当前数 <=x,当前数与 <= .

2021-04-25 21:36:34 406

原创 IDEA——工程项目的两种窗口开发模式

idea编辑器有两种窗口模式,一种是,另一种是。我个人使用较多的是,即一个微服务项目,或单体项目一个独立的idea窗口。此模式好处有两方面,一是开发者可以更专注特定的工程,不会因为工程太多产生混淆;二是在mave依赖自动刷新开启时,可以较快的打开工程,避免窗口内太多的工程刷新Maven依赖而产生卡顿。但是最近在开发多依赖项目时,在两三个项目之间切换也确实不太方便。于是使用了一下多项目窗口模式,整体感官还算不错。

2023-09-17 12:51:28 1456

原创 快速计算两位数相乘

小学算术

2023-01-30 16:59:17 1093 1

原创 MySQL 面试问答

导航一、什么是回表查询?如何避免回表查询?二、为什么MySQL建议使用自增主键?什么是代理主键、业务主键?三、为什么MySQL建议单表不超过2000W数据?四、MySQL自增id用完了怎么办?五、MySQL自增主键是连续的吗?一、什么是回表查询?如何避免回表查询?索引有两种类型,一种是基于表的主键建立的主键索引,另一种是基于普通列建立的普通索引(或二级索引)。主键索引和普通索引的查询过程和查询性能是不一样的。普通索引的叶子节点除了索引数据本身外,仅只存储主键 id 值,而主键索引的叶子节点存储的是整条

2022-04-18 15:52:42 873

原创 Guava常用工具类的使用

Guava 常用工具类总结

2022-03-13 10:48:41 949

原创 Spring Cloud Alibaba —— Seata 分布式事务框架

导航一、Seata 介绍二、Seata 的工作原理2.1 三个角色2.2 工作流程三、Seata AT 工作机制3.1 一阶段3.2 二阶段四、案例演示(待补充)一、Seata 介绍官网:Seata 官网Seata 是2019 年阿里巴巴中间件团队发起的开源项目,其前身是 Fescar(Fast & EaSy Commit And Rollback)。其愿景是让分布式的使用像本地事务的使用一样简单、高效,并逐步解决开发者遇到的分布式事务方面的所有难题。Seata 意为 Simple Exte

2021-10-07 21:48:39 708 1

原创 分布式事务的解决思路与方案

导航一、事务的种类与场景二、分布式事务解决方案2.1 全局事务一、事务的种类与场景本地事务实际上就是指数据库的事务,参考《MySQL —— 事务与隔离级别总结》分布式事务指的是在分布式环境下,多个系统之间如何保证事务之间的原子性、一致性等问题。例如多个系统访问同一个数据库,多个系统访问多个数据库,等等这些场景,都数据分布式事务的讨论范围。二、分布式事务解决方案介绍四个业界应用比较广泛的分布式解决方案:全局事务、可靠消息服务、最大努力通知、TCC事务(补偿型事务)。2.1 全局事务...

2021-10-07 10:31:10 521

原创 Spring Cloud Alibaba —— Nacos Config 配置中心

导航引言一、什么是配置中心二、常见的配置中心组件三、Nacos Config 入门四、Nacos Config 动态配置4.1 硬编码方式(默认支持动态生效)4.2 属性注入五、配置共享5.1 相同微服务不同环境间共享引言本文介绍 Nacos 作为注册中心的使用方法,相关文章《Spring Cloud Alibaba——Nacos实现服务治理》。一、什么是配置中心在微服务架构中,关于配置信息,存在一些问题。配置文件相对分散,不好维护。配置文件不好区分开发、测试、生产环境。配置文件无法实时更新

2021-10-06 10:58:25 862

原创 Spring Cloud —— RocketMQ 的消息类型

导航引言一、普通消息1.1 可靠同步发送引言本文承接《Spring Cloud —— 消息队列与 RocketMQ》RocketMQ 提供了多种场景所需的消息类型,包括普通消息、顺序消息、事务消息,本文分别针对这些消息类型予以展开介绍。一、普通消息普通消息分为三种发送方式:可靠同步发送、可靠异步发送、单向发送。简言之,可靠同步发送就是消息发送方直到收到MQ的发送结果才发送下一条消息;可靠异步发送就是消息接收方暂时不关心发送结果,连续发送消息,采用消息发送回调的方式接收MQ的发送结果响应;单向发送

2021-10-05 19:13:03 619

原创 Spring Cloud —— 消息队列与 RocketMQ

导航一、什么是 MQ二、常见的 MQ 产品三、RocketMQ 概念与架构设计3.1 基本概念1、消息模型(Message Model)2、生产者与消费者(Producer & Consumer)3、主题(Topic)4、代理服务器与名称服务(Broker Server & Name Server)5、拉取式与推送式消费6、生产者组与消费者组7、集群消费与广播消费8、消息(Message)9、标签(Tag)10、顺序消息(Ordered Message)3.2 架构设计3.3 部署架构3.4

2021-10-04 18:44:47 1240

原创 Spring Cloud —— 链路追踪技术

导航一、什么是链路追踪二、Spring Cloud Sleuth2.1 相关概念三、Sleuth 入门案例四、Zipkin 的集成4.1 Zipkin 介绍4.2 Zipkin 服务端安装4.3 Zipkin 客户端安装五、Zipkin 数据持久化5.1 MySQL 数据持久化5.2 Elasticsearch 数据持久化一、什么是链路追踪在大型系统的微服务化构建中,一个系统被拆分成了许多模块。这些模块负责不同的功能,组合成系统,最终可以提供丰富的功能。在这种架构中,一次请求往往需要涉及到多个服务。这

2021-10-03 16:49:16 5940

原创 Spring Cloud —— Gateway 服务网关

导航一、什么是服务网关二、业界常见网关组件三、Spring Cloud Gateway四、Gateway 快速入门4.1 创建 gateway 服务4.2 添加 gateway 依赖和 nacos 依赖4.3 配置路由信息4.4 测试路由转发五、Gateway 执行流程六、Gateway 断言6.1 内置路由断言工厂6.2 自定义路由断言工厂七、Gateway 过滤器7.1 局部过滤器7.1.1 内置局部过滤器7.1.2 自定义局部过滤器7.2 全局过滤器7.2.1 内置全局过滤器7.2.2 自定义全局过滤

2021-10-03 10:32:04 2184

原创 Spring Cloud Alibaba —— Sentinel 详细使用

导航引言一、Sentinel的两个基本概念二、流控规则2.1 基本选项2.2 高级选项三、熔断(降级)规则四、热点规则五、授权规则六、系统规则引言Sentinel 官方文档:https://sentinelguard.io/zh-cn/docs/introduction.html本文承接《Spring Cloud Alibaba —— Sentinel 入门》,继续深入使用 Sentinel。本文总结自B站,黑马程序员视频《深入学习Java微服务开发(SpringCloud) 》(P21 - P32

2021-09-30 16:00:57 1080

原创 Spring Cloud Alibaba —— Sentinel 入门

导航一、什么是Sentinel1.1 Sentinel 的优点二、整合 Sentinel 演示三、Sentinel控制台与微服务通信的原理四、Sentinel 流控演示一、什么是SentinelSentinel 是阿里开源的用于提供微服务架构容错方案的组件。它以流量作为切入点,从流量控制、熔断降级、系统负载保护 这三个主要纬度保证整体服务的稳定性。Sentinel 可分为两部分:核心库(Java 客户端) 和 控制台(dashboard)。核心库不依赖任何框架或类库,运行于所有Java运行时上。控制台

2021-09-24 23:39:23 433

原创 微服务架构 —— 服务雪崩与容错方案

导航一、什么是服务雪崩二、雪崩效应的三个核心原因三、容错四、业界常见容错思路五、常见容错组件一、什么是服务雪崩服务雪崩 指的是微服务架构中,微服务各节点之间由于网络通信异常或微服务自身故障等问题,导致请求堆积、任务堆积,消耗和占用容器线程,并由此而影响其他正常业务流程以及其他微服务节点,局部故障扩散为整体故障的一种现象,严重时可能导致整个系统瘫痪,就行“雪崩”一样。二、雪崩效应的三个核心原因被上游服务压垮tomcat 在处理请求时会分配线程资源,但这个资源是有限的,默认的 tomcat 线程

2021-09-24 00:37:14 830 1

原创 jMeter 模拟 web 高并发请求

导航一、jmeter 简介与下载二、接口压测设置三、实战演示一、jmeter 简介与下载Apache JMeter是Apache组织开发的基于Java的压力测试工具。最初被设计用于Web应用测试,但后来扩展到其他测试领域。JMeter 可以用于对服务器、网络或对象模拟巨大的负载,来自不同压力类别下测试它们的强度和分析整体性能。下载路径:https://jmeter.apache.org/download_jmeter.cgi下载完 zip 包后,解压,执行 bin 目录下的 jmeter.bat

2021-09-23 23:51:12 781

原创 CAP 原则与 BASE 理论

导航引言一、CAP 原则1.1 Consistency 一致性1.2 Available 可用性1.3 Partition tolerance 分区容错性1.4 CAP 的矛盾1.5 CAP 的组合场景二、BASE 理论2.1 基本可用2.2 软状态2.3 最终一致性2.3.1 因果一致性2.3.2 读自身所写2.3.3 会话一致性2.3.4 单调读一致性2.3.5 单调写一致性总结引言本文介绍CAP原则和BASE理论。二者是分布式系统中重要的参考原则及指导方针。其中 CAP 是由加州大学的计算机科学

2021-09-12 23:01:22 1895

原创 JVM垃圾收集器——G1

导航引言一、G1 介绍1.1 适用场景1.2 设计初衷1.3 关注焦点1.4 工作模式1.5 堆的逻辑结构1.6 主要收集目标1.7 停顿预测模型1.8 拷贝和压缩1.9 与 CMS 和 Parallel 收集器的比较1.10 固定停顿目标二、G1 的逻辑分区三、G1 的工作过程3.1 YGC3.2 Mixed GC引言本文针对 Hotspot 虚拟机的 G1 垃圾收集器进行总结和归纳,适用于JDK 8。文章内容以 Garbage-First Garbage Collector 和 Garbage-F

2021-08-31 21:45:45 702

原创 常用自定义注解

导航一、方法计时器二、valid 参数校验的通用返回一、方法计时器注解类:MethodTimer@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface MethodTimer {}处理器(需要AOP和spring的支持):MethodTimerProcessor@Slf4j@Component@Aspectpublic class MethodTimerProcessor {

2021-07-29 09:22:44 482

原创 JVM——对象的创建与内存布局

导航一、对象的创建过程二、对象的内存布局2.1 内存布局2.2 计算对象的内存大小三、对象的定位3.1 句柄池3.2 直接指针四、对象的分配过程一、对象的创建过程对象,又叫实例,是 OOP 的最常用角色。如何创建一个对象?一般都是使用 new 关键字搭配对象的构造函数:// 基类的创建Object obj = new Object();// 普通用户对象的创建User user = new User("Tom", 29);// 服务类对象的创建Service svic = new Serv

2021-07-25 11:44:24 280

原创 下载 Java 学习的权威文档

JVMS 和 JLS 文档的下载快速直达:https://docs.oracle.com/javase/8/ --> Java Language and Virtual Machine Specificationsjvm specification 和 java language specification 是Java 学习的两个最权威的文档。如果你用的是 Java 8,就可以去下载 jvms8 和 jls8 的文档。文档是全英文,建议电脑上配备一个有道词典,配合划词翻译,针对需要敲定的知

2021-07-24 11:47:51 313

原创 Java 的混合执行模式

导航解释执行与编译执行总结解释执行与编译执行Java 虽然是先编译再运行,但实际上,对于 JVM 来说,依然是逐条解释执行字节码文件中的指令,即大部分情况下,Java 都是解释执行的。JVM通过 interpreter 解释器解释执行字节码指令,JIT(just in time) 编译器可以在某些情况下实现即时编译。它可以将Java 代码编译成本地代码,例如直接编译为 exe 文件,提高执行效率。简单的来说,JVM 会针对热点代码进行即时编译。例如在一个循环场景中,JVM 会对方法调用进行计数,如

2021-07-19 22:40:41 662

原创 JVM——详解类加载过程

导航一、过程概述二、Loading2.1 类加载器2.2 双亲委派机制2.3 内存中的描述三、Linking四、Initializing一、过程概述java 源文件编译后会生成一个 .class文件存储在硬盘上。在程序运行时,会将用到的类文件加载到 JVM 内存中。从磁盘到内存的过程总共分为三个步骤:加载、连接、初始化。LoadingLinkingInitializing二、LoadingLoading 过程是把一个 class 文件加载到内存中去。2.1 类加载器JVM 加载类

2021-07-19 22:23:08 301 2

原创 Java常用设计模式——观察者模式

一、行为描述观察者会观察特定对象的状态变化,一旦状态有所变化或产生特定条件,被观察对象会通知给观察者,而观察者则会依据通知信息采取特定处理措施。举个例子,公司接到了一个大项目,各个部门都在观察项目的进度,一旦洽谈成功,项目正式进入启动阶段,那么设计部就会出图纸,开发部就会出流程、出架构,售前部就会跑现场实地勘测…项目就是被观察者,而各个部门就是观察者。二、角色关系观察者模式就两种角色——观察者和被观察者。观察者对象往往会规范结构,一般是继承一个抽象观察者。I. 抽象观察者会定义3个重要

2021-07-19 11:01:14 164

原创 自定义类加载器

导航一、loadClass(String) 方法二、findClass(String) 方法三、自定义类加载器四、打破双亲委派机制一、loadClass(String) 方法想要把一个类加载到内存中,只需要调用 ClassLoader 的 loadClass 方法:public class TestLoadClass { public static void main(String[] args) throws ClassNotFoundException { Class&lt

2021-07-18 17:58:41 244 1

原创 IDEA——必备插件指南

目录一、Free-Mybatis-Plugin二、Lombok三、jclasslib Bytecode Viewer一、Free-Mybatis-Plugin二、Lombok三、jclasslib Bytecode Viewer学习 class 文件的必备插件。使用简单,安装后可以在菜单 View 中看到 show bytecode with jclasslib:效果图:...

2021-07-16 21:43:29 168 1

原创 Queue —— JUC 的豪华队列组件

目录引言一、Queue 的类结构1.1 Queue 定义基础操作1.2 AbstractQueue 为子类减负1.3 BlockingQueue 阻塞式Queue1.4 Deque 两头进出二、Queue 的重要实现三、Queue 在线程池中的应用四、ConcurrentLinkedQueue总结引言Queue 是Collection 接口下的另一个重要接口。常常作为生产者/消费者模式、线程池任务队列等基础组件的形式存在。JUC中提供了丰富的Queue组件,如 ArrayBlockingQueue、

2021-06-26 16:01:37 439 1

原创 Java 写时复制容器 —— CopyOnWriteArrayList

引言

2021-06-17 21:05:42 610 1

转载 Java中的Unsafe

Java和C++语言的一个重要区别就是Java中我们无法直接操作一块内存区域,不能像C++中那样可以自己申请内存和释放内存。Java中的Unsafe类为我们提供了类似C++手动管理内存的能力。Unsafe类,全限定名是sun.misc.Unsafe,从名字中我们可以看出来这个类对普通程序员来说是“危险”的,一般应用开发者不会用到这个类。Unsafe类是"final"的,不允许继承。且构造函数是private的:...

2021-06-06 09:05:09 276 1

原创 Java多线程 —— 线程的生命周期与状态迁移

线程状态迁移是非常重要的多线程基础知识,在调试多线程问题的时候,能够发挥很大的作用。6 种状态不仅要熟记,而且在什么情况下会出现这些状态也要清晰明了。如果条件允许,可以试着通过不同的方法来模拟线程的六种状态的切换,可以加深对线程生命周期的理解。

2021-05-31 23:23:10 464 3

原创 排序算法 —— 计数排序

引言

2021-05-30 13:48:59 282

原创 经典数据结构——前缀树

引言前缀树——trie 树,也叫作“单词查找树”、“字典树”。它属于多叉树结构,典型应用场景是统计

2021-05-29 22:56:07 7197

原创 排序算法 —— 堆排序

引言此文基于《经典数据结构——堆的实现》中堆结构,实现一个以堆处理排序的算法。一、算法思想基于堆结构的堆排序的算法思想非常简单,循环获取大根堆中的最大值(0位置的根节点)放到堆的末尾,直到将堆拿空。由于一个现成的大根堆可以实现 O(1) 时间复杂度的最大值返回,因此堆排序的主要时间消耗就是在 heapInsert 或 heapify 这类维护大根堆结构的过程上。二、代码演示首先将数组从0开始,模拟逐个放入的过程,循环 heapInsert 建堆。然后以整个数组为堆,模拟循环取

2021-05-22 11:43:00 379

原创 经典数据结构——堆的实现

一、完全二叉树堆是一种完全二叉树,什么是完全二叉树?简单的说,一棵满二叉树表示的是所有节点全部饱和,最后一层全部占满:而完全二叉树指的是满二叉树的最后一层,所有叶子节点都从左往顺序排满:完全二叉树的特点非常简单,除了最后一层,其他各层节点都是满的,而最后一层,所有要求所有节点从左往右依次排满。它并不关心节点元素的大小,只与这一特定结构有关。二、堆结构前面说到,堆是一种特殊的完全二叉树,除了符合完全二叉树的结构特点,它还有另一个特性,由这个特性,我们又可以将堆分为——大根堆、小

2021-05-15 23:12:35 887

原创 比较器的使用

一、TreeMap 实现排序TreeMap是一个有序结构,TreeSet也是类似。他们可以实现对元素的排序。TreeMap 是针对 key进行排序。如果TreeMap的key 是Integer类型,可以无需指定任何特殊条件,默认即按照升序进行排序,如: public static void main(String[] args) { Object value = new Object(); TreeMap<Integer, Object>

2021-05-15 16:31:51 660

原创 Redis 基础——五大类型与数据结构

引言redis 区分于 memcahced 一个重要的不同就是它具有明确的类型概念,在redis的使用过程中,都离不开这些类型的学习,它不仅是redis能力的基础,同时也是一些重要数据结构和算法思想的体现。本博客总结了五大类型的书面重点,帮助快速梳理和总结redis类型相关的知识点,理论性和记忆性较强。建议在实践之前牢记这些知识。一、Redis简介在开始之前,回顾一下redis的介绍性知识。redis的底层语言是C,它是一种高性能键值对、NoSQL内存数据库。可以用作缓存、数据库、消息中

2021-05-09 11:17:39 282

空空如也

空空如也

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

TA关注的人

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