- 博客(30)
- 收藏
- 关注
原创 Redis Bitmap 详解:高效处理海量二进制数据的利器
Bitmap 本质上是一个二进制数组,其中每个元素只能是 0 或 1。但在 Redis 中,它并不是一个独立的数据类型,而是基于 String 类型实现的 —— 因为 String 类型在 Redis 中是二进制安全的,可以存储任意字节序列,非常适合作为位图的底层存储。一个 String 类型的值最多可以存储 512MB 的数据,这意味着一个 Bitmap 最多可以包含 2^32 - 1 个比特位,足以满足大部分业务场景的需求。
2025-09-18 20:40:45
553
原创 深入理解 Seata:分布式事务解决方案从入门到实战
核心作用:Seata 作为分布式事务中间件,解决微服务跨服务 / 跨数据库场景下的数据一致性问题,具备低侵入、多模式、高性能、高可用特点,可兼容主流框架。关键构成:由 TC(事务协调者)、TM(事务发起者)、RM(分支事务管理者)协同工作;提供 AT(自动补偿,适用于关系型数据库)、TCC(手动补偿,支持非关系型数据库)、SAGA(长事务异步处理)、XA(强一致性,性能差)四种事务模式,适配不同场景。实战关键。
2025-09-15 17:49:40
1122
原创 Java ConcurrentHashMap 底层原理与线程安全机制深度解析
ConcurrentHashMap 是 Java 并发编程中的核心组件,其 JDK 8 版本通过 “CAS 无锁操作 + synchronized 局部锁” 的创新设计,实现了 “细粒度锁” 与 “高效并发” 的平衡,解决了 HashMap 线程不安全和 Hashtable 性能低下的问题。理解其底层结构、线程安全机制及扩容逻辑,不仅能帮助开发者在高并发场景下正确使用 ConcurrentHashMap,还能为设计并发数据结构提供思路。
2025-09-07 23:03:50
793
原创 Java 内存模型与垃圾回收机制详解
熟悉内存区域划分有助于理解对象的生命周期和内存分配了解垃圾回收原理可以帮助我们编写更易于 GC 处理的代码合理配置 GC 参数能够显著提升应用性能在实际开发中,我们应该根据应用特点选择合适的垃圾收集器,并通过监控和分析不断优化 JVM 参数,以达到最佳性能。
2025-09-05 15:04:04
849
原创 Sentinel 与 Feign 整合详解:实现服务调用的流量防护
创建 Feign 客户端接口,通过fallback或指定降级类:java运行// Feign客户端接口value = "user-service", // 目标服务名fallback = UserFeignFallback.class // 降级处理类// 降级处理类(实现Feign接口)@Component@Override// 降级逻辑:返回默认数据或友好提示return new UserDTO(id, "默认用户(服务降级)", "unknown");
2025-09-04 17:28:26
808
原创 Redis 核心知识精讲:从基础到实战要点
数据结构:根据业务场景选对类型(如排行榜用 Sorted Set);持久化:生产环境用 RDB+AOF 混合模式,平衡安全与性能;避坑:提前预防缓存穿透、击穿、雪崩问题。
2025-09-04 17:09:34
1366
原创 Java消息中间件(RocketMQ)
消息中间件是基于数据通信的分布式系统集成工具,通过提供消息传递和消息排队模型,扩展进程间通信能力。生产者(Producer):发送消息的应用或服务,如同寄快递时的寄件人;消费者(Consumer):接收并处理消息的应用或服务,类似收件人;消息载体:包含业务数据与路由属性,是两者通信的核心媒介。消息中间件通过异步通信与应用解耦,成为分布式系统的核心支撑组件。RocketMQ 凭借高可用、高可靠的特性,在电商、金融等场景中广泛应用。
2025-09-02 17:27:47
705
原创 SpringBoot 自动配置核心原理解析
SpringBoot 自动配置的魔力源于其精妙的底层设计,核心依赖和三大技术支柱,三者协同实现了 "约定优于配置" 的开发体验。
2025-08-22 11:34:24
946
原创 Spring Framework 全面总结:核心原理与技术解析
Spring Framework核心解析:轻量级Java企业开发框架 摘要:Spring Framework作为Java企业级开发的基础框架,通过IoC容器和AOP实现松耦合与模块化开发。核心特性包括:1)控制反转(IoC)容器管理对象生命周期;2)依赖注入(DI)实现解耦;3)AOP分离横切关注点。框架采用模块化设计,包含核心容器(Core/Context)、数据访问(JDBC/ORM)、事务管理(Tx)和Web支持(Web/MVC)等模块。实践要点包括XML/注解/Java三种配置方式,以及解决循环依赖
2025-08-15 09:35:22
858
原创 Mybatis进阶:注解替换XML文件
本文对比了MyBatis中注解与XML配置方式的优缺点,并详细介绍了核心注解的使用方法。注解方式简化配置、提升开发效率,适合中小项目;XML配置集中管理、可读性强,适合复杂SQL场景。文章重点讲解了CRUD注解(@Select/@Insert等)、结果映射注解(@Results/@Result)、多参数处理(@Param)以及关联查询注解(@One/@Many)的具体应用。最后演示了通过@SelectProvider实现动态SQL的方式,为开发者提供了灵活选择配置方式的参考。
2025-08-10 21:22:03
713
原创 MyBatis进阶:动态SQL、多表查询、分页查询
UserMapper接口上篇提到简单的进行增删改查操作,指路↓MyBatis 核心入门:从概念到实战,一篇掌握简单增删改查。
2025-08-10 20:56:43
893
原创 MyBatis 核心入门:从概念到实战,一篇掌握简单增删改查
MyBatis是一款Java半自动化ORM框架,通过简化JDBC操作提升开发效率。本文介绍了MyBatis的核心概念:SqlSessionFactory(数据库连接工厂)、SqlSession(数据库会话)、Mapper接口和XML映射文件。通过创建MySQL用户表、配置Maven依赖、编写核心配置文件mybatis-config.xml、实体类User.java和Mapper接口,实现了一个完整的MyBatis项目。测试类演示了CRUD操作,并总结了参数传递(单个/多个参数、实体类参数)和结果映射(自动映
2025-08-10 14:36:47
1164
原创 TCP协议要点整理
该报文中,确认标志位(ACK)设为 1,确认号为客户端的序列号加 1,表示服务器已收到客户端的关闭请求。在这个报文中,确认标志位(ACK)设为 1,确认号为服务器的初始序列号加 1,即 y + 1 ,表示客户端已收到服务器的 SYN + ACK 报文,连接建立成功。此时客户端和服务器都进入。在这个报文段中,客户端将 同步标志位(SYN)设置为 1,同时选择一个初始序列号(Initial Sequence Number,ISN),假设为 x,表示客户端希望建立连接,并告知服务器自己的初始序列号。
2025-07-30 18:03:46
1197
原创 Java动态代理
Java动态代理主要通过JDK原生代理和CGLIB实现。JDK代理基于接口,使用Proxy和InvocationHandler创建代理,在invoke()方法中增强目标对象功能。CGLIB通过继承目标类生成代理,利用MethodInterceptor拦截方法调用,适用于无接口的类。两者广泛用于SpringAOP、ORM框架等场景,JDK代理需接口支持,CGLIB性能更高且能代理普通类。开发中可根据目标对象类型(是否实现接口)选择合适代理方式。
2025-07-30 11:59:43
799
原创 ReentrantLock中的AQS(AbstractQueuedSynchronizer)
AQS是一种提供了原子式管理同步状态、阻塞和唤醒线程等功能,并提供等待队列模型的线程同步框架。总之,AQS 是 Java 并发编程中非常重要的框架,掌握 AQS 的原理和使用方法,对于深入理解 Java 并发包中的各种同步工具,以及开发高效、可靠的并发程序具有重要意义。编辑分享。
2025-07-23 19:22:54
724
原创 Java线程池的状态:状态的保存、切换
线程池状态是指线程池在其生命周期中所处的不同阶段,用于控制和管理线程池的行为。线程池作为一种重要的并发编程工具,其状态管理直接影响到系统的稳定性、性能和资源利用率。• 线程池状态控制着任务的提交和执行,以及工作线程的生命周期。• 状态转换是单向不可逆的,遵循特定的流程。• 使用原子变量和 CAS 操作保证状态转换的线程安全性。• 合理的状态管理是线程池高效、稳定运行的关键。
2025-07-21 19:14:22
800
原创 Java线程池的核心配置参数和流程
Java中线程池的使用广泛,其中ThreadPoolExecutor最为重要,以下是ThreadPoolExecutor的重点说明。
2025-07-21 18:50:48
809
原创 Java中BlockingQueue阻塞队列的简单使用------生产者和消费者模型
摘要:BlockingQueue作为Java多线程编程中的关键数据结构,通过阻塞机制高效实现生产者-消费者模型。ArrayBlockingQueue(数组实现)和LinkedBlockingQueue(链表实现)是最常用的实现方式,前者读写互斥,后者支持并发操作。PriorityBlockingQueue支持优先级排序,SynchronousQueue实现直接交付。这些线程安全队列通过put()/take()方法自动处理阻塞/唤醒,简化了并发控制,在任务调度、消息队列等场景中发挥重要作用,既保证了线程安全又
2025-07-19 11:28:29
885
原创 利用Java线程技术多线程爬取网站图片
在介绍线程之前,需要介绍程序以及进程相关知识。程序是含有指令和数据的文件。进程是程序从运行到退出的一次执行过程,是操作系统分配资源的基本单位(常见的JVM、微服务等都是进程)。而线程是进程的子任务(进程内部最小执行单元),是处理器任务调度的基本单位,有独立的线程和程序计数器,线程共享所属进程第二点内存、文件等资源。
2025-07-15 11:59:53
566
原创 ArrayList核心代码阅读
ArrayList通过确保容量足够,若不足则grow()进行扩容。默认扩容策略是 1.5 倍,避免过于频繁的数组拷贝。扩容操作涉及,是的封装,保证高效的数组复制。了解ArrayList扩容机制有助于编写高效的代码,避免不必要的扩容开销。
2025-03-19 20:28:08
255
原创 Integer缓存池
在Java开发中,Integer是一个常用的包装类,但在使用==进行比较时,可能会遇到一些出人意料的结果。这是因为Java在一定范围内对Integer对象进行了缓存优化,即所谓的Integer缓存池。本文将通过代码示例、源码解析以及方法的剖析,详细探讨Integer缓存池的工作原理,并分析其对性能优化的作用。Integer缓存池会缓存-128到127之间的Integer值,对象并非每次都新建。方法会使用缓存池,尽量避免不必要的对象创建。如果需要比较Integer值是否相等,应尽量使用equals()
2025-03-19 20:09:04
265
原创 StringBuilder类的数据结构和扩容方式解读
String类是不可变的,每次拼接都会生成新的对象,导致内存开销和性能损耗,而StringBuilder则通过可变字符数组来动态修改字符串,避免了创建新对象的问题。的设计通过一个动态扩展的char[]数组来优化字符串拼接过程,避免了String的不可变性带来的性能瓶颈。通过合理的初始化容量和扩容机制,StringBuilder可以在保证性能的同时灵活处理字符串操作。
2025-02-27 20:23:25
297
原创 String类的equals()的作用和源代码解读
简介:为什么equals()方法在Java中如此重要,尤其是对于String类。equals()与==的区别,常见的理解偏差。==用于比较对象的引用是否相同,即是否指向同一内存地址。equals()用于比较对象的内容是否相同,需要类中重写equals()方法来定义比较逻辑。
2025-02-26 18:19:29
255
原创 String为什么是不可变的?
为什么String是不可变的?1.字符串内部使用一个字符数组来作为数据结构,保存字符串的所有字符。2.字符数组被final关键字修饰,所以该数组一旦被创建,就无法再为其重新分配内存空间。3.每个修改字符串的方法,都会将新的修改内容保存到一个新的字符串对象中,并不会修改原字符串的内容。例如上面举例的replace()方法substring()方法。
2025-01-20 19:37:23
430
原创 MongoDB服务被360删掉了怎么办?
D盘内存空间突然变得很小,怀疑中病毒了,灵机一动看向了右下角的360······经过一连串操作,重启后确实恢复了,但是在今天打开navicat时发现连接不上mongodb了晕但是我是另外一种问题,。
2024-10-15 21:30:51
480
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人