- 博客(334)
- 收藏
- 关注
原创 掌握8条泛型规则,打造优雅通用的Java代码
使用泛型能够指定对象类型,在编译期间进行类型擦除并强制转换为对应类型除了兼容历史版本、获取Class对象、使用interface三种情况只能使用原生态类型,其他情况下都建议使用泛型泛型能够带来安全、灵活的特点,当无法预估对象类型时可以使用或无限制通配符<?
2025-01-11 19:30:00
609
原创 MapStruct Plus的简单使用
MapStruct Plus 是一个增强工具,用于简化 Java 类型之间的转换。它基于 MapStruct 框架,通过注解自动生成两个类之间的映射接口,这样就免去了手动定义映射接口的步骤,使得 Java 类型转换更加便捷和优雅。MapStruct Plus 支能够在编译期完成所有生成工作,提高了开发效率。
2025-01-11 16:00:00
363
原创 尊嘟假嘟?三行代码提升接口性能600倍
感觉压测环境还是有必要的,有些问题数据量小了或者请求并发不够都没法暴露出来,同时以后写代码可以提前把sql在数据库explain下看看性能如何,毕竟能跑就行不是我们的追求😏。
2025-01-11 14:30:00
889
原创 SpringBoot责任链与自定义注解:优雅解耦复杂业务
通过使用责任链模式,我们可以更优雅地组织和扩展业务逻辑。在Spring Boot中,结合自定义注解和@Qualifier注解,以及构造函数注入,可以实现更清晰、可读性更强的代码。通过控制处理者的顺序,我们可以确保责任链的执行顺序符合业务需求。责任链模式的优雅实践使得我们的代码更具可维护性,更容易应对业务的变化。在设计和实现中,要根据实际业务场景的需要进行灵活调整,以达到最佳的解耦和可扩展性。有的小伙伴可能也会发现我们的类定义为,很熟悉,是的,此类名参考一个规则引擎开源项目LiteFlow。
2025-01-11 14:00:00
768
原创 Spring Boot项目如何优雅丝滑地从Date过渡到LocalDateTime
我们都知道大部分开发人员是守旧的,我Date用的好好的,也用了这么多年了,现在要换成Java 8提供的全新,你说换就换啊???兼容吗?出问题了谁负责?😄 所以在项目中大家从Date过渡到使用类型字段作为接口出入参数,能正常映射转换前端传入的参数吗?返回参数前端是否能收到一个正常的日期时间字段值?使用类型作为数据库实体类对象字段,能正常写入数据库和读取吗?简单来说就是看数据库能否正常序列化和反序列化等Java 8提供的全新日期时间类型。接下来就分别看看这两个困扰在大家心中的问题吧。
2025-01-11 12:30:00
945
原创 Springboot3.4.0结构化日志
日志排查,是系统故障排除必不可少的重要环节,Springboot3.4.0版本发布之后,支持日志结构化,它支持Elastic Common Schema (ECS)和Logstash格式,但也可以使用自己需要的日志格式进行扩展Springboot3.4.x版本提供了接口自定义日志格式化只有Springboot3.4.0才支持1、定义一个日志类@Override然后再配置这个时候,日志会按我们需要的进行打印结构化日志可以帮助在开发过程中,更好的定义日志输出等,至于需不需要,就各自系统开发需求。
2025-01-11 10:30:00
340
原创 Mysql中Varchar(50)和varchar(500)区别是什么?
其实sort_merge_passes对应的就是MySQL做归并排序的次数,也就是说,如果sort_merge_passes值比较大,说明sort_buffer和要排序的数据差距越大,我们可以通过增大sort_buffer_size或者让填入sort_buffer_size的键值对更小来缓解sort_merge_passes归并排序的次数。我发现86%的时花在数据传输上,接下来我们看状态部分,关注Created_tmp_files和sort_merge_passes。本文我将带着这两个问题探讨验证一下。
2025-01-10 16:45:00
656
原创 CompletableFuture 超时功能有大坑,使用不当直接生产事故
从整体实现来说,JDK21前的版本有着内存泄露的bug,不过很少对实际生产有影响,因为任务的编排涉及的对象并不多,少量内存泄露最终会被回收掉。从单一功能内聚的角度来说,超时功能的实现是没有问题;然而由于并发编程的复杂性,可能会出现 Delayer 线程延迟执行的情况。本文将详细复现与讨论 CompletableFuture 超时功能的大坑,同时提供一些最佳实践指导。负责人更新了代码示例,。
2025-01-10 14:30:00
490
原创 utf8和utf8mb4有什么区别?
先说说什么是编码。编码就像我们日常生活中的语言,不同的地方说不同的话,编码就是计算机用来表示这些“话”的一种方式。比如我们使用汉字来说话,计算机用二进制数来表示这些汉字的方式,就是编码。utf8就是这样一种编码格式,正式点要使用:UTF-8,utf8是一个简写形式。
2025-01-10 13:00:00
637
原创 什么是 doris,为什么几乎国内大厂都会使用它
Apache Doris源于百度2008年启动的产品Palo在2018年捐献给Apache基金会,是一个基于 MPP 架构的高性能、实时的分析型数据库,他非常简单易用,而且性能还不错,仅需亚秒级响应时间即可获得查询结果,不仅支持高并发的查询场景,也可以支持高吞吐的复杂分析场景,比如你可以基于它做用户行为分析、日志检索平台、用户画像分析、订单分析等应用。Doris的架构非常简洁,易于运维,并且可以支持10PB以上的超大数据集。
2025-01-10 11:15:00
2104
原创 Java统计网站PV、UV
当一个系统上线后,基本都需要统计用户活跃度,活跃度一般有两个指标,一个是PV(Page View)页面浏览量,一个是UV(Unique Visitor)唯一用户量,比如微信小程序后台中就有每小时UV的统计。PV(Page View)页面浏览量,当页面被加载刷新一次,PV就会记录一次,一般PV越高,UV也会越高;但如果网站被爬虫或者被疯狂刷新,PV就会非常高。UV(Unique Visitor)独立用户量,一天当中访问网站的用户数,不管是上午访问还是下午访问,一个用户都只记录一次。
2025-01-10 09:15:00
1031
原创 神奇的Serializable接口,为什么有时候网络传输不用实现Serializable,有时候又需要?
如果使用java原生的网络传输方式(原生序列化方式)传输java对象就需要实现接口其他的更现代化的序列化方式一般都不需要实现接口,比如jsonprotobufhessian2等等我们使用dubbo的时候默认是需要实现接口的,因为dubbo存在接口检查机制,可以通过关闭dubbo的接口检查机制来解决这个问题。
2025-01-10 08:15:00
552
原创 redis 缓存雪崩、穿透、击穿、脑裂问题
缓存穿透的一个原因是有大量的恶意请求访问不存在的数据,所以,一个有效的应对方案是在请求入口前端,对业务系统接收到的请求进行合法性检测,把恶意的请求(例如请求参数不合理、请求参数是非法值、请求字段不存在)直接过滤掉,不让它们访问后端缓存和数据库。哨兵切换完成后,客户端会和新主库进行通信,发送请求操作。缓存击穿是指,针对某个访问非常频繁的热点数据的请求,无法在缓存中进行处理,紧接着,访问该数据的大量请求,一下子都发送到了后端数据库,导致了数据库压力激增,会影响数据库处理其他请求。
2025-01-09 20:45:00
978
原创 MySQL锁(乐观锁、悲观锁、多粒度锁)
Insert Intention Locks: 可以叫做插入意向锁,就是当前如果记录的下一条有gap或key-next锁,就不能插入,此时就会在内存中生成一个锁结构,表示某个间隙想要插入新纪录,正在等待,保存在下一条的数据行中。幻读已经被Gap锁解决了所以不会出现哈,这里是在可以插入的时候可能出现的错误,因为如果有Gap说明别的事务可能会读取数据,不能插入,只有提交了Gap锁取消了才能进行插入,隐式锁是在这时候发挥作用。但是如果想对表加X锁,或者表内的行加X锁,就需要进行排队等待表的S锁释放。
2025-01-09 18:30:00
938
原创 详解线程同步和线程互斥,Java如何实现线程同步和互斥
首先第一个问题,为什么进行线程同步和线程互斥?最开始我们的操作系统的作业的调度单位是进程,但是由于每个进程都单独占据一个资源,而且进程的形态转换非常的耗费系统资源。为了系统的调度更加轻量级,能够更好的支持并发,因此引入了线程这个概念。
2025-01-09 16:30:00
536
原创 本地方法栈、JVM栈、本地内存和JVM Heap的区别与关系
所以一个Java进程启动时,JVM向操作系统要的内存(-Xms与-Xmx),和程序向JVM要的内存是两件不同的事情了。所以到了某个具体的平台,被特定平台的JVM Runtime解释成本平台的machine code,得到可执行代码,存储到Native Code区,machine code运行起来之后就会用到Native Stack和Native Heap,这种把源代码先翻译成中间代码(即ByteCode)再由解释器解释成机器码供运行的模式,就实现了“Write Once,Run Anywhere”。
2025-01-09 16:00:00
604
原创 SpringBoot连接linux中的mysql(保姆级详解)
创建 pojo mapper DbModuleApplication resource。添加5个依赖 其中 mysql-connector-java 版本为5.1.38。mybatis-spring-boot-starter 版本为1.3.2。mybatis.cfg.xml 起别名。finalShell中的mysql配置。选中pom文件 删除junit。新建springBoot文件。右键父模块 新建module。选择子目录下的pom。
2025-01-09 14:15:00
279
原创 MySQL三大日志:binlog、redolog、undolog 详细解析
MySQL日志 主要包括错误日志、查询日志、慢查询日志、事务日志、二进制日志几大类。其中,比较重要的还要属二进制日志binlog(归档日志)和事务日志redo log(重做日志)和undo log(回滚日志)。今天就来聊聊redo log(重做日志)、binlog(归档日志)、两阶段提交、undo log(回滚日志)。
2025-01-09 14:00:00
1208
原创 spring源码解析:元注解功能的实现
众所周知,spring从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了springboot更是全面拥抱了注解式配置。平时在使用的时候,点开一些常见的等注解,会发现往往在一个注解上总会出现一些其他的注解,比如@Service大部分情况下,我们可以将@Service注解等同于@Component注解使用,则是因为 spring 基于其 JDK 对元注解的机制进行了扩展。
2025-01-09 13:00:00
1042
原创 MySQL默认值和约束的查询方法
nullable- 列的可空性属性:is nullable- 可以为空,not nullable- 不可为空。注意:如果您需要特定数据库(模式)的信息,请取消注释 where 子句中的条件并提供您的数据库名称。tables- 具有此约束的表数(或具有对NULL行没有约束的列的表数)database_name - 数据库的名称(模式)database_name - 数据库的名称(模式)column_name - 列的名称。column_name - 列的名称。table_name - 表的名称。
2025-01-09 11:15:00
426
原创 从 CPU 说起,深入理解 Java 内存模型
Java 内存模型规定所有的变量都存储在主内存中,每条线程都有自己的工作内存。线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递都需要通过主内存来完成。主内存、工作内存、线程三者之间的关系如下图所示。Java 内存模型图解Java 内存模型的主内存、工作内存与 JVM 的堆、栈、方法区,并不是同一层次的内存划分,两者是没有关联的。
2025-01-09 10:00:00
1548
原创 一文教你实现Java、Spring动态启停定时任务
现在是:2022-05-30T16:03:40.006现在是:2022-05-30T16:04现在是:2022-05-30T16:04:40.003。是单线程,如果开启多个线程服务,将会出现竞争,一旦出现异常,线程停止,定时任务停止;,一旦定时任务中某一过程时刻抛出异常,将会导致整体线程停止,定时任务停止。基于线程池实现多线程,且自动调整线程数,线程出错并不会影响整体定时任务执行。jdk自带的库中,有两种技术可以实现定时任务,一种是。方法将定时任务方法存放到任务队列中。兼容性更高,jdk1.3后使用。
2025-01-09 08:45:00
328
原创 Java实现手机验证码登录和SpringSecurity权限控制
Spring Security是 Spring提供的安全认证服务的框架。使用Spring Security可以帮助我们来简化认证和授权的过程。官网:https://spring.io/projects/spring-security。
2025-01-08 17:15:00
674
原创 Java Enum – Java 枚举示例讲解
Java 中的枚举(Enum)是一种特殊的数据类型,它包含一组预定义的常量。在处理不需要更改的值时,通常会使用enum,比如一周中的天数、一年中的季节、颜色等等。在本文中,我们将看到如何创建一个枚举enum以及如何将其值赋给其他变量。我们还将看到如何在switch语句中使用 enum 或循环遍历它的值。
2025-01-08 17:00:00
713
原创 Spring Boot整合Zookeeper实现分布式锁
锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源。分布式锁是控制 微服务集群 之间同步访问共享资源的一种方式。
2025-01-08 15:00:00
1426
原创 顶级Java才懂的,性能基准测试JMH
最近在手写一个ID生成器,需要比较UUID和目前比较流行的 NanoID之间的速度差异,当然也要测一下根据规则自创的ID生成器。这样的代码属于最基础的API,速度哪怕减上几纳秒,累加起来也是很可观的。关键是,我该如何评估ID的生成速度呢?
2025-01-08 13:15:00
914
原创 JAVA 多线程实现、线程池创建使用、多线程的异步操作
进程是:一个应用程序(1个进程是一个软件)。线程是:一个进程中的执行场景/执行单元。注意:一个进程可以启动多个线程。java主线程: 每个java程序都含有一个线程,那就是主线程(main线程)。Java应用程序都是从主类main方法执行的,当jvm加载代码,发现卖弄方法之后,就会启动一个线程,这个线程就是主线程,负责执行main方法。如果在主线程里面创建其他线程,就会在主线程和其他线程来回切换,直到其他所有线程结束才会结束主线程。
2025-01-08 13:15:00
903
原创 订单30分钟未支付自动取消怎么实现?
为了让大家更容易理解,上边的代码写的都比较简单粗糙,几种实现方式的demo已经都提交到github 地址:https://github.com/chengxy-nds/delayqueue,感兴趣的小伙伴可以下载跑一跑。这篇文章肝了挺长时间,写作一点也不比上班干活轻松,查证资料反复验证demo的可行性,搭建各种RabbitMQ、Redis环境,只想说我太难了!
2025-01-08 11:30:00
1093
原创 MySQL百万数据深度分页优化思路分析
我们现在知道了LIMIT 遇到后面查询的性能越差,性能差的原因是因为要回表,既然已经找到了问题那么我们只需要减少回表的次数就可以提升查询性能了。
2025-01-08 09:45:00
1007
原创 Spring 响应式编程,真香。有了它还扯什么高并发异步编程
WebFlux 是 Spring Framework5.0 中引入的一种新的反应式Web框架。通过Reactor项目实现Reactive Streams规范,完全异步和非阻塞框架。本身不会加快程序执行速度,但在高并发情况下借助异步IO能够以少量而稳定的线程处理更高的吞吐,规避文件IO/网络IO阻塞带来的线程堆积。一个简单的处理请求和响应的抽象,用来适配不同HTTP服务容器的API。关于Spring MVC 和Spring WebFlux 测评很多,本文引用下做简单说明。
2025-01-08 08:30:00
825
原创 代码精简10倍,责任链模式yyds
责任链模式(Chain of Responsibility Pattern):避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。职责链模式是一种对象行为型模式。对象仅需知道该请求会被处理即可,且链中的对象不需要知道链的结构,由客户端负责链的创建,降低了系统的耦合度请求处理对象仅需维持一个指向其后继者的引用,而不需要维持它对所有的候选处理者的引用,可简化对象的相互连接在给对象分派职责时,职责链可以给我们更多的灵活性。
2025-01-07 21:45:00
919
原创 面试官:断网了还能 ping 通 127.0.0.1 吗?看完后网络知识又加深了
首先,这是个 IPV4 地址。IPV4 地址有 32 位,一个字节有 8 位,共 4 个字节。其中127 开头的都属于回环地址,也是 IPV4 的特殊地址,没什么道理,就是人为规定的。而127.0.0.1是众多回环地址中的一个。之所以不是 127.0.0.2 ,而是 127.0.0.1,是因为源码里就是这么定义的,也没什么道理。回环地址IPv4 的地址是 32 位的,2的32次方,大概是40+亿。地球光人口就76亿了,40亿IP这点量,塞牙缝都不够,实际上IP也确实用完了。
2025-01-07 20:00:00
621
原创 新来个技术总监:发现谁在用 delete 删数据直接开除
通过从InnoDB存储空间分布,delete对性能的影响可以看到,delete物理删除既不能释放磁盘空间,而且会产生大量的碎片,导致索引频繁分裂,影响SQL执行计划的稳定性;同时在碎片回收时,会耗用大量的CPU,磁盘空间,影响表上正常的DML操作。在业务代码层面,应该做逻辑标记删除,避免物理删除;为了实现数据归档需求,可以用采用MySQL分区表特性来实现,都是DDL操作,没有碎片产生。
2025-01-07 18:45:00
639
原创 谈一谈大厂都怎么防止重复下单?
如订单支付后,seller 要发货,发货完成后要填个快递单号。假设 seller 填个 666,刚填完,发现填错了,赶紧再修改成 888。对订单服务,这就是 2 个更新订单的请求。系统异常时 666 请求到了,单号更成 666,接着 888 请求到了,单号又更新成 888,但是 666 更新成功的响应丢了,调用方没收到成功响应,自动重试,再次发起 666 请求,单号又被更新成 666了,这数据显然就错了!
2025-01-07 17:45:00
1454
原创 分享10个高级sql写法
MySql 中的排序 ORDER BY 除了可以用 ASC 和 DESC,还可以通过自定义字符串/数字来实现排序。这里用 order_diy 表举例,结构以及表数据展示:SELECT * from order_diy ORDER BY FIELD(title,'九阴真经','降龙十八掌','九阴白骨爪','双手互博','桃花岛主','全真内功心法','蛤蟆功','销魂掌','灵白山少主');
2025-01-07 15:30:00
887
原创 为什么程序员都不喜欢使用switch,而是大量的 if else if
这篇文章就差不多了,今天就是从 Dubbo 的一段代码开始了探险之旅,分析了波 if 和 switch,从测试结果来看 Dubbo 的这次优化还不够彻底,应该全部改成 if else 结构。而 swtich 从字节码上看是优于 if 的,但是从测试结果来看在分支很多的情况下能显示出优势,一般情况下还是打不过 if。
2025-01-07 14:15:00
1370
原创 MySQL之慢 SQL 定位、性能优化实践
SQL语句优化,尽量精简,去除非必要语句索引优化,让所有SQL都能够走索引如果是表的瓶颈问题,则分表,单表数据量维持在2000W(理论上)以内如果是单库瓶颈问题,则分库,读写分离如果是物理机器性能问题,则分多个数据库节点。
2025-01-07 12:45:00
948
原创 字节跳动面试官,我也实现了大文件上传和断点续传
任何看似简单的需求,量级提升后,都变得很复杂,人生也是这样文件上传简单,大文件就复杂,单机简单,分布式难就连一个简单的leftPad函数(左边补齐字符),考虑到性能,二分法性能都秒杀数组join ,引起大讨论论left-pad函数的实现任何一个知识点 都值得深挖产品经理下次再说啥需求简单,就kan他我准备结合上一篇,录一个大文件上传的手摸手剖析视频 敬请期待通俗的说,你把要上传的东西上传,服务器会先做MD5。
2025-01-07 11:00:00
590
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人