自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(38)
  • 收藏
  • 关注

原创 ConcurrentHashMap 原理

JDK7与JDK8中ConcurrentHashMap的核心差异及实现优化 摘要: 内部结构优化、线程安全机制、扩容优化、树化机制、延迟初始化、哈希优化。JDK8的改进显著提升了并发性能,解决了JDK7的并发死链问题,并通过更精细的锁机制和数据结构优化提高了整体效率。

2025-07-04 00:01:50 653

原创 LinkedBlockingQueue 原理

摘要:本文介绍了阻塞队列的入队出队操作实现原理,重点分析了LinkedBlockingQueue的双锁机制。入队操作在尾部插入,出队时删除头结点;使用putLock和takeLock两把锁分别控制入队和出队,通过notFull和notEmpty条件变量进行线程同步。相比ArrayBlockingQueue的单锁实现,LinkedBlockingQueue采用链表结构、延迟初始化、双锁分离,提升了并发性能。文中详细对比了两种队列在数据结构、锁机制和性能上的差异。(149字)

2025-07-04 00:01:04 775

原创 两级缓存 Caffeine + Redis 架构:原理、实现与实践

本文探讨高性能服务架构中的两级缓存实现方案。通过整合Caffeine(本地缓存)和Redis(远程缓存),提出两种实现方式:1)基于Spring缓存注解的半入侵式方案,利用@Cacheable等注解管理本地缓存,手动操作Redis;2)自定义注解+切面的全解耦方案,通过AOP统一处理缓存逻辑。两种方案均能提升访问速度、减少网络开销,但需重点解决数据一致性问题。实际应用中需根据业务场景权衡,考虑数据特性、一致性成本等因素,避免过度设计。文章提供了完整的代码示例,包括缓存配置、注解定义和切面实现,为开发者实施两

2025-07-04 00:00:49 1193

原创 ReentrantLock 原理

摘要:ReentrantLock通过AQS同步器实现锁机制,其非公平锁实现基于竞争线程直接尝试获取锁,失败后进入AQS队列等待。核心流程包括获取锁(tryAcquire)、入队(addWaiter)和阻塞等待(acquireQueued)。锁具有可重入特性,通过state计数实现重入控制。默认情况下,线程在队列中等待时被打断不会立即响应,需获得锁后通过selfInterrupt()补偿处理。释放锁时,AQS会唤醒后续节点继续竞争。整个过程体现了ReentrantLock与AQS的深度结合。

2025-07-03 22:10:54 795

原创 原理之 park & unpark

Parker对象是线程同步机制的核心组件,包含_counter、_cond和_mutex三部分。通过背包比喻:_counter表示备用干粮(1可用/0耗尽),_cond是帐篷。park()时若干粮耗尽就休眠,否则继续执行;unpark()会补充干粮并唤醒休眠线程。多次unpark()仅补充一份干粮,确保线程最多被唤醒一次。该机制实现了高效线程阻塞/唤醒控制,避免不必要的阻塞和重复唤醒。

2025-07-03 21:50:40 228

原创 分类树查询性能优化:从 2 秒到 0.1 秒的技术蜕变之路

《电商分类树查询的五次优化实践》摘要:本文记录了电商系统中分类树查询功能的持续优化过程。初始版本直接查询数据库导致2秒响应延迟,通过五次迭代优化:1)引入Redis缓存降低数据库压力;2)采用异步定期更新解决缓存雪崩;3)添加Caffeine内存缓存将QPS提升至500+;4)开启GZip压缩使数据传输量缩减90%;5)优化Redis存储结构解决大key问题。最终将响应时间从2秒降至0.1秒,QPS提升5倍,存储和传输效率显著提高,体现了性能优化需要结合

2025-07-03 21:40:37 872

原创 synchronized的优化原理

本文总结了Java中synchronized锁的优化原理,主要包括轻量级锁、锁膨胀、自旋优化和偏向锁四种机制。轻量级锁通过CAS操作避免重量级锁开销;锁膨胀在竞争激烈时升级为重量级锁;自旋优化让线程忙等待而非立即阻塞;偏向锁则优化无竞争场景,通过存储线程ID减少同步开销。文章还详细分析了偏向锁的撤销条件、批量重偏向/撤销机制,以及JIT编译器的锁消除优化。这些机制共同构成了Java同步性能优化的重要部分,需要在理解对象头格式和monitor机制的基础上掌握。

2025-07-03 19:56:58 638

原创 @RestControllerAdvice是什么

