自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

方圆 Blog

怕什么真理无穷,进一寸有进一寸的欢喜

  • 博客(226)
  • 资源 (1)
  • 收藏
  • 关注

原创 从 Java 到 Go:面向对象的巨人与云原生的轻骑兵

Go 语言在 2009 年被 Google 推出,在创建之初便明确提出了“少即是多(Less is more)”的设计原则,强调“以工程效率为核心,用极简规则解决复杂问题”。它与 Java 语言生态不同,Go 通过编译为和在占据主导地位,它也是 Java 开发者探索云原生技术栈的关键补充。本文将对 Go 语言和 Java 语言在一些重要特性上进行对比,为 Java 开发者在阅读和学习 Go 语言相关技术时提供参考。

2025-04-01 21:18:21 936

原创 缓存之美:Guava Cache 相比于 Caffeine 差在哪里?

本文将结合的源码来分析它的实现原理,并阐述它相比于 Caffeine Cache 在性能上的劣势。为了让大家对 Guava Cache 理解起来更容易,我们还是在开篇介绍它的原理。

2025-03-10 08:00:00 1037

原创 由 Mybatis 源码畅谈软件设计(九):“能用就行” 其实远远不够

到本节 Mybatis 源码中核心逻辑基本已经介绍完了,在这里我想借助 Mybatis 其他部分源码来介绍一些我认为在编程中能 最快提高编码质量的小方法,它们可能比较细碎,希望能对大家有所启发。

2025-02-27 00:30:00 1125

原创 由 Mybatis 源码畅谈软件设计(六):Interceptor 拦截器的设计

本节我们来介绍 Mybatis 的拦截器 Interceptor,它依靠 @Intercepts 和 @Signature 注解驱动,配置拦截器的切入方法,这种声明方式非常直观,能够准确的知道每个拦截器的作用范围。而且它是非侵入性的,采用了 动态代理模式,在不修改原有逻辑的前提下便能实现功能的扩展,遵循 开闭原则。Spring 框架中的 AOP 也采用的是同样的思想,但是它引入了很多概念(切面、连接点、切入点和通知等等),代码量超过 5000 行,而 Mybatis Interceptor 的实现仅有 37

2025-02-26 03:00:00 896

原创 由 Mybatis 源码畅谈软件设计(五):ResultMap 的循环引用

本节我们来了解 Mybatis 是如何处理 ResultMap 的循环引用,它的解决方案非常值得在软件设计中参考。另外作为引申,大家可以了解一下 Spring 是如何解决 Bean 的循环注入的。

2025-02-26 00:30:00 526

原创 由 Mybatis 源码畅谈软件设计(四):动态 SQL 执行流程

本节我们探究动态 SQL 的执行流程,由于在前一节我们已经对各个组件进行了详细介绍,所以本节不再赘述相关内容,在本节中主要强调静态 SQL 和动态 SQL 执行的不同之处。在这个过程中,SqlNode 相关实现值得关注,它为动态 SQL 标签都定义了专用实现类,遵循单一职责的原则,并且应用了 装饰器模式。最后,我们还会讨论动态 SQL 避免注入的解决方案,它是在 Mybatis 中不可略过的一环。

2025-02-25 02:00:00 713

原创 由 Mybatis 源码畅谈软件设计(三):简单查询 SQL 执行流程

SQL 查询是 Mybatis 中的核心流程,本节我们来介绍简单 SQL 的执行流程,过程会比较长,期间会认识很多重要的组件,比如 SqlSession、四大处理器(Executor、StatementHandler、ParameterHandler 和 ResultSetHandler)等等,大家先有个脸熟,到具体环节时需要重点关注。

2025-02-25 00:30:00 977

原创 由 Mybatis 源码畅谈软件设计(二):MappedStatement 和 SqlSource

