自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java内部类详解

内部类是定义在类内部的嵌套类,分为成员内部类、静态内部类、局部内部类和匿名内部类。成员内部类可直接访问外部类所有成员,但存在内存泄漏风险;静态内部类不持有外部类引用,但无法直接访问实例成员;局部和匿名内部类只能访问final局部变量。内部类增强了封装性,简化了回调机制,但也增加了代码复杂度。使用时需根据场景选择合适类型,权衡访问权限与内存管理需求。

2025-08-25 09:45:00 919

原创 Java代码块详解

文章摘要 Java代码块是由大括号{}包围的语句集合,分为局部代码块、实例代码块和静态代码块。局部代码块用于限制变量作用域,通常出现在方法或控制流语句中;实例代码块在每次创建对象时自动执行,用于初始化实例变量;静态代码块在类加载时执行一次。代码块只能使用static修饰符,不能使用访问修饰符或其他修饰符。实例代码块可减少构造器中的重复代码,而静态代码块常用于类级别的初始化。代码块必须定义在类、接口或方法内部,不能独立存在。合理使用代码块可提高代码可读性和维护性。

2025-08-25 09:00:00 954

原创 Java中的注解详解

摘要 Java注解是JDK5引入的元数据机制,通过@interface定义,为代码元素添加结构化信息。核心作用包括触发编译器检查、生成模板代码、运行时行为注入等。Java内置10个核心注解,分为实用注解(如@Override、@Deprecated)和元注解(如@Target、@Retention)。注解类型包括元注解、内置功能注解和自定义注解三类。使用时需注意目标匹配、参数必填、生命周期等规则。自定义注解通过元注解定义行为,可包含带默认值的元素,实现声明式编程范式。

2025-08-18 09:15:00 754

原创 高效读取百万级MySQL数据实战技巧

摘要:财务系统因一条深分页SQL导致瘫痪,该查询扫描821万行数据,触发12次磁盘排序,锁表超300秒。问题根源在于:1) 深分页(LIMIT 500000,1000)导致大量数据丢弃;2) 缺少覆盖索引,引发全表扫描;3) 单次大查询未分批处理。解决方案包括:1) 创建覆盖索引(create_time,amount,status,order_id);2) 改用游标分页避免深分页;3) 实现异步分批导出;4) 采用流式处理。优化后查询响应时间从300秒降至1秒内,并通过异步任务机制避免系统阻塞。(150字)

2025-08-10 18:07:30 477

原创 新手必看!Keil5实战STM32从安装到运行

回到Keil软件页面,把复制的激活码,粘贴在New License ID Code处,点击Add LIC,就可以显示mdk的使用期限,关闭即可。双击“keygen.exe”文件,粘贴复制过的CID码,选择Target为ARM,点击Generate,生成激活码进行复制。点击Pack Installer,选择File,点击Import,导入压缩包中的。或选择项目中需要的芯片库,点击Install,等待安装完成(下载网速较慢)。下载安装包,解压到指定目录,双击安装包,跟随提示依次进行。关闭windows放火墙。

2025-04-14 18:16:02 971 1

原创 字符串拼接“暗战“

语法糖,也译为糖衣语法,是由英国计算机科学家彼得·兰丁发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用。的空参构造器,默认的字符串容量是16,如果需要存放的数据过多,容量就会进行扩容,我们可以设置默认初始化更大的长度,来减少扩容的次数。是线程安全的,因为它的方法都是同步的,这意味着它是安全的,可以在多线程环境中使用。类是不可变的,所以所谓字符串拼接,本质都是重新生成一个新的字符串。知道了“+”底层之后,如果在循环中,使用“+”拼接字符串,会创建大量的。

2025-03-18 15:20:31 909 1

原创 7天看完50+应届生简历后,我想说几句真话

项目经验千篇一律,缺乏亮点、侧重点,这是我看到的最多的问题,首先分析一下,想一想为什么会是这样?在写完工作经验后建议写一个工作业绩小模块,来体现你整体的工作成就,可以将取得的成果量化,尽可能用数字和百分比来描述你的成绩,例如:提高了20%的销售额、管理了10人的团队、由3s降低到30ms,性能提高100倍、项目运行很稳定,很少接到用户投诉。对于这个问题,我建议你把你会的前端技术融入到一个后端项目中去,前端技术提一两句,但重点要写后端项目,这样既可以证明你的技术全面,又不会让无关的信息喧宾夺主。