@RestControllerAdvice 是 Spring 框架提供的一个复合注解,用于定义全局异常处理器和全局数据绑定设置,其核心作用是将控制器层面的通用逻辑(如异常处理、数据预处理)集中管理,提高代码的可维护性和可读性。具有全局异常处理、全局数据绑定、全局格式处理等功能。

2025-07-03 19:26:35 315

原创 Springboot3整合ehcache3缓存--XML配置和编程式配置

SpringBoot集成EhCache3的两种配置方法比较:XML配置(简单方案)通过在类路径下添加ehcache.xml文件定义缓存策略,并在application.yml中指定配置文件路径,适合简单固定策略场景。编程式配置(灵活方案)通过Java代码创建CacheManager Bean,动态定义缓存参数,适合需要运行时调整的复杂场景。关键区别在于XML配置维护简单但灵活性低,编程式配置代码量稍多但控制力强。特别注意SpringBoot3中EhCache3已基于JCache规范,需使用JCacheCac

2025-07-03 18:14:46 885

原创 布隆过滤器的flipAll()和清零操作区别

布隆过滤器的清零和flipAll操作会产生相反效果:清零将重置过滤器,所有位归零,完全遗忘已添加元素;而flipAll反转所有位会导致过滤器失效,几乎所有查询都会返回"可能存在",产生极高假阳性率。清零可用于重新初始化过滤器,但flipAll会破坏过滤功能,使过滤器无法区分元素是否存在。例如在垃圾邮件过滤中,清零相当于重新学习特征,而flipAll会导致所有邮件被标记为垃圾。除非特殊需求,应避免使用flipAll操作。

2025-07-03 17:25:33 307

原创 解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题

本文针对用户处理Elasticsearch时字段命名不一致问题,提出五种解决方案:1)使用ObjectMapper手动转换字段命名(推荐);2)利用Elasticsearch 7.0+的field_alias功能;3)自定义ES客户端(不推荐);4)通过DTO类+@JsonProperty注解映射;5)使用第三方插件(不推荐)。建议优先考虑field_alias或ObjectMapper方案,前者最优雅但需版本支持,后者灵活易用;DTO注解适合固定数据结构场景。

2025-07-03 17:18:54 803

原创 子线程用不了父线程的threadlocal怎么办?

摘要:ThreadLocal变量默认无法被子线程访问,但有多种解决方案:1)使用InheritableThreadLocal实现自动继承;2)通过ThreadLocal.withInitial()配合函数式编程传递数据;3)手动传递ThreadLocal值给自定义线程;4)线程池场景下用TransmittableThreadLocal开源库。需注意内存泄漏风险(及时remove)和线程安全问题,异步框架可结合TransmittableThreadLocal或上下文传递机制。不同方案适用于普通子线程、线程池等

2025-07-03 16:54:24 796

原创 Docker安装Elasticsearch超详细图文附ES、IK压缩包

Docker安装Elasticsearch超详细图文​通过网盘分享的文件:ES 7.12.1 和 IK 分词器链接: https://pan.baidu.com/s/1pTdHsctCUlRP80XRd2Ga0g?pwd=c644 提取码: c644我使用下面教程在 Centos7.9 完成了单点部署,可惜原文需要VIP了,感谢部署教程的原文作者:Docker安装Elasticsearch超详细图文-优快云博客

2025-07-03 15:17:26 1029

原创 Springboot3.3.4使用spring-data-elasticsearch整合Elasticsearch7.12.1

Springboot3依旧是可以通过elasticsearch-rest-client依赖(不能同时存在spring-dataelasticsearch)elasticsearch7.12.1。下面简单演示一下demo。

2025-07-03 14:26:33 662

原创 jackson进行序列化时,报错无法创建实例