本节我们来介绍 org.apache.ibatis.mapping.MappedStatement(映射SQL语句声明的类),它是 MyBatis 框架中的一个核心类,也是向后不断学习 Mybatis 源码的基础。

2025-02-24 01:00:00 342

原创 由 Mybatis 源码畅谈软件设计(一):序

从接触软件开发以来,一直对写出优雅的代码抱有执念,工作半年时,偶然接触到《代码整洁之道》,爱不释手,一口气读完,并在很长的时间内践行其中的观点,但是在这践行期间缺少思考和复盘,更多的是一味地信奉和遵守其中的原则,写了不少当时自认为不错而现在回过头看可读性不好的“坏代码”。

2025-02-24 00:30:00 1055

原创 高性能缓存设计:如何解决缓存伪共享问题

在多核高并发场景下,缓存伪共享(False Sharing) 是导致性能骤降的“隐形杀手”。当不同线程频繁修改同一缓存行(Cache Line)中的独立变量时,CPU缓存一致性协议会强制同步整个缓存行,引发无效化风暴,使看似无关的变量操作拖慢整体效率。本文从缓存结构原理出发,通过实验代码复现伪共享问题(耗时从3709ms优化至473ms),解析其底层机制;同时深入剖析高性能缓存库 Caffeine 如何通过 内存填充技术(120字节占位变量)隔离关键字段,以及 JDK 1.8 的 @Contended 注解

2025-02-22 16:24:47 1356

原创 缓存之美:从根上理解 ConcurrentHashMap

本文将详细介绍 `ConcurrentHashMap` 构造方法、添加值方法和扩容操作等源码实现。`ConcurrentHashMap` 是线程安全的哈希表,此哈希表的设计主要目的是在最小化更新操作对哈希表的占用,以保持并发可读性,次要目的是保持空间消耗与 `HashMap` 相同或更好,并支持利用多线程在空表上高效地插入初始值。

2025-02-10 09:04:04 1654

原创 24 年终总结:是“新生”也是“挑战”

如往年一样,对去年进行回顾总结。我觉得今年的关键词是 **“新生”** 和 **“挑战”**,新生意味着来到新的环境重新发展、成长,挑战便新环境下需要克服的困难和坎坷的经历。全文主要分四部分,关于工作、技术成长、阅读和一些感受,希望能对大家有一些启发。

2025-02-06 17:55:40 1356

原创 本地缓存 Caffeine 中的时间轮(TimeWheel)是什么?

大家好,我是。在前文中,我们详细介绍了 Caffeine 缓存添加元素和读取元素的流程,并详细解析了配置固定元素数量驱逐策略的实现原理。在本文中我们将主要介绍,补全 Caffeine 对元素管理的机制。在创建有过期时间策略的 Caffeine 缓存时,它提供了三种不同的方法,分别为和,前两者的元素过期机制非常简单:通过遍历队列中的元素(遍历的是窗口区、试用区和保护区队列,有专用的写顺序队列),并用当前时间减去元素的最后访问时间(或写入时间)的结果值和配置的时间作对比,如果超过配置的时间,则认为元素过期。而。

2025-02-04 10:58:45 1140

原创 缓存之美:万文详解 Caffeine 实现原理(下)

是一个 MPSC 的缓冲区,采用了分段的设计,将缓冲区划分为多份,根据线程的探针值哈希到不同的缓冲区,减少竞争的发生,并使用CAS操作来保证多线程下写入操作高效执行。队列按照从头节点到尾节点的顺序消费,使用频率相对较低的元素先被驱逐,在相同频率的情况下,优先保留主空间中的元素而不是窗口区元素。在文中提到过每个分区的双端队列使用了 LRU 算法,被访问过的元素会被放在尾节点,但对元素进行驱逐时并不以 LRU 的顺序为准,而是会参考频率草图中记录的元素频率,保证使用频率高的被保留,低的被驱逐。

2025-01-22 09:08:31 1335

原创 缓存之美:万文详解 Caffeine 实现原理(上)