2025-03-17 21:30:03 914

原创 ThreadLocal深度解析:线程专属的存储空间

实例)是弱引用(可被垃圾回收),但 Value 的强引用会随线程存活而长期存在。若线程生命周期长(如线程池线程),且未显式清理。每个线程(员工)有自己的储物柜,存的东西(变量)其他线程拿不到,解决了多人共用储物柜时物品混乱的问题。是Java提供的线程本地变量机制,它为每个使用该变量的线程创建。)的轻量级实现,而非数据拷贝,因此无需同步锁即可保证线程安全。),同时确保不同线程之间的连接完全隔离。类本身并不存储线程本地变量的值,而是通过。的线程隔离依赖于线程对象(,实现线程间的数据隔离。

2025-03-10 19:40:23 831

原创 AQS秒懂指南

/ 1. 创建自定义锁// 核心:AQS实现类// 2. 继承AQS实现同步逻辑// 后续步骤在此补充// 3. 对外暴露加锁/解锁接口。

2025-03-06 19:22:23 943

原创 多线程的“智能调度专家“

在实际开发中,使用自定义线程池是管理并发任务的一种有效方式。相比于使用Executors工厂类提供的预定义线程池,自定义线程池能够提供更灵活的配置选项。在许多高并发场景下,推荐使用自定义线程池来精确控制资源分配和任务处理。参数名称定义推荐值配置依据核心线程数CPU核数 + 1充分利用CPU资源最大线程数CPU核数 * 2应对突发流量空闲线程存活时间30-60秒平衡资源释放速度unit时间单位定义的具体时间单位workQueue任务队列防止无限制堆积线程工厂提供自定义的线程创建方式拒绝策略。

2025-03-03 12:16:55 947

原创 驾驭并发编程的混沌之海

比如餐厅后厨,多个厨师(线程)需要共享有限的资源如灶台(CPU)、食材(内存)和厨具(I/O设备),通过合理的调度和协作来确保菜品高效地制作完成;同样地,在交通枢纽,车辆(线程)通过红绿灯(锁)、立交桥(无锁结构)以及ETC通道(原子操作)等机制实现交通流的顺畅运行。就像城市交通规划,我们既需要红绿灯(锁)维持秩序,也需要高架桥(无锁结构)提升效率,更需要智能导航系统(调度算法)实现全局最优。在这个过程中,开发者既是规则的制定者,也是系统的观察者,需要在控制与放任之间找到精妙的平衡点。

2025-02-26 19:15:57 687

原创 Integer == int?揭秘包装类比较陷阱

时,就像是给同一个数字穿上了不同的衣服,一个穿着对象的外套,一个保持着原始数据的质朴。但它们的比较结果却暗藏玄机。,如果缓存池有现成的,直接取用(返回缓存对象);如果没有就创建新对象。方法就是通往缓存池的秘密通道!当你在Java中写下。对象进行缓存(可通过。

2025-02-24 19:10:48 734

原创 深度解析new String(“abc”)的对象创建机制

对象,使其表示与实参相同的字符序列。换句话说,用这个方法新创建的字符串是实参字符串的副本。除非需要显式复制形参的值,否则没有必要使用这个构造函数,因为字符串是不可变的。第一个对象是"abc",它属于字符串字面量,因此编译时期会在字符串常量池中创建一个字符串对象,指向这个 “abc” 字符串字面量,而使用。的方式会在堆中创建一个字符串对象。在堆中创建一个字符串对象,并且使用。的方式创建字符串是创建两个对象。创建一个测试类,用字节码观察,文档注释大意:初始化新创建的。(new执行时创建)的字符串对象,它指向。

2025-02-23 19:10:53 748

原创 Java编译器的「消失魔术」

文件之后,源代码中所有的泛型信息都会被移除,可以认为源代码中泛型相关的信息,就是提供给编译器用。泛型信息对Java编译器可见,但在运行时对Java虚拟机不可见。:当你写泛型代码时,Java编译器会在编译阶段进行类型检查,确保你使用的类型是正确的。例如,如果你声明一个。:一旦编译完成,所有的泛型类型信息都会被移除,这个过程叫做“类型擦除”。你有一个神奇的盒子,它能自动识别放入的物品类型。,编译器会确保你只能向这个列表添加字符串;Java中的泛型是通过一种称为。

2025-02-23 08:00:00 985

原创 Java整合文件上传功能

Slf4j@Override/*** 判断是否是当前平台处理* @param platformType 指定平台类型 {@linkplain ArchetypeFilePlatformType}* @return true 为当前平台处理*//*** 校验允许上传的文件格式;默认{@code FileTypeUtils.DEFAULT_ALLOWED_EXTENSION}* @param fileName 文件名称* @return true 允许上传*/

2025-02-21 09:45:00 770

原创 Java定时任务可视化管理

*** 线程本地变量*/@Overridetry {= null) {log.error("任务执行异常 - :", e);/*** 执行前* @param context 工作执行上下文对象* @param sysJob 系统计划任务*//*** 执行后* @param context 工作执行上下文对象* @param sysJob 系统计划任务*/

2025-02-20 15:23:37 497

原创 Java世界的「X光透视机」

想象你走进一个神秘房间,房间里摆满了上锁的宝箱。正常情况下你需要对应的钥匙才能打开每个箱子,但突然你获得了一个万能开锁器,这个“万能开锁器”就类似于是Java反射!反射允许你在程序运行时动态地获取类的信息(如方法、字段等),甚至可以调用这些方法或访问这些字段,即使它们被声明为private。这意味着你可以像拥有X光视力一样,“透视”任何对象的内部构造,并根据需要调整或操作它们。透视任意类的内部结构:就像使用X光扫描一样,可以查看类的所有成员。访问私有方法:突破private。

2025-02-20 14:31:28 756

原创 Java字符串到底能有多长

编译期:硬编码字符串的最大长度为65534个字符,超过这个限制会导致编译错误。运行期:理论上可以达到Integer.MAX_VALUE(21亿),但在实际应用中受限于系统内存和JVM配置。65534:代码中直接写字符串的最大字符数。21亿:程序运行时字符串的理论最大长度(但别真这么干!合理管理字符串长度,给内存留出足够的空间,就像吃饭八分饱,字符串长度也要留余地,给内存呼吸的空间才是好程序!

2025-02-18 17:03:39 1630

原创 为什么Java的String一出生就「不可变」

从Java 9开始,字符串内部改用byte[]存储,根据内容自动选择Latin-1或UTF-16编码。四重「空间换时间」的魔法,最终实现了性能与安全的完美平衡。这种设计哲学深刻影响了后来的Scala、Kotlin等JVM语言,成为编程界教科书级的范例。在每秒百万级并发的系统中,不可变性让字符串成为线程间最安全的信使。下次当你写下String时,别忘了,你正在使用的,是一个凝聚了25年智慧结晶的计算机科学艺术品!这种魔法优化的前提正是字符串不可变!这个看似简单的设定,背后竟隐藏着语言设计者的大智慧!

2025-02-17 19:09:17 1158

原创 Java对象复制:深拷贝 vs 浅拷贝

这类操作通常出现在不同层之间的数据传递或转换中,例如将数据传输对象(DTO)转换为持久化对象(PO),或是将持久化对象(PO)转化为视图对象(VO)。数据转换有助于隔离各层之间的业务逻辑,避免不同层之间的紧耦合,同时优化代码的可维护性和可扩展性,提升模块或系统之间的数据兼容性。这意味着,深拷贝后的对象和原对象在内存中完全隔离,修改其中一个对象的字段不会影响另一个对象。浅拷贝创建一个新对象,这个新对象的字段内容与原对象相同,当字段是基本数据类型时,值被直接复制;时(如包含集合、自定义对象等),

2025-02-16 09:32:56 1132

原创 GitHub Pages自定义域名配置

点击"添加记录",在此处选择"CNAME",配置刚申请的域名和GitHub Pages提供的域名,将其做映射。国际平台(免备案):Namecheap、GoDaddy。配置完成之后如下图:(配置一条记录即可,此处我配置两条记录是有其他用途)。在此处填入之前注册备案过的域名,并勾选"Enforce HTTPS "。在自己GitHub主界面点击"Settings"。找到"Pages",点击"Pages"。在刚注册的域名列表后点击。等待片刻就能访问备案过的。

2025-02-12 21:01:52 495

原创 网络与安全

DDoS(Distributed Denial of Service)分布式拒绝服务攻击,是指攻击者控制分布于互联网各处的大量僵尸主机向攻击目标发送大量垃圾报文或者对目标服务器发起过量访问,耗尽攻击目标所在网络的链路带宽资源、会话资源或业务系统处理性能,导致其无法响应正常用户的服务请求。HTTPS(HyperText Transfer Protocol Secure,超文本传输安全协议)是HTTP协议的安全版本,采用SSL/TLS协议对数据进行加密和验证,来保证数据传输过程中的安全性和完整性。

2024-12-15 19:33:20 1186 1

原创 鸿蒙系统崛起与开发者机遇

鸿蒙操作系统(HarmonyOS)随着其不断发展,正在改变全球科技格局。鸿蒙不仅在智能手机领域展现了强大的潜力,还在智能穿戴、车载、智能家居等多个行业获得广泛应用。随着鸿蒙生态系统的不断完善,开发者面临着前所未有的机遇和挑战。本文将探讨鸿蒙生态中的机遇和挑战,分析如何抓住机会,克服挑战,推动更好的应用发展。

2024-11-24 13:37:09 482

原创 软件开发的未来:AI 大模型与智能代码生成

例如,GitHub Copilot 就是一个典型的应用,通过结合 AI 大模型的技术,能根据开发者输入的函数名称、注释或参数等信息,智能地推测并生成完整的代码块。AI 大模型的应用远不止于自动化代码生成。AI 大模型能够将复杂的编程任务转化为简单的语言描述,开发者只需用自然语言描述他们的需求,AI 就能自动生成符合要求的代码。未来,AI 与开发者的协作将不再是单纯的代码生成,而是更深层次的合作,AI 将成为开发过程中不可或缺的一部分,帮助开发者提升决策效率,优化架构设计,甚至参与项目的全生命周期管理。

2024-11-24 13:26:08 1246

原创 常用算法详解

算法英文对应的单词是Algorithm,它的本意为解决问题的方法,所以算法直接理解就是解决问题的方法。在计算机领域定义就是一系列解决问题的、清晰、可执行的计算机指令。算法是在计算机科学中用于解决特定问题的一系列明确且有限的步骤或规则。它以输入数据为基础,通过确定性操作生成输出结果,强调高效性和可行性。常见算法包括排序、查找、动态规划、分治法和贪心算法等,主要评估指标为时间复杂度和空间复杂度。算法的设计与优化直接影响程序性能,是计算机编程的核心内容之一。算法复杂度是衡量算法性能的重要指标,主要包括时间复杂度和

2024-11-23 15:49:15 2297 1

原创 常用数据结构与算法

数据结构是一门研究数据组织方式的学科,是编程语言的重要组成部分。学好数据结构,可以编写出更高效的代码,同时为学习和掌握算法奠定坚实的基础。数据结构分为两大类:线性结构和非线性结构。线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。根据存储方式的不同,线性结构分为顺序存储和链式存储:常见的线性结构包括数组、链表、队列和栈。非线性结构则包括多维数组、广义表、树和图等形式。常见的线性数据结构包括数组、链表、栈、队列和哈希表。数组是一种固定大小的元素集合,存储在连续内存空间中,支持快速随机访问。

2024-11-23 15:48:12 1072

原创 常用数据结构详解

数据结构分为两大类:线性结构和非线性结构。线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。根据存储方式的不同,线性结构分为顺序存储和链式存储:常见的线性结构包括数组、链表、队列和栈。非线性结构则包括多维数组、广义表、树和图等形式。常见的线性数据结构包括数组、链表、栈、队列和哈希表。数组是一种固定大小的元素集合,存储在连续内存空间中,支持快速随机访问。链表由节点和指针组成,能够动态调整大小,适用于频繁插入和删除的场景。栈遵循后进先出(LIFO)原则,通常用于处理递归和表达式求值等问题。队

2024-11-19 23:04:48 1252

原创 SpringCloud详解

"断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。客户端的请求先通过匹配规则找到合适的路由,映射到具体的服务,然后请求经过过滤器处理后转发给具体的服务,服务处理后,再次经过过滤器处理,最后返回给客户端。它并不是一个框架,而是很多个框架。

2024-11-17 08:00:00 1098

原创 微服务治理详解

—大意:简而言之,微服务体系结构风格是一种将单个应用程序开发为一套小型服务的方法,每个服务运行在自己的进程中,并与轻量级机制(通常是HTTP资源API)通信。这些服务是围绕业务功能构建的,可以通过全自动部署机制进行独立部署。对这些服务的集中管理是最低限度的,这些服务可能用不同的编程语言编写,并使用不同的数据存储技术。

2024-11-16 22:55:12 1381

原创 this关键字详解

在JVM内部,它通过栈帧管理和字节码指令实现了对当前对象的引用,使得实例方法可以操作调用对象的属性和方法。它是类内部对当前对象的引用,因此在实例方法或构造方法中,可以通过。看成一个特殊变量,它保存着当前对象的内存地址,并允许你在类内部访问该对象的属性和方法。的执行原理在于它是一个隐式传递的参数,指向当前对象实例,并在编译和执行过程中通过。在多线程环境中,JVM为方法分配独立的栈帧,每个线程操作自己的栈,因此。是一个内置的引用,代表了“当前对象”,它指向当前对象的实例。是一个特殊的引用,指向当前对象的实例。

2024-11-01 08:00:00 1261

原创 transient关键字详解

这是因为static字段属于类而不是某个具体的对象,序列化是对象级别的操作,它保存的是对象的实例状态,而static字段是类级别的状态,不属于任何具体对象,因此在序列化过程中被忽略。也就是说,使用transient修饰的字段在序列化过程中将被忽略,反序列化时这些字段会被初始化为默认值,基本数据类型为0,引用类型为null。transient译为“临时的”,它可以阻止字段被序列化到文件中,在被反序列化后,transient字段的值被设为初始值,比如int型的初始值为0,对象型的初始值为null。

2024-08-18 16:52:50 2826

原创 strictfp关键字详解

BigDecimal的运算逻辑完全在Java的标准库中实现,并不依赖于任何特定平台的硬件或操作系统的浮点运算单元,所以在任何平台上使BigDecimal进行相同的计算时,结果都是一致的,但并不是它在所有场景下都是最合适的选择。在没有使用strictfp时,Java虚拟机可能利用硬件浮点运算的特性来优化计算,这就可能导致在不同平台上,浮点运算的结果不完全一致。而且大多数应用程序的浮点计算已经足够一致,满足了实际需求,因此不需要额外的strictfp关键字来保证浮点运算的一致性,strictfp了解即可。

2024-08-18 08:00:00 1127

原创 static关键字详解

除此之外,这种理解有助于优化类的加载性能,减少不必要的初始化开销,并能够正确实现一些设计模式,确保类在多线程环境下的稳定性。例如,静态变量用于保存所有对象共享的状态,而静态方法可用于提供通用的工具函数,这些功能可以直接通过类名访问,无需实例化对象。是Java中的一个关键字,用于定义类级别的成员,类级别的成员是指那些属于整个类,而不是特定对象实例的成员。时,JVM在方法区为这些静态成员分配内存,这块内存被所有类的实例共享,并在整个类的生命周期内保持不变,所以静态变量不需要为每个对象实例重新创建。

2024-08-11 08:00:00 919 1

原创 Netty高性能数据结构

它的基本思路是在哈希表中发生冲突时,线性地探测哈希表中的下一个位置来寻找空闲的存储位置。时间轮算法将时间分割成一个个固定大小的时间片,并将任务安排到相应的时间片上,从而优化了定时任务的管理。类型的无锁队列,允许多个线程同时提交任务,而由单个事件循环线程处理这些任务。它通过将定时任务分配到轮盘上的不同槽位来避免高频率的任务调度开销,这种设计主要用于处理大量的定时任务。所谓的高性能数据结构是指,那些在特定场景下优化了性能和效率的数据结构,通常能够提供更快的操作速度、更低的内存消耗或更高的并发处理能力。

2024-08-07 21:36:14 963

原创 Netty内存池管理

内存池将内存分为不同大小的块,每个大小对应一个内存池。实际就是一个队列,当内存释放时,将内存块加入队列当中,下次再分配同样规格的内存时,直接从队列中取出空闲的内存块。会检查其内存区域中的空闲块,并从中选择一个可用的块进行分配。来管理较大的内存块,通过伙伴算法和二叉树结构进行内存分配。中获取内存块,如果缓存中没有,才会从全局内存池中获取。它的主要作用是管理内存池中的小内存块,在分配的内存大小小于一个。向操作系统申请内存的单位,所有的内存分配操作也是基于。,可以快速分配和回收内存块,减少对全局内存池的争用。

2024-07-31 20:58:02 530

原创 Netty详解

Netty是一个高性能、异步的网络应用框架,用于开发高效的网络通信程序。它是JavaNIO的一个抽象,简化了网络编程的复杂性,并提供了一系列高级功能,使网络编程变得更简单。Netty是一个高效的网络框架,专注于处理大量并发连接。它通过异步IO处理来避免阻塞,这让它在处理高并发时表现出色。Netty还利用了优化的内存管理和零拷贝技术,降低了性能开销。框架的灵活性也很高,开发者可以通过管道机制自定义数据处理流程,API和文档丰富,帮助简化网络编程。不过,Netty。

2024-07-31 20:40:14 5383

原创 Redis内存管理

达到内存限制时,它会在所有设置了过期时间的键中选择最近最少使用的数据进行淘汰。页面置换算法:进程运行时,若其访问的页面不在内存而需将其调入,但内存已无空闲空间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区,其中选择调出页面的算法就称为页面置换算法。默认最大内存是全部的内存,我们在实际配置的时候,一般配实际服务器内存的3/4也就足够了。算法常用于缓存管理,目的是在缓存满时,保留最常使用的数据,同时移除最久未被使用的数据。专注于管理设置了过期时间的键,优先淘汰过期数据,保留未过期的键。

2024-07-30 11:55:24 1053 1

原创 Redis部署策略

它的主要优点是能够处理大规模的数据和高并发请求,自动故障转移功能减少了服务中断时间,同时分散了数据和负载,减少了单点故障的风险。如果主节点出现故障,可以将从节点提升为新的主节点,实现一定程度的容错和数据恢复。不过,由于主从复制默认是异步的,从节点的数据可能会有延迟,导致读取的数据可能不是最新的。它的主要优点是能够自动处理主节点故障,将从节点提升为新的主节点,从而减少服务中断时间,增强系统的稳定性和可靠性。前者称为主节点,后者称为从节点,数据的复制是单向的,只能由主节点到从节点。一旦选定新的主节点,

2024-07-29 12:15:15 580 1

原创 Redis与缓存

可以设置自动重试机制,如果更新操作失败,系统会尝试重新执行更新,增加成功的可能性,虽然这样可能会增加系统的负担。另一种方法是使用备用缓存,在主缓存更新失败时,将数据写入备用缓存,并在主缓存恢复正常时进行同步,这样可以保持系统的正常运转。缓存穿透的原因通常是,用户请求的数据在缓存和数据库中都不存在,或者是请求的数据在缓存中未命中,直接查询数据库,并未将结果正确地缓存起来。在更新源数据时,同时更新缓存和源数据库。缓存击穿 是指在缓存中某个热点数据的缓存失效时,多个请求同时访问数据库,导致数据库压力剧增的情况。

2024-07-29 12:13:05 560

原创 基于Redis的分布式锁的演进

加过期时间释放锁的这种方式会带来另一个问题,某个线程加锁,然后执行业务代码,业务代码执行的时间超过了限定时间,此时Redis会释放锁,然后第二个请求就进来了,此时第一个线程业务代码执行完毕,执行释放锁步骤。对于上面的解决方法,其实并没有真正的解决缓存续期的问题,还是会带来能存在锁过期释放,业务没执行完的问题。针对缓存续期的问题,我们可以开一个守护线程,每隔一段时间检查锁是否还存在,存在则对锁的过期时间延长,防止锁过期提前释放。当释放锁时,节点会检查锁的持有者是否匹配,只有匹配的情况下才会删除锁。

2024-07-27 12:54:52 1162

免费windows常用串口驱动,覆盖99%驱动

windows常用串口驱动,覆盖99%驱动

2025-04-08

免费Manus全网最全资料合集250308

Manus全网最全资料合集250308

2025-03-18

免费吐血整理,前端知识点总结,课程学习路线及学习链接

前端知识点总结,课程学习路线及学习链接。部分内容如下: ## 基础知识 ### 网络知识 1. [HTTP](https://www.bilibili.com/video/BV1js411g7Fw/) 2. [DNS](https://www.bilibili.com/video/BV1GW411j7Ts/) 3. [域名](https://www.bilibili.com/video/BV1zA411x7Pj/) 4. [云服务](https://www.bilibili.com/video/BV1Rt411u7k4/)

2024-04-17

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

TA关注的人

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