- 博客(854)
- 收藏
- 关注
原创 干货分享!MCP 实现原理,小白也能看懂
不知道大家有没有发现?对于添加到 MCP 服务市场的成千上万个 MCP 服务(而且这个数字每天还在增加),我们可以不写一行代码,轻松实现调用,但背后的原因究竟是啥呢?MCP 虽然用起来很方便,但搞不懂背后的实现原理,总感觉这个知识点还没完全掌握,所以接下来,我们一起来看它的实现原理。
2025-07-16 16:52:06
159
原创 表单文本框里写太多字就出 404 了?原因和解决办法都在这儿!
表单文本框内容过多导致 404 错误,通常是由于的复杂性引发的路径截断或后端解析失败。通过移除enctype、使用现代 AJAX 方法或调整后端逻辑,可以有效解决该问题。表单文本框里写太多字就出 404 了?原因和解决办法都在这儿!- DarkLONGLOVE - 博客园JNPF快速开发平台。
2025-07-16 15:16:30
497
原创 垃圾回收算法有哪些?了解哪些垃圾回收器?
在Java中,指针碰撞是一种垃圾收集算法中用于分配内存的一种方式。它通常用于实现停顿时间较短的垃圾收集器,如复制算法和标记整理算法。指针碰撞的基本思想是将堆内存分为两个区域:一个是已分配的对象区域,另一个是未分配的空闲区域。通过一个指针来分隔这两个区域。当需要分配对象时,垃圾收集器将对象的大小与空闲区域的大小进行比较,如果空闲区域足够容纳对象,则将指针碰撞指针向前移动对象的大小,并返回指针碰撞指针的旧值作为对象的起始地址。如果空闲区域不足以容纳对象,则进行垃圾回收操作,释放一些内存后再进行分配。
2025-07-15 17:36:51
550
原创 订单初版—生单链路实现的重构文档
一.生成订单数据 + 锁定优惠券,使用的是AT模式订单数据和营销数据通常不需要做异构存储,使用数据库存储即可。往数据库写入订单数据 + 锁优惠券,由于都是与用户关联,所以即使并发情况下也不会出现竞争全局锁。二.锁库存双写数据库 + 缓存,使用的是TCC模式库存数据需要异构存储,所以扣减库存时,需要操作数据库 + 缓存。双写数据库 + 缓存会面临数据一致性问题,TCC模式可以保证数据一致性。锁库存使用TCC模式后,即便出现大量并发请求锁库存,也不需要竞争AT模式下的全局锁了。
2025-07-15 16:01:13
546
原创 TypeScript枚举类型应用:前后端状态码映射的最简方案
这篇文章来谈一下 TypeScript 中的枚举类型(Enum)以及一些最佳实践。事情的起因是这样的,今天看到自己之前写的一段代码,感觉不是很好,于是想优化一下,期间用到了枚举类型,遂记录一下。为了方便理解,我将原来的例子简化一下。
2025-07-14 17:21:30
1018
原创 Faiss能解决什么问题?Faiss是什么?
问题来了,在一群数据中找到两个相似度最高的向量数据,最常用的是暴力搜索法,也就是逐一遍历所有向量,计算距离(如欧氏距离、余弦相似度),虽准确,但时间复杂度高,无法处理百万级以上数据。业界有人会称Faiss是向量数据库,但Faiss不是传统意义上的数据库,因为它并不具备数据持久化存储的能力,但它是很多向量数据库(例如Milvus)的核心引擎,因为向量数据库最核心的能力就是相似度搜索。然后编写一段代码,利用Faiss在模拟数据(10个4维向量)中找到和被搜索向量相似度最近的3个向量,并打印出来。
2025-07-14 16:20:53
700
原创 Vue3开发效率飙升5倍?低代码的逆天组合,我悟了!
Vue3+JNPF 的组合在开发效率上实现了质的飞跃。从开发周期来看,以一个中等规模的企业资源规划(ERP)系统为例,传统开发方式可能需要 6 - 8 个月的时间才能完成从需求分析到上线的整个流程。而采用 Vue3+JNPF 快速开发平台,借助 JNPF 平台丰富的预制组件和可视化开发工具,以及 Vue3 高效的开发特性,开发周期可以缩短至 2 - 3 个月,开发周期缩短了约 60% - 70%。
2025-07-11 17:35:48
780
原创 Java集合框架性能特征与使用场景深度解析
随机访问:选 ArrayList(O (1))而非 LinkedList(O (n))。高频查找:选 HashMap(均摊 O (1))而非 TreeMap(O (log n))。高并发写:选 ConcurrentHashMap(桶级锁)而非 Hashtable(全表锁)。
2025-07-11 16:03:22
793
原创 MySQL 09 普通索引和唯一索引,应该怎么选择?
唯一索引:字段值不能重复。普通索引:字段值可以重复。假设数据如下图,且字段k上的值都不重复:接下来,从两种索引对查询语句和更新语句的性能影响来分析。
2025-07-10 17:40:25
564
原创 MySQL的三大日志
飞机失事靠黑匣子还原真相,MySQL崩溃靠三大日志保障数据安全。作为一个工作多年的程序员,我见过太多因日志配置不当引发的灾难:数据丢失、主从同步中断、事务回滚失败...今天,我将用最通俗的方式,带你彻底掌握MySQL三大日志的底层原理,希望对你会有所帮助。1、Redo Log是生命线innodb_flush_log_at_trx_commit=1 + 足够大的日志文件应趋近于02、Undo Log是后悔药及时清理:开启避免长事务:监控3、Binlog是复制基石格式选择:金融级系统必须用ROW格式。
2025-07-10 15:48:14
685
原创 商品中心—商品卖家系统的技术文档
非叶子节点的卖家节点可以看成是卖家所属的分类,叶子节点的卖家节点才是具体的某一个卖家。卖家节点也分为叶子节点和非叶子节点,非叶子节点的卖家节点可以看成是卖家所属的分类,叶子节点的卖家节点才是具体的某一个卖家。而且卖家组与卖家是多对多关系,即⼀个卖家组能同时添加多个同⼀⾃营类型卖家或者POP类型卖家,⼀个卖家也可以被添加到多个同⼀类型的卖家组中。新增⼀个卖家组,⼀个卖家组原则上不允许圈定不同区域的卖家,卖家组只限定其下的卖家类型要与卖家组保持⼀致。其⾮叶⼦节点为虚拟卖家,叶⼦节点为实体卖家,例如东城区卖家。
2025-07-09 17:44:03
535
原创 2025年推荐6个好用的 Postman 替代工具
在软件开发和API测试领域,Postman无疑是使用最广泛的工具之一。它凭借直观的界面、强大的功能以及丰富的社区支持,多年来一直备受欢迎。然而,随着技术的发展和用户需求的多样化,Postman也暴露出一些不足,比如性能瓶颈、强制登录限制以及部分高级功能需要付费等问题。因此,越来越多的用户开始寻找更高效、更灵活的替代工具。本文将为您推荐6款2025年备受欢迎的Postman替代工具,帮助您根据实际需求选择更合适的API测试与开发方案。
2025-07-09 16:32:27
1122
原创 传统OA要凉?低代码+数智化正在重构企业办公系统
目录传统 OA 的困境低代码技术崛起数智化 OA 的变革力量低代码与数智化 OA 的融合优势实战案例解析未来展望与挑战在数字化转型的浪潮中,传统 OA 系统曾经是企业办公自动化的重要工具,在一定程度上实现了办公流程的电子化,替代了部分繁琐的纸质流程,例如请假审批、文件传阅等流程可以通过电子表单在系统内流转,减少了纸张的浪费和人工传递的时间成本 。但如今,却逐渐暴露出诸多问题,在架构、功能、用户体验、安全和适应性等方面的局限日益凸显。架构陈旧,难以拓展:传统 OA 系统多采用较为陈旧的架构,这使得其在面对新的
2025-07-08 17:53:53
939
原创 订单初版—分布式订单系统的简要设计文档
通过对该组件添加@RestControllerAdvice注解,让该组件成为默认的Controller全局异常处理增强组件。在这个组件中,会分别对系统级别未知系统、客户端异常、服务端异常都做了统⼀处理。
2025-07-08 16:05:01
736
原创 MySQL查询执行顺序:一张图看懂SQL是如何工作的
避免语法错误- 知道什么时候可以使用别名优化查询性能- 合理安排过滤条件的位置正确使用聚合函数- 区分WHERE和HAVING的使用场景编写高效SQL- 让数据库引擎更好地优化查询SQL执行顺序虽然看起来复杂,但掌握了这个核心概念,你就能:写出更高效的SQL语句快速定位SQL错误更好地理解数据库的工作原理在面试中从容应对相关问题下次写SQL的时候,不妨在心里默念一遍执行顺序,相信你会发现很多之前困惑的问题都迎刃而解了!大毛啊。
2025-07-07 17:38:12
1094
原创 MySQL 多版本并发控制
使用隔离级别的事务,由于可以读到未提交事务修改过的记录,所以直接读取记录的最新版本就好了。使用隔离级别的事务,InnoDB规定使用加锁的方式来访问记录。使用和隔离级别的事务,都必须保证读到已经提交了的事务修改过的记录。假如另一个事务已经修改了记录但是尚未提交,是不能直接读取最新版本的记录的,核心问题就是需要判断一下版本链中的哪个版本是当前事务可见的,这是ReadView要解决的主要问题。,创建这个 Read View 的事务 ID。
2025-07-07 16:19:02
822
原创 Web前端入门:JavaScript 性能优化之事件委托(事件代理)原理
性能优化这条路上,一直都存在各种话题,很多性能优化都是过犹不及,适当的场景用适当的方式才是最合理的。代码编写并不是一蹴而就,很多时候,能实现功能就是好代码,至于性能,在一些小的需求场景,您写的代码可能都无法触发性能问题~~坚持一个原则:不要过早优化。当我们的代码确实触发了性能问题,再考虑如何优化吧~~前端路引Web前端入门第 75 问:JavaScript 性能优化之事件委托(事件代理)原理 - 前端路引 - 博客园JNPF快速开发平台。
2025-07-04 17:33:32
647
原创 一个static关键字引发的线上故障:深度剖析静态变量与配置热更新的陷阱
一个小小的static关键字,引发了我对Java基础知识的重新思考。在追求性能优化的同时,我们不能忽视架构的灵活性和可维护性。正如这次经历所示,技术决策需要权衡多方面因素,没有放之四海而皆准的银弹。在分布式系统和云原生时代,任何可能变化的值都不应该被静态绑定。让我们在追求系统稳定性的同时,也为必要的变更保留空间,这才是应对复杂业务场景的成熟之道。程序员Seven一个static关键字引发的线上故障:深度剖析静态变量与配置热更新的陷阱 - 程序员Seven - 博客园JNPF快速开发平台。
2025-07-04 16:03:03
914
原创 程序员失业预警?低代码开发正在血洗传统运维开发!附避坑指南
低代码开发的兴起无疑给传统运维开发带来了巨大的冲击,从开发模式到市场格局都发生了显著的变化。但这并不意味着传统运维开发人员的职业生涯就此终结,相反,这是一个转型和提升的契机。在未来的软件开发行业中,低代码开发将与传统开发模式相互补充、共同发展。低代码开发将继续在快速开发、业务流程自动化等领域发挥重要作用,帮助企业提高数字化转型的速度和效率。而传统开发模式则将专注于复杂系统开发、底层技术研究等高端领域,为软件行业的发展提供坚实的技术支撑。
2025-07-03 17:24:52
1045
原创 JavaScript Quine揭秘:如何让程序输出自身源代码?
如何写一段javascript程序,输出自身的源代码?这个问题非常有意思,大家不妨先尝试一下,反正在尝试了半个小时之后,我果断放弃了。这种能输出自身的程序在英文里被称为quine。
2025-07-03 15:24:25
396
原创 Web前端入门:JavaScript 事件冒泡与事件捕获
编程中的细节问题,总是越挖掘越心惊,学得越来越多,才会发现知道的越来越少。前端路引Web前端入门第 74 问:JavaScript 事件冒泡与事件捕获 - 前端路引 - 博客园JNPF快速开发平台。
2025-07-02 17:31:08
528
原创 商品中心—缓存与DB一致性的技术文档
一.指定具体的缓存名称对应于注解中的cacheKey字段。二.指定第几个入参参数作为缓存的内容对应于注解中的index字段。三.指定操作类型对应于注解中的operationType字段,1是新增或修改,2是删除。四.指定发送哪种缓存数据的消息对应于注解中的messageType,0是普通缓存的消息,1是热点缓存的消息。用来保证DB和缓存的一致性时,消息类型为普通缓存的消息。用来保证本地缓存和分布式缓存的一致性时,消息类型为热点缓存的消息。五.指定使用的缓存组件类型。
2025-07-02 15:46:44
973
原创 真正的生产力来了!Docker迁移部署两步搞定!
最近遇到了需要部署一套比较复杂的应用场景,刚好这套应用我在其他服务器部署过,为了节省折腾的时间,我打算直接把服务器上已有的搬过去。PS:没想到这个过程比从头开始来耗费时间😂好在是把一键迁移的脚本也搞出来了,以后遇到类似的情况就比较舒服了。Docker 的一个典型优势场景就是可移植性只需要把原服务器上的应用相关目录和docker-compose.yml 文件打包复制过去,在目标服务器上解压、部署即可。本文记录一下 docker 迁移部署的过程。
2025-07-01 17:40:57
358
原创 商品中心—库存分桶调配的技术文档
也就是根据当前的可⽤分桶列表、中⼼桶库存、总的可⽤库存深度,计算出平均的⼀个可分配库存数量,从而避免每个分桶扩容的库存不均匀(最⼩值必须超过最⼩库存深度)。先更新分桶库存缓存,再更新本地分桶元数据缓存及远程元数据缓存,可以避免不同机器的本地分桶元数据缓存不一致。获取扩容后的预估库存深度,此时分桶的库存深度发⽣变化,如果扩容的库存深度超过当时分配的库存深度,且未超过最⼤库存深度,则以当前分配的实际库存更新当前分桶库存深度。因为空库存分桶⼜会⻢上下线,这⾥需要先获取对应中⼼桶的剩余库存,验证是否可以上线分桶。
2025-07-01 16:11:47
963
原创 供应链数字化转型别踩坑!JNPF低代码才是普通企业的最优解
JNPF 低代码平台集成了 Java 和.Net 双技术引擎,融合了两者的优势,为企业提供了更强大、更稳定的技术支持。其前端采用 Vue3 等技术框架,具备场景建模、界面开发、系统对接、组件拓展、数据并发处理、动态菜单、权限校验、按钮级别权限控制等丰富功能。同时,该平台还提供大数据管理功能和 SQL 查询接口,能够流畅地处理数据,满足企业在数字化转型过程中对数据处理和分析的需求。
2025-06-27 17:24:24
835
原创 为什么说方法的参数最好不要超过4个?
在很多年前的一次Code Review中,有大佬指出,,对于当时还是萌新的我,虽然不知道什么原因,但听人劝,吃饱饭,这个习惯也就传递下来了,直到参加工作很多年后,才明白这其中的缘由。
2025-06-27 15:44:23
626
原创 100万QPS短链系统如何设计?
凌晨两点,监控大屏突然飙红——短链服务QPS突破80万!数据库连接池告急,Redis集群响应延迟突破500ms。这不是演习,而是某电商平台大促的真实场景。当每秒百万级请求涌向你的短链服务,你该如何设计系统?今天这篇文章跟大家一起聊聊100万QPS短链系统要如何设计?希望对你会有所帮助。四大设计原则:无状态设计:跳转服务完全无状态,支持无限扩展读多写少优化:将读性能压榨到极致分而治之:数据分片,流量分散柔性可用:宁可部分降级,不可全线崩溃。
2025-06-26 18:01:10
1203
原创 接口设计的原则:构建优雅API的完整指南
接口设计是定义系统不同组件之间交互方式的过程。它包括方法签名、参数定义、返回值、异常处理等方面的设计。好的接口设计能够隐藏实现细节,提供清晰的调用方式。每个接口应该只负责一个明确的功能,不应该承担多个不相关的职责。这是接口设计的基础原则。接口应该对扩展开放,对修改关闭。设计时要考虑未来的扩展需求,避免频繁修改已有接口。子类对象应该能够替换父类对象,而不影响程序的正确性。接口的实现类应该完全遵循接口的契约。不应该强迫客户依赖于它们不使用的方法。设计小而专一的接口,而不是大而全的接口。
2025-06-26 16:54:51
1008
原创 商品中心—商品B端搜索系统的实现文档
在ES里建立索引时,都是根据文本内容类型的字段来建立索引的。而这些字段如果是中文,就要使用中文分词器来进行分词。所以在落地搜索系统时,中文分词器的实现是至关重要的,这个是必须要做的。原生开源的IK分词器不太好用,一般都要对IK分词器进行改造,基于IK分词器的源码进行二次开发。要进行中文分词,首先就需要有中文词库。比如对"我特别喜欢在床上看书"这句话进行分词,中文词库中有"特别"、"喜欢"、"看书"三个词。那么就会把上面这句话分成:我、特别、喜欢、在、床、上、看书。
2025-06-24 17:08:58
596
原创 Spring IoC容器与依赖注入深度解析
解耦组件:通过容器管理依赖关系,组件无需硬编码依赖对象的创建逻辑。提升可测试性:依赖可通过模拟对象注入,无需启动完整容器即可测试组件。灵活配置:支持 XML、注解、Java 配置等多种方式,适应不同团队技术栈。
2025-06-23 17:16:44
824
原创 Spring Boot 启动优化实践
随着业务的发展,笔者项目对应的Spring Boot工程的依赖越来越多。随着依赖数量的增长,Spring 容器需要加载更多组件、解析复杂依赖并执行自动装配,导致项目启动时间显著增长。在日常开发或测试过程中,一旦因为配置变更或者其他热部署不生效的变更时,项目重启就需要等待很长的时间影响代码的交付。加快Spring项目的启动可以更好的投入项目中,提升开发效率。整体环境介绍:Spring版本:4.3.22Spring Boot版本:1.5.19内存:24GB优化前启动耗时:280秒。
2025-06-20 17:29:25
583
原创 Java线程池详解:高效并发编程的核心利器
线程池就像一个"线程工厂",它预先创建一定数量的工作线程并放在"池子"里待命。当有任务需要执行时,不需要重新创建线程,而是直接从池子里取一个空闲线程来干活。任务完成后,线程不会被销毁,而是重新回到池子里等待下一个任务。这就好比一个餐厅,与其每来一个客人就临时招聘一个服务员,不如提前雇好几个服务员待命,这样既节省了招聘成本,又能保证服务质量。线程池是Java并发编程的核心工具,掌握其原理和配置对于构建高性能应用至关重要。
2025-06-20 15:39:57
1144
原创 “简化开发,却被部署难哭?”低代码+Kubernetes=完美解决方案!
JNPF 低代码开发平台与 Kubernetes 的结合,为企业的应用开发和部署带来了显著的优势。它不仅简化了开发过程,提高了开发效率,还解决了传统低代码平台部署难题,实现了高效的容器化部署、自动化运维和灵活的弹性伸缩。通过实际项目案例可以看到,这种结合能够帮助企业快速响应市场变化,降低成本,提升竞争力。展望未来,随着技术的不断发展,低代码开发平台和容器编排技术有望在更多领域得到应用。低代码开发平台将更加智能化,能够提供更强大的功能和更便捷的开发体验;
2025-06-19 17:21:18
1257
原创 C# 将 CSV 转化为 Excel
在实际应用中,我们经常需要将 CSV 文件转化为 Excel 文件,以利用 Excel 的强大功能进行数据分析和展示。:借助合适的第三方库,如 EPPlus(一个开源的用于创建和操作 Excel 文件的库)来创建一个新的 Excel 工作簿。:遍历 CSV 文件的每一行,将每行数据按逗号分割,并逐列写入到 Excel 工作表的相应单元格中。要确保 CSV 文件的路径和 Excel 文件的保存路径是正确的,并且程序对这些路径具有读写权限。:将创建好的 Excel 工作簿保存到指定的文件路径。
2025-06-19 15:32:25
503
原创 FactoryBean 和BeanFactory的傻傻的总是分不清?
作用:作为 Spring 容器的根接口,负责管理所有 Bean 的生命周期。示例// 通过 BeanFactory 获取 Bean解耦配置与逻辑:通过将复杂初始化逻辑封装,Spring 容器只需管理 Bean 的声明。支持动态创建:可根据运行时条件(如环境变量、配置参数)动态生成不同对象。统一资源管理:集中管理中间件的连接池、配置参数,便于维护和扩展。是Spring 容器本身,负责管理所有 Bean。是容器中的一个 Bean,负责生产其他 Bean。&beanName。
2025-06-18 17:47:10
688
原创 商品中心—自研缓存框架的技术文档
数据表缓存组件实例中会封装一些获取DB数据表数据、获取缓存key等方法,而其继承的抽象类会提供一些根据DB获取缓存、刷新缓存等模版方法。通用缓存读写组件也包含两个必备组件:一个操作缓存的RedisCache组件 + 一个操作分布式锁的RedisLock组件。通用缓存读写组件封装了大量基础的缓存读写操作,这些基础的缓存读写操作会结合DB读库 + 缓存问题等解决方案来进行实现。每个数据表缓存组件都会有至少两个必备组件:一个通用缓存读写组件 + 一个数据表的DB操作组件。该组件主要提供对数据表数据的查询方法。
2025-06-18 16:21:30
306
原创 TypeScript实用类型之Omit
(实用工具类)包含一系列预定义的类型,用于简化类型操作,善用这些类型可以让我们的代码更加简洁优雅,今天来学习一下Omit类型。Omit类型可以优雅的解决类型重复问题,避免冗余代码。Omit类型的作用是什么?与以往不同,我们先不介绍晦涩难懂的概念,而是从一个实际的例子出发,进而引出这个类型。
2025-06-17 17:28:03
627
原创 Java 内存模型与 Happens-Before 关系深度解析
JLS(Java 语言规范)定义的 Happens-Before 关系是一种偏序关系,用于判断在多线程环境下,一个操作的结果是否对另一个操作可见。若操作 A Happens-Before 操作 B,则 A 的执行结果对 B 可见,且 A 的执行顺序优先于 B。关键性质不表示时间上的先后顺序,而是结果的可见性保证(时间先后不蕴含 Happens-Before,反之亦然)。是 JMM 定义的唯一线程间通信机制,所有可见性分析必须基于 Happens-Before 规则。
2025-06-17 16:02:03
640
原创 你了解CAS吗?有什么问题吗?如何解决?
CAS全称Compare And Swap,比较与交换,是乐观锁的主要实现方式。CAS在不使用锁的情况下实现多线程之间的变量同步。内部的AQS和原子类内部都使用了CAS。CAS算法涉及到三个操作数:需要读写的内存值V。进行比较的值A。要写入的新值B。只有当V的值等于A时,才会使用原子方式用新值B来更新V的值,否则会继续重试直到成功更新值。在Java中,CAS操作主要通过java.util.concurrent.atomic包中的类来实现。
2025-06-16 17:40:35
673
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人