文章将采用“总-分-总”的结构对配置固定大小元素驱逐策略的 Caffeine 缓存进行介绍,首先会讲解它的实现原理,在大家对它有一个概念之后再深入具体源码的细节之中,理解它的设计理念

2025-01-21 09:07:25 1118

原创 问题解决:发现Excel中的部分内容有问题。是否让我们尽量尝试恢复? 如果您信任此工作簿的源,请单击“是”。

执行如上方法导出时,打开的 Excel 文件会提示:发现Excel中的部分内容有问题。如果您信任此工作簿的源,请单击“是”。发现果然包含了响应对象的 JSON 格式,解决该问题也非常简单,第一种方案是直接将返回值改成 void,让前端只处理流即可。第二种方案是在响应头中指定输出流的长度,到了指定长度后前端便不再处理,只解决 Excel 文件相关的内容即可。因为前端在处理文件流时,不知道文件流的长度,会全量处理文件流,由于指定了。在开发同步导出功能是遇到了如标题所示的问题,解决后遂记录下来供大家参考。

2024-12-18 18:41:14 2338

原创 代码整洁:开发者的务实之道

大家好,我是。近半年看了不少关于代码整洁的内容,尤其是在读了《软件设计哲学》之后,想写好代码的想法达到了顶峰,便断断续续搜罗了许多相关书籍,并花时间看了以极简主义风格著称的 Mybatis 源码,收获良多。所以,想趁着这个机会将其中谈到的最直接的方法论分享给大家,希望能有一些帮助,如果大家想深入了解,可以参考文末的书籍。

2024-12-13 13:39:24 804

原创 一文理解布隆过滤器和布谷鸟过滤器

最近在大促中使用到了布隆过滤器,之前学习但没有专门整理过,所以本次借着机会整理下相关内容,并了解了布谷鸟过滤器,希望对后续学习的同学有启发~

2024-10-23 10:55:22 1369 1

原创 「软件设计哲学」在生产业务中的实践

本文主要给大家分享软件设计中的两个理念,为什么我称软件设计是“理念”而不是“方法”或“原则”呢?这个想法主要受《A philosophy of software design》的影响,它将软件设计称为“哲学”,而哲学本身没有严格的定论,同样地,我觉得软件设计是每个开发者的理念,相同功能的迭代,往往会有不同的看法或思想,也所谓每个人的代码风格,所以本次分享不求同,只求能给大家带来一点启发

2024-10-09 09:19:56 1121

原创 为什么《程序员修炼之道》评分高达 9.1?

开始接触到《程序员修炼之道:通向务实的最高境界》这本书是在豆瓣图书的高分榜单上,它的评分高达 9.1,其中有条蛮有意思的书评非常吸引我:“这本书我读过 5 遍信不信,每个字都磨出了感情… 爱看技术书的程序员,看看可以往上走走;不爱看技术书的程序员,看看可以轻松刷出阅读成就感”。所以,本着刷阅读成就感并希望磨炼技术的态度便开始了本书的阅读,抽业余时间读完,其中有部分收获能和大家分享,当然更希望大家去看原书。

2024-08-06 20:33:00 1039 1

原创 《软件设计哲学》:新“代码整洁之道”

工作三年以来一直对写出设计优雅且可读性较好的代码抱有执念,最初接触到的关于代码整洁和软件设计的书是《代码整洁之道》,这本书大概在我入职半年时读完,并在很长的一段时间内将其中谈到的“每个方法只做一件事”、“方法长度最多不要超过 5 行”和“优秀的代码都是自解释的,很少会有注释”等等观点奉为圭臬,但是由于其成书较早,其中的一些观点显然已经不再使用当前业务开发环境了。

2024-07-15 09:43:00 855

原创 软件重构实践:当30w日活遇上25QPS接口