使用 jackson 进行序列化时,报错(构造方法)com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of com.example.demo.pojo.Goods(no Creators, like default constructor, exist): cannot deserialize from Object value (no delegate- or property

2025-07-03 13:54:38 164

原创 解决 @Value 注解报错:Lombok 与 Spring 的冲突及处理方案“Cannot find method ‘value‘“

在使用 Spring 框架进行开发时,注解冲突是常见的问题之一。其中,@Value注解出现 "Cannot find method 'value'" 错误是典型的 Lombok 与 Spring 依赖冲突导致的问题。本文将详细解析这一错误的成因、解决步骤及相关技术背景,帮助开发者快速定位并解决类似问题。

2025-07-03 12:03:09 569

原创 分布式部署下如何做接口防抖---使用分布式锁

防抖也即防重复提交,那么如何确定两次接口就是重复的呢?首先,我们需要给这两次接口的调用加一个时间间隔,大于这个时间间隔的一定不是重复提交;其次,两次请求提交的参数比对,不一定要全部参数,选择标识性强的参数即可(生产环境还可以加上用户ID);最后,如果想做的更好一点,还可以加一个请求地址的对比。        分布式部署下接口防抖有有很多方法,如:使用共享缓存,使用分布式锁,在web开发中一般新增后者。

2025-07-03 11:19:16 667

原创 WebSocket类明明注入了Bean,为什么报错为null

在 WebSocket 类中注入 Bean 看似可行而注入 Bean 报错为null,通常是由于Spring 的单例管理机制与 WebSocket 多实例创建特性冲突导致的

2025-07-03 00:20:37 758

原创 基于 Elasticsearch 构建 “猜你喜欢” 智能推荐系统:实现思路与实践

主流电商平台有一个很常见的功能:“猜你喜欢”智能推荐,对用户做了精准画像,算法复杂,而普通的项目中,因为内容规模有限,便用 ElasticSearch 基本可以实现基础需求。

2025-07-02 23:06:09 1030

原创 Centos7.9 Docker无需域名SSL证书部署WhaleCMS鲸鱼CMS系统

​本文章提供了不使用域名服务(使用公网ip)和SSL证书的Docker部署鲸鱼CMS个人博客系统的流程,同时指出官方部署教程中的一些问题。

2025-07-01 12:04:39 985

原创 构建mycat1.6.7.3镜像 mycat-web镜像 替换mysql-connector-java-8.0.22.jar

MyCat镜像:基于Mycat-server-1.6.7.3-release-20210913163959-linux.tar.gz和OpenJDK:8构建的镜像,mysql-connector-java已替换为8.0.22版本,server.xml和schema.xml均未修改(原装)。MyCat-Web镜像:由网上的一个仓库拉取过来的,docker pull registry.cn-hangzhou.aliyuncs.com/zhengqing/mycat-web

2025-06-07 20:10:21 980

原创 【Enterprise Architect Version12使用教程附安装包和企业版密钥】

这个线绘制是没有箭头的,我们需要手动添加箭头:选中箭头,右键点击特性,方向选择起始-->目标-->点击确定。边界根据要求设定,我这里以图书借阅系统为例,输入一个系统名称,注意需要拖拽出来才会弹出边界类特性弹窗。接下来就是用例,还是刚刚的方法,把UseCase拖住不动 到绘制页面。这里画用例图,所以选择Use Case,点击确定或者回车即为保存。用元素之间的关系连接线连接,还是和刚刚一样,拖住不动到绘制页面。接下来,点击此处,就会弹出工具箱。包已经新建完成了,接下来新建图。步骤:打开EA,新建项目。

2025-03-14 22:30:24 306 1

原创 Elasticsearch的DevToolsApi和JavaApi

只展示示例代码,不代表所有写法。

2025-03-14 22:05:48 260

原创 Spring Security Jdbc身份认证下SecurityContext内容、来源和如何编写sql查询语句

Spring SecurityJdbc身份认证后身份信息和权限信息都会存入SecurityContext中,哪里面存放了什么呢?里面的参数来源依据是什么?如何设置里面的参数?

2025-03-09 18:13:50 926

原创 前后端分离解决跨域问题

前后端分离解决跨域,jsonp,@CrossOrigin,实现WebMvcConfigurer的addCorsMappings(),配置 CORS(跨域资源共享)过滤器

2025-03-08 21:27:13 859

原创 Spring Security详解

Spring Security简介,认证流程,自定义认证,授权管理,自定义授权,动态展示菜单,用户退出

2025-03-07 17:34:44 1900

原创 怎样读取已经读取过的HttpServletRequest的请求体数据

我需要使用过滤器的HttpServletRequest对http请求数据进行接收并做一些处理,过滤器后请求数据应该到达controller方法的形参中,但实际上访问controller方法的形参为null,所有为什么过滤器能获取到数据而controller方法获取不到。

2025-03-05 19:08:02 1177

原创 简单的 JDBC连接数据库代码解读--- Statement 和 ResultSet

基本概念 PreparedStatement 对象表示一条预编译的 SQL 语句,在创建 PreparedStatement对象时,SQL 语句会被发送到数据库服务器进行预编译。预编译后的 SQL语句会被数据库服务器缓存起来,后续执行时可以直接使用,提高了执行效率。工作原理预编译:当创建 PreparedStatement 对象时,SQL 语句被发送到数据库服务器进行预编译。数据库服务器会对 SQL语句进行语法分析、优化等操作,并生成执行计划。

2025-03-05 00:27:54 1097

原创 Lombok的@Data注解常见问题-构造方法生成策略-@Value “Cannot find method ‘value‘“

Lombok注解使用常见误区解析: @Data注解默认不会生成全参构造函数,仅通过@RequiredArgsConstructor为final/@NonNull字段生成构造器,若无final字段则不会生成任何有参构造。若显式定义构造器还需手动添加@NoArgsConstructor。 IDEA自动导入可能导致注解包冲突,如将Spring的@Value误导入为lombok.Value,需手动修正导入路径。 注意@Data与JPA实体注解的兼容性问题,以及@Builder与无参构造的冲突解决方案。

2025-03-04 23:19:02 394

原创 解决idea 2023 的Branch和code Coverage不显示

生效了,Branch显示出来了,同时我们配置需要统计类为UserService.java,可以看到统计面板只显示UserService的统计信息。Replace Active Suites:用本次的覆盖率结果替换现有的活动套件。通过上面的Branch的设置会出现下面这一张这样的页面,我们设置JaCOCO。Code Coverage可以通过加减配置需要统计的包或者类。Code Coverage不存在。

2025-03-03 23:01:27 1036

原创 使用scanf函数无法打印出字符(scanf易错)

我们可以看到在代码1的输入缓冲区中,执行代码1时,当我们输入数字1到输入缓冲区中,第1个scanf函数在输入缓冲区获取到数学1放到int c,然后输入换行符(回车),第1个scanf语句结束,换行符进入输入缓冲区,并开始执行第2个scanf语句(需要在输入缓冲区获取一个数字,然而此时输入缓冲区只有一个换行符并没有数字,所以第2个scanf语句等待我们输入一个数字到输入缓冲区),我们再将数字2到输入缓冲区中,第2个scanf函数在输入缓冲区获取到数学2放到int d。导致这一问题的出现在于输入缓冲区机制。

2023-10-20 18:22:16 1115 1

原创 计算字符串长度的五种方法

方法一;------------------------------------------------------------方法二;------------------------------------------------------------方法三;------------------------------------------------------------方法四利用sizeof();sizeof(arr)-1,减1是因为当使用""向数组

2023-01-09 18:57:39 19657

原创 三种方法交换a,b两个数字的值

第一种方法利用加减法。第二种方法利用位操作符异或^。第三种方法利用中间变量c。

2023-01-09 17:29:40 717

原创 C语言中函数调用的两种方式——传值调用、传址调用

传值调用:[ 适用于外部函数返回数值给主函数,但不通过外部函数改变主函数变量的值]如:输出了两个数的最大值,代码如下图。分析:MAX函数输出最大值返回给主函数,主函数执行printf语句直接打印,并没有通过MAX函数改变主函数的变量,只是返回了一个数值给主函数,所以适用于传值调用的方法。传址调用:[适用于外部函数直接改变主函数变量的数值]如:将a、b两个变量的数值交换,代码如下图。分析:swap函数直接通过变量a、b的地址对主函数的变量a、b的数值进行控制并交换。以实

2022-11-24 00:51:17 1919

原创 关于一个小游戏 ———猜数字

(本文使用VS2010旗舰版编写,详细代码如下)#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>#include<time.h>void menu(){ printf("*************************\n"); printf("** 1.play ***** 0.exit **\n"); printf("********

2022-11-19 23:07:08 692

原创 VS中使用scanf函数时,想要回车,却是换行,如何解决?

问题描述:使用vs集成开发环境时,使用scanf函数时,想要输入回车表示确认,却表示成了换行。错误原因:在scanf函数中使用了“\n”。解决方法:将“\n”删去即可。实机演示:更改前:如下图。效果:无法表达回车确定的效果,如下图。更改后:删去“\n”,如下图。效果:成功实现回车确认的效果,并执行下一步程序。( 以上图片中的代码可参见“关于一个小游戏——猜数字”)

2022-11-19 22:54:12 1983 6

原创 VS中使用else 报错:应输入一个语句

问题描述:使用∨s集成开发环境时,编译器在else语句处报错:“应输入一个语句”,如下图。错误原因:在图中else if语句后面多加了一个分号。处理方法:将分号删去即可,如下图。

2022-11-19 17:01:40 13156 1

原创 C语言关于scanf语句输入的三种方式。

注意:本文使用的编译软件的是vs2010。1.scanf("%d%d%d",a,b,c)填写a b c的数值时,中间要有空格号隔开。如下图。……………………………………………………………2.scanf("%d,%d,%d",a,b,c)填写a b c的数值时,中间要有逗号隔开。如下图。(注意:如果编写程序时使用了中文逗号,那么填写a b c时要用中文逗号隔开)……………………………………………………………3.scanf("%d#%d#%d",a,b,c)填写a

2022-09-23 00:19:25 13156 4

空空如也

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

TA关注的人

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