- 博客(829)
- 收藏
- 关注
原创 后端思维之高并发处理方案
通俗来讲,高并发是指在同一个时间点,有很多用户同时访问同一API接口或者Url地址。它经常会发生在有大活跃用户量,用户高聚集的业务场景中简单的说,高并发是指系统在同一时间内接受到大量的客户端请求访问,需要系统(服务端)能够快速响应并处理请求的能力。在咱们互联网应用中,例如电商、游戏等在做活动或者促销的时候,这些热点业务就非常大可能同时被大量用户访问,并造成系统较大的负载。
2025-04-01 17:22:14
1187
原创 zk基础—一致性原理和算法
二阶段提交协议解决了分布式事务的原子性问题,保证了分布式事务的多个参与者要么都执行成功,要么都执行失败。但是在二阶段解决部分分布式事务问题的同时,依然存在一些难以解决的诸如同步阻塞、无限期等待和脑裂等问题。三阶段提交协议则是在二阶段提交协议的基础上,添加了PreCommit过程,从而避免了二阶段提交协议中的无限期等待问题。Paxos算法引入过半的理念,也就是少数服从多数的原则。Paxos算法支持分布式节点角色之间的轮换,极大避免了分布式单点故障。
2025-04-01 15:11:04
654
原创 Go语言实现1024终端游戏-不到400行代码
使用 go 语言实现的 1024 终端游戏,不到400行代码,代码简洁,以便理解和学习和掌握 go 语言开发.
2025-03-31 16:33:50
476
原创 为什么构造函数需要尽可能的简单
最近在做一些代码重构,涉及到Python中部分代码重构后,单元测试实现较为麻烦甚至难以实现的场景,其中一个主要的原因是构造函数过于复杂。因此,本篇文章借此总结一下我们应该需要什么样的构造函数。本篇文章涉及的概念不仅限于Python。
2025-03-31 15:07:04
778
原创 史上最全EffectiveJava总结(四)
在没有考虑默认序列化形式是否合适之前,不要接受它。如果对象的物理表示与其逻辑内容相同,则默认的序列化形式可能是合适的。/*** @serial*//*** @serial*//*** @serial*/即使你认为默认的序列化形式是合适的,你通常也必须提供readObject方法来确保不变性和安全性。Entry next;当对象的物理表示与其逻辑数据内容有很大差异时,使用默认的序列化形式有四个缺点:将导出的 API 永久地绑定到当前的内部实现。占用过多的空间。
2025-03-28 16:36:46
829
原创 史上最全EffectiveJava总结(三)
类似的例子还有构造函数。注意,防御性拷贝是在检查参数的有效性之前制作的,这样保证在检查参数和复制参数之间的时间段,类不受来自其他线程更改的影响。之所以没有使用 Date 的 clone 方法来创建防御性拷贝,是因为 Date 不是 final 的,所以不能保证 clone 方法返回一个Date 的实例对象,它可以返回一个不受信任子类的实例,有从这里发起恶意破坏的风险。因为方法可能会在执行过程中出现让人困惑的异常而失败,或者计算出错误的结果然后返回,甚至可能埋藏隐患,导致将来在不确定的某处代码产生错误。
2025-03-28 14:52:22
1012
原创 Netty源码—ByteBuf原理二
首先从线程对应的PoolThreadCache里获取一个PoolArena,然后从PoolArena的一个ChunkList中取出一个Chunk进行内存分配。接着,在这个Chunk上进行内存分配时,会判断需要分配的内存大小是否大于一个Page的大小。如果需要分配的内存超过一个Page的大小,那么就以Page为单位进行内存分配。如果需要分配的内存远小于一个Page的大小,那么就会找一个Page并把该Page切分成多个SubPage然后再从中选择。
2025-03-27 14:50:22
983
原创 Netty源码—ByteBuf原理一
AbstractByteBufAllocator实现了ByteBufAllocator的大部分功能,并最终暴露出两个基本的API,也就是抽象方法newDirectBuffer()和newHeapBuffer()。这两个抽象方法会由PooledByteBufAllocator和UnpooledByteBufAllocator来实现。
2025-03-26 17:40:59
555
原创 史上最全EffectiveJava总结(二)
这是因为编译器将首先编译 Main.java,当它看到对 Utensil 的引用(在对 Dessert 的引用之前)时,它将在 Utensil.java 中查找这个类,并找到餐具和甜点。后者当然是更加安全的。下面的例子实现了以类型作为键的缓存,它是类型安全的,例如以String类型为键读取时,读到的对象肯定也是String类型,而不是Integer类型。有时,你需要创建一个对象,该对象是不可变的,但适用于许多不同类型,这时可以用泛型单例工厂模式来实现,如 Collections.emptySet。
2025-03-25 16:06:28
911
原创 史上最全EffectiveJava总结(一)
接口只应该用来定义类型,不要用来导出常量。常量接口时对接口的不良使用。实现常量接口,会导致把这样的实现细节泄漏给该类的导出 API 中,当类不再需要这些常量时,还必须实现这个接口以确保兼容性。如果非final类实现了该常量接口,它的所有子类的命名空间都将被接口中的常量污染。想要导出常量,可以把它们放在相关的类中,如Integer类中的MAX_VALUE;或者定义一个XXXConstants类来存放一组相关的常量。
2025-03-25 14:24:58
1058
原创 Mybatis-Plus知识点详解
在实体类上使用Mybatis-plus的注解→指定数据库查询的表,不添加默认将类名改为下划线型数据库名→用于给主键标记,name为数据库对应名,用于指定自增算法雪花算法(Snowflake)是由Twitter开源的一种分布式ID生成算法.其核心思想是将64位的long型ID分为四个部分,分别为:符号位,时间戳,工作机器ID,序列号@Data@TableName("user") // 指定数据库表名@TableId(type = IdType.AUTO) // 主键自增。
2025-03-24 17:24:49
347
原创 【Guava工具类】Strings&Ints
这里调用了Strategy的iterator方法,这个方法在 静态创建Splitter中 里面有多种的实现方法,再结合内部类中的 SplittingIterator类重写的迭代方法,这里就形成了一个特殊的容器返回。也就是说,真正的拆分字符串动作是在迭代的时候进行的,即在这个函数中进行的。这里实现了一个惰性迭代器:惰性迭代器就是指 直到不得不计算的时候才会去将字符串分割,即在迭代的时候才去分割字符串,无论将分隔符还是被分割的字符串加载到Splitter类中,都不会去分割,只有在迭代的时候才会。
2025-03-24 14:52:11
709
转载 解决Linux下文本文件中文乱码问题
本篇我们介绍下在OS上的文本文件中文乱码问题。操作系统是Linux(OEL 8.10),所有文件是打了一个压缩包上传的,上传解压后发现其中的文本文件中文乱码。这通常是文本文件的字符编码导致。举个例子。现在有两个文件:xx.txt是我自己vi编辑新建的yy.txt这里代表的是同事发我的一些测试文件看到两个文件是和,但同事已经提前告诉我相关测试文件是GBK编码的,所以我不需要过多考虑。至于为什么显示iso-8859-1,是因为 file 命令有时可能会错误识别 GBK 为 ISO-8859-1。
2025-03-22 10:02:01
32
原创 一文速通Python并行计算:00 并行计算的基本概念
什么是传统的串行计算?传统的软件是按照串行计算的编程思想来编写的。串行计算程序是运行在具有一个核心(或 CPU)的单机上。一个等待解决的问题被分解为一串独立的命令执行(instructions 命令执行流,也可以是线程)。命令执行流会一个挨一个的,顺序执行。并且在任一时刻都只有一个命令执行流正在执行中。换句话说,任何时候只有一个线程在执行。并行计算用最简单的话来解释并行计算就是同时使用 多个计算资源 (就是多个 CPU)去运行程序来解决一个需要大量计算的问题。
2025-03-21 16:39:57
625
原创 C# 中比较实用的关键字,基础高频面试题!
在C#编程中关键字是构建逻辑和实现功能的基石,它承载着编程语言的语法规则和编程智慧。熟练掌握这些基础高频关键字对提升编程能力和面试表现至关重要,它们是日常开发和解决复杂问题的关键。
2025-03-21 14:26:47
1059
原创 maven为什么发生依赖冲突?怎么解决依赖冲突?
我们在开发的时候,偶尔会遇到依赖冲突的时候,一般都是NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError。打开搜索框又发现有这个类,明明就是引入进来了,就是找不到,让人头疼。通俗一点就是,就近原则如果相同判断不出来,谁先来谁选择谁假设:我有个A项目。在maven中依赖管理,依赖是可以传播的假设:我有个A项目。第一步A项目引入B依赖,B依赖又会引入C依赖(版本1.1)。针对依赖冲突场景提出的问题,答案是:1.1版本为什么是1.1 版本?
2025-03-20 16:51:39
574
2
原创 Netty源码—服务端启动流程
用户调用启动辅助类ServerBootstrap的bind()方法时,第一步通过反射创建服务端Channel会执行NioServerSocketChannel的默认构造方法,来创建一个NioServerSocketChannel对象,并且在创建过程中会创建Netty的一系列核心组件:如Channel、ChannelConfig、ChannelId、Unsafe、ChannelPipeline。ServerBootstrap.bind() //用户代码入口。
2025-03-20 15:24:16
711
原创 Docker | 如何在 Linux 服务器使用 docker
ssh 连接不成功(比如让输密码),很可能是 docker 内外的 .ssh 或 authorize_keys 的权限出了问题,docker 外要改成 boss,dockers 内要改成 <user_name>。新建准备放 docker 的目录,并改变目录权限:(<user_name> 是我的名字,在跑命令时,需要替换成希望 docker 拥有的名字)(boss 和 172.16.1.100 地址均为虚构,在使用时,需要替换成自己希望配置的服务器地址,和可以使用的账号)以下教程是 LLM 生成的)
2025-03-19 16:57:57
429
原创 程序员摆烂新姿势:低代码开发竟让我1人干翻10人团队!
为了让大家更直观地感受低代码开发的强大威力,我们来看一个真实的案例。这是一个企业级的项目,目标是开发一个功能全面的客户关系管理系统(CRM)。该系统需要涵盖客户信息管理、销售流程管理、市场营销活动管理、数据分析等多个模块,以满足企业日益增长的业务需求。在这个项目中,传统开发团队由 10 人组成,包括项目经理、产品经理、前端开发工程师、后端开发工程师、测试工程师等。他们有着丰富的开发经验,熟练掌握各种传统开发技术和工具。而低代码开发者这边,只有小李一人。
2025-03-18 17:01:39
1125
原创 Netty基础—Netty实现消息推送服务
首先添加HTTP请求消息解码器HttpRequestDecoder,因为浏览器会把按照HTTP协议组织起来的请求数据序列化成字节数组发送给服务器,而HttpRequestDecoder可以按照HTTP协议从接收到的字节数组中读取出一个完整的请求数据。浏览器里面运行的是HTML网页代码,WebSocket就是在HTML网页代码里嵌入WebSocket代码,可以让浏览器里的HTML网页代码跟NettyServer建立连接,并且是基于长连接发送数据。它意味着同一时刻,只能有一个方向上的数据在进行传输。
2025-03-18 16:05:16
758
原创 测试真的比不上开发吗?
传统手工测试需求减少,但自动化、AI 测试工程师缺口扩大。企业愈发重视测试左移(参与需求评审)和测试右移(监控线上日志),测试角色正从“事后检查”转向“全流程质量管控”。测试开发工程师(SDET)需同时精通开发与测试框架设计,这类岗位的技术要求已与开发无异,甚至需要更强的工程化思维。综上所述,测试并非比不上开发,二者如同“矛与盾”,缺一不可。行业早期因质量意识薄弱导致测试被低估,但随着数字化转型深入,企业对稳定性和用户体验的要求提升,测试的价值正在回归。职业选择没有高下之分,只有适不适合。
2025-03-18 15:03:26
419
原创 Arrays工具类教你优雅地管理数组数据
数组专用工具类指的是 类,基本上常见的数组操作,这个类都提供了静态方法可供直接调用。毕竟数组本身想完成这些操作还是挺麻烦的,有了这层封装,就方便多了。功能:返回由指定数组支持的固定大小的列表参数:asList(T… a)返回值:一个列表需要注意的是,add方法和remove会报错。这是因为asList() 返回的是Arrays类的内部类:这个内部类也继承了 java.util.AbstractList 类,重写了很多方法,比如contains方法、set方法,但是却没有重写add方法,
2025-03-17 17:10:29
733
原创 nginx 简单实践:负载均衡【nginx 实践系列之四】
本文为 nginx 简单实践系列文章之三,主要简单实践了负载均衡,仅供参考。注意:可以使用测试域名,但前提是要修改 hosts 文件路径和重启:Linux(/etc/hosts)(重启命令:/etc/init.d/network restart);例如:192.168.1.1 www.testczzj.com负载均衡(Load Balance,简称 LB)是高并发、高可用系统必不可少的关键组件,目标是尽力将网络流量平均分发到多个服务器上,以提高系统整体的响应速度和可用性。负载均衡通过算法调整负载,
2025-03-17 15:36:08
1242
原创 99%程序员不知道:用AI低代码开发OA系统,效率提升10倍
后来,该企业尝试使用 AI 低代码开发平台对 OA 系统进行升级和扩展,仅用了 1 个半月时间,投入人力成本 20 万元,就完成了新功能的开发和上线,而且系统运行稳定,用户体验良好。人力成本的降低十分明显。之前,该企业使用的是一套传统的 OA 系统,但随着业务的快速发展,系统逐渐暴露出功能不足、流程繁琐、维护困难等问题,已经无法满足企业的办公需求。以宜搭低代码开发平台为例,开发人员通过简单的拖拽操作,就能将各种组件,如文本框、按钮、表格等,放置到页面上,快速搭建出应用程序的界面,就像搭积木一样简单。
2025-03-14 17:21:55
1197
原创 学习高可靠Redis分布式锁实现思路
但当系统拆分为分布式架构后(目前大多数公司应该不会只是单体应用了),锁失效:锁自动过期但业务未执行完,其他客户端抢占资源。续期间隔=过期时间/3(如30s过期则10s续期)加锁成功但未设置过期时间,服务宕机导致死锁。双重校验锁状态(内存标记+Redis实际值)原子性:单命令完成"判断+设置+过期"操作。锁误删:客户端A释放了客户端B持有的锁。竞态条件:多人操作共享资源,顺序不可控。校验value避免误删其他线程的锁。参数校验:防止传入非法过期时间。在单体应用时代,我们使用。就成了必须要解决的问题。
2025-03-14 15:54:50
446
原创 Netty基础—NIO的使用简介
一.短连接客户端每次建立一个连接,发送一个请求,获取一个响应,然后就断开连接,就是所谓的短连接。二.长连接客户端每次建立一个连接,可以发送很多个请求,一直持续维持这个TCP连接,不断开连接。客户端持续通过这个连接与服务端进行通信,不停地发送数据和请求。服务端也长期维持这个连接,不停地接受请求返回响应。这个就是所谓的长连接,连接存在的时间很长的。所以只要客户端不停地发送请求不释放连接,那么就是长连接了。优点一:SocketChannel的连接操作是异步的。
2025-03-14 14:30:04
739
原创 3天开发智能工厂系统?低代码+工业4.0实战,程序员效率飙升90%!
通过本次低代码开发智能工厂系统的实战,我们深刻体会到了低代码开发技术在工业领域的强大威力。它以高效、便捷的开发方式,让我们在短短 3 天内就实现了智能工厂系统从无到有的搭建,大大缩短了项目周期,提高了开发效率。低代码开发不仅为程序员减轻了工作负担,使其能够将更多精力投入到核心业务逻辑的优化上,还为企业带来了显著的经济效益和竞争力提升。在工业 4.0 的大背景下,智能工厂的建设是企业实现数字化转型和提升竞争力的关键。低代码开发技术作为一种创新的开发模式,为智能工厂系统的开发提供了新的思路和方法。
2025-03-13 17:27:42
1166
原创 SpringCloud带你走进微服务的世界
单体架构:简单方便,高度耦合,扩展性差,适合小型项目。例如:学生管理系统分布式架构:松耦合,扩展性好,但架构复杂,难度大。适合大型互联网项目,例如:京东、淘宝微服务:一种良好的分布式架构方案①优点:拆分粒度更小、服务更独立、耦合度更低②缺点:架构非常复杂,运维、监控、部署难度提高SpringCloud是微服务架构的一站式解决方案,集成了各种优秀微服务功能组件Ribbon 是一个基于 Http 和 TCP 的客服端负载均衡工具,它是基于 Netflix Ribbon 实现的。
2025-03-13 15:59:01
981
原创 吐血整理!2025 最好用 AI 工具全汇总,别再瞎找了!
在当下这个 AI 蓬勃发展的时代,各类 AI 工具如雨后春笋般涌现,让人眼花缭乱。无论是职场人士想要提升工作效率,还是创作者渴望激发灵感、优化内容,亦或是学生期望找到学习的得力助手,都在苦苦寻觅真正好用、实用的 AI 工具。。今天,就为大家吐血整理 2025 年最好用的 AI 工具,让你从此告别盲目寻找,一站式获取最优质的资源。(本篇主要针对)有一些甚至是自己日常深度使用的产品,帮大家摆脱选择恐惧症。
2025-03-13 14:32:52
796
原创 Netty基础—网络编程基础二
既然是通信,那么肯定会有两个对端。在网络编程里提供服务的一方叫服务端,连接服务端使用服务的另一方叫客户端。如果类的名字有Server或ServerSocket,则表示这个类是给服务端用的。如果类的名字只有Socket的,则表示这个类是负责具体的网络读写的。对于服务端来说ServerSocket只是个场所,具体和客户端沟通的是Socket。所以在网络编程里,ServerSocket并不负责具体的网络读写,ServerSocket只负责接收客户端连接后分配一个Socket处理具体网络读写。
2025-03-12 17:35:00
695
原创 TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
🔮 集八字、六爻、塔罗等多种传统算命方式于一体🧠 集成DeepSeek AI模型进行智能解读🌐 现代化UI设计与响应式布局🚀 基于TypeScript的强类型开发体验。
2025-03-12 16:06:20
500
原创 紧急通知!教育部力推的低代码教育白皮书,这5个案例让同行慌了…
目录低代码教育白皮书:开启教育新时代低代码技术:教育数字化的秘密武器(一)低代码技术的内涵(二)低代码技术在教育领域的独特优势五大震撼案例,低代码如何颠覆教育(一)案例一:智慧校园的崛起 - 江西科技学院 “云上江科”(二)案例二:精准教学的实践 - 某中学个性化学习平台(三)案例三:家校共育的桥梁 - 某小学家校沟通应用(四)案例四:高效管理的变革 - 某高校教学管理系统升级(五)案例五:教育公平的助力 - 偏远地区学校的数字化逆袭同行们的危机感从何而来未来展望:低代码教育的无限可能最近,教育领域迎来了一
2025-03-11 18:01:24
1155
原创 Netty基础—网络编程基础一
OSI是Open System Interconnect的简称,即开放系统互连参考模型。OSI为开放系统的计算机互连提供了一个共同的基础和标准框架,并为保持相关标准的一致性和兼容性提供了共同的参考。OSI采用了分层的结构化技术,共分七层,分别是:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。(应表会传网数物)物理层并不是指物理媒体本身,而是指开放系统中利用物理媒体实现物理连接的功能描述,物理层的媒体包括架空明线、平衡电缆、光纤、无线信道等。功能一:为数据端设备提供传送数据的通路。
2025-03-11 16:28:43
290
原创 【设计模式】从火车站卖票看代理模式的实际应用
由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。Java中的代理按照代理类生成时机不同又分为静态代理和动态代理。静态代理类在编译期就生成,而动态代理代理类则是在Java运行时动态生成。动态代理又有JDK代理和CGLib代理两种。
2025-03-11 14:32:11
806
原创 并发编程知识总结
内核模式下的崩溃是灾难性的;比如ConcurrentHashMap#initTable 方法中就使用了yield方法,这是因为ConcurrentHashMap中可能被多个线程同时初始化table,但是其实这个时候只允许一个线程进行初始化操作,其他的线程就需要被阻塞或等待,但是初始化操作其实很快,这里Doug Lea大师为了避免阻塞或者等待这些操作引发的上下文切换等等开销,就让其他不执行初始化操作的线程干脆执行yield()方法,以让出CPU执行权,让执行初始化操作的线程可以更快的执行完成。
2025-03-10 17:29:56
632
原创 震惊!C++程序真的从main开始吗?99%的程序员都答错了
通过这篇文章,我们已经揭开了C++程序启动过程的神秘面纱:1、C++程序根本不是从main函数开始的!在main执行前,系统和运行时库已经偷偷做了大量工作2、全局变量和对象在main函数执行前就已经初始化完毕,这就是为什么main函数一开始就能使用它们3、main函数结束不等于程序结束,之后还有全局对象析构、资源释放等一系列"收尾工作"4、跨文件的全局对象初始化顺序是个"定时炸弹",搞不好就会引发难以察觉的bug。
2025-03-10 15:22:31
986
原创 千万开发者收藏!低代码如何颠覆传统开发?这波转型红利你抓住了吗
目录低代码,IT 行业的新曙光?传统开发的困境(一)开发周期漫长(二)人力成本高昂(三)维护与升级困难低代码开发,破局之道(一)低代码开发的定义与原理(二)低代码开发平台的特点低代码颠覆传统开发的关键体现(一)开发效率呈指数级提升(二)降低技术门槛,扩大开发群体(三)成本大幅降低(四)灵活迭代,适应变化转型红利,你准备好了吗(一)低代码为开发者带来的机遇(二)企业如何抓住低代码转型红利挑战与应对(一)低代码开发面临的挑战(二)应对策略低代码的未来蓝图在当今数字化浪潮汹涌澎湃的时代,IT 行业正经历着前所未有
2025-03-07 17:20:28
823
原创 关于大模型这些术语,你都知道吗?
在当今的科技领域,大模型和AI技术的发展可谓是日新月异。在初学大模型的时候,大家肯定会碰到各种专业术语,让人眼花缭乱。本文将为您简单地解释一些关键术语,帮助您在学习过程中更好地理解大模型和AI的世界。
2025-03-07 16:07:33
895
原创 分布式锁—Redisson的读写锁
RedissonReadWriteLock提供了两个方法分别获取读锁和写锁。RedissonReadWriteLock的readLock()方法可以获取读锁RedissonReadLock。RedissonReadWriteLock的writeLock()方法可以获取写锁RedissonWriteLock。
2025-03-07 14:27:31
632
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人