并发查询用户订单列表(200 条订单的查询任务平均分配)根据列表数据并发查询订单明细根据明细信息并发查询绑定关系过滤出3c订单的绑定关系,封装结果返回(目前频道页只为 3c 品类商品服务)

2024-07-01 09:07:20 1004

原创 从多线程设计模式到对 CompletableFuture 的应用

最近在开发频道页时,为了提高查询效率,使用到了多线程技术。为了对多线程方案设计有更加充分的了解,在业余时间读完了《图解 Java 多线程设计模式》这本书,觉得收获良多。本篇文章将介绍其中提到的,以及在实际业务开发中对该模式的应用,而这些内容对于本书来说只是冰山一角,还是推荐大家有时间去阅读原书。

2024-06-15 17:52:22 1000 2

原创 深入理解回溯算法

本篇我们来讲回溯。回溯相当于穷举搜索,它会尝试各种可能的情况直到找到一个满足约束条件的解,寻找解的手段一般通过DFS实现,是一个增量构造答案的过程。

2024-05-06 19:54:04 1230 1

原创 工程中实践的微服务设计模式

最近在读《微服务架构设计模式》,开始的时候我非常的好奇,因为在我印象中,设计模式是常说的那23种设计模式,而微服务的设计模式又是什么呢?这个问题也留给大家,在文末我会附上我对这个问题的理解。本次文章的内容主要是工作中对微服务设计模式的应用,希望能对大家有所启发。

2024-04-07 09:47:33 1255

原创 二分查找是偏爱细节的魔鬼

二分查找本质上是一个规模退化且固定规模减小一半的分治算法,它的。通常我们会认为二分查找的应用场景是数组有序(单调),但实际上它也能在无序数组中应用,限制二分法使用的并不是数组是否有序,而是,只要一段满足某个性质,另一段不满足某个性质,那么就可以使用二分法。本篇内容我想带大家更好地理解二分查找,不再根据模版生搬硬套,也不再对条件判断中的等号云里雾里。如果大家想要找刷题路线的话,可以参考。

2024-03-05 09:47:15 1101

原创 算法学习心得

这篇文章是我学习算法的心得,希望它能够给一些将要学习算法且准备要读大部头算法书籍的朋友一些参考,节省一些时间

2024-02-25 19:23:45 1871

原创 时间复杂度为 O(n) 的排序算法

本文介绍线性排序,即时间复杂度为 O(n) 的排序算法,包括桶排序,计数排序和基数排序,它们都不是基于比较的排序算法,大家重点关注一下这些算法的适用场景。

2024-02-03 18:08:16 2571

原创 23 年终总结:生活是一场永无止境的探索

23 年年终总结一直想提笔写,由于前段时间部门异动,在学习和生活上有些懈怠和佛系,导致一直难产,甚至有了“胎死腹中”的倾向,为了给之后回看留一个引子,也为了更好的规划新的一年,这篇文章必须被尽快生下来,推脱不得,所以它才与大家相见,如果用一个关键词来概括 23 年的话,我觉得探索是最合适的。

2024-01-22 09:17:56 928

原创 树专题 —— 深入理解经典红黑树

本篇我们讲红黑树的经典实现,Java中对红黑树的实现便采用的是经典红黑树。前一篇文章我们介绍过左倾红黑树,它相对来说比较简单,需要大家看完上篇再来看这一篇,因为旋转等基础知识不会再本篇文章中赘述。

2023-12-18 09:03:47 995

原创 Mybatis 拦截器实现单数据源内多数据库切换

物流的分拣业务在某些分拣场地只有一个数据源,因为数据量比较大,将所有数据存在一张表内查询速度慢,也为了做不同设备数据的分库管理,便在这个数据源内创建了多个不同库名但表完全相同的数据库,如下图所示:现在需要上线报表服务来查询所有数据库中的数据进行统计,那么现在的问题来了,该如何。

2023-12-11 09:02:26 543

原创 树专题 —— 二叉树层序遍历

本篇关于二叉树的层序遍历,主要以题目为主,而且我觉得层序遍历是求解二叉树问题中最简单的,学会了基本的层序遍历,在这基础上的扩展题也能迎刃而解,如果大家想要找刷题路线的话,可以参考。

2023-12-04 09:10:46 237

原创 树专题 —— 深入理解左倾红黑树

上文我们已经规定,被红链接引用的节点为红色,被黑色链接引用的节点为黑色,我们在节点中添加colorTrue表示红色,Falseint key;int value;Node left;Node right;/*** 判断节点是否为红色*/} else {

2023-12-04 09:08:49 1057

原创 树专题 —— 二叉树后序遍历

本篇关于二叉树的后序遍历,依然是由题目来展开,如果大家想要找刷题路线的话,可以参考。

2023-11-23 15:58:43 176

原创 树专题 —— 二叉树前序遍历

本篇关于二叉树的前序遍历,主要由题目进行展开,如果大家想要找刷题路线的话,可以参考。

2023-11-13 20:27:20 245

原创 树专题 —— 二叉搜索树和中序遍历

int key;int val;Node left;Node right;// 根节点Node root;

2023-11-06 09:33:36 849

原创 一文搞懂优先队列及相关算法

大家好,我是。优先队列在 Java 中的定义是 PriorityQueue,它基于数据结构实现,其中的元素并不是全部有序,但它能够支持高效地。二叉堆是一种特定条件的,树的根节点为堆顶,最右端叶子节点为堆底,分为和。小顶堆堆顶元素最小,且任意节点小于等于其子节点,大顶堆堆顶元素最大,且任意节点大于等于其子节点,如下图所示:完全二叉树只有叶子节点未被填满,且叶子节点从左向右进行填充。优先队列可以用于解决和,下面我们先来看一些练习。如果大家想要找刷题路线的话,可以参考。

2023-11-06 09:31:57 452

原创 时间复杂度为 O(nlogn) 的排序算法

在上文实现中,我们在每次合并两个有序数组时,即使是很小的数组,我们都会创建一个新的 temp[] 数组,这部分耗时是归并排序运行时间的主要部分。:分解待排序的 n 个元素的序列成各具 n/2 个元素的两个子序列,将长数组的排序问题转换为短数组的排序问题,当待排序的序列长度为 1 时,递归划分结束。在数组有大量重复元素的情况下,快速排序的递归性会使元素全部重复的子数组经常出现,而对这些数组进行快速排序是没有必要的,我们可以对它进行优化。快速排序有很多优点,但是在哨兵划分不平衡的情况下,算法的效率会比较低效。

2023-10-30 09:13:17 741 1

原创 关于双指针算法问题的思考

本篇是对双指针算法的总结,我将它分成了数组和字符串类型的题目,大家可以按照文章题目的顺序进行练习,如果大家想要找刷题路线的话,可以参考。

2023-10-23 09:29:15 122

原创 时间复杂度为 O(n^2) 的排序算法

对于小规模数据,我们可以选用时间复杂度为 O(n) 的排序算法,因为时间复杂度并不代表实际代码的执行时间,而且它也省去了低阶、系数和常数,仅代表的增长趋势,所以在小规模数据情况下, O(n) 的排序算法可能会比 O(nlogn) 的排序算法执行效率高。不过随着数据规模增大, O(nlogn) 的排序算法是不二选择。本篇我们主要对 O(n) 的排序算法进行介绍,在介绍之前,我们先了解一下算法特性::经排序后,若等值元素之间的相对位置不变则为稳定排序算法,否则为不稳定排序算法。

2023-10-16 09:13:21 899

狂神说JUC.pdf

Bilibili狂神老师的JUC课程笔记,讲的非常的好,希望大家结合视频学习狂神老师的JUC编程,精进自己的技术。

2020-05-02

空空如也

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

TA关注的人

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