- 博客(128)
- 收藏
- 关注
原创 Java基础系列(十九) Spring Boot自动装配,启动流程,配置优先级
SpringBoot自动装配核心原理是通过@EnableAutoConfiguration注解驱动,结合SpringFactoriesLoader扫描META-INF/spring.factories文件中的自动配置类,并利用条件注解(@Conditional)筛选生效配置。启动流程分为初始化SpringApplication和执行run()方法两个阶段,包括环境准备、上下文创建与刷新、Web服务器启动等关键步骤。Web项目通过ServletWebServerFactoryAutoConfiguration
2025-12-22 18:21:03
1044
原创 Java基础系列(十八) 集合类
本文系统梳理了Java集合框架的核心知识点。Collection分为List(有序可重复)、Set(无序唯一)和Queue(队列结构);Map存储键值对。详细分析了ArrayList、LinkedList、HashSet、TreeSet等实现类的底层结构和特点,特别对HashMap的哈希计算、冲突处理、扩容机制等关键过程进行深入解析。同时比较了HashMap在多线程环境下的线程安全问题与ConcurrentHashMap的解决方案,包括Java7的分段锁和Java8的CAS+synchronized优化。最
2025-12-22 17:14:05
721
原创 Java基础系列(十七) Kafka、RocketMQ 和 RabbitMQ
消息队列架构对比摘要 Kafka、RocketMQ和RabbitMQ是三种主流消息队列系统,它们在架构设计上各有特点: Kafka采用生产者-消费者-Broker-ZooKeeper架构,通过分区(Partition)和副本机制保证高可用性,仅保证分区内消息顺序,消费者通过消费组实现扩展。 RocketMQ架构类似但使用NameServer替代ZooKeeper,消息可按Topic和Tag分类,采用主从复制保证高可用,支持生产者组和事务消息。 RabbitMQ基于Exchange-Queue模型,提供四种E
2025-12-22 12:31:40
252
原创 Java基础系列(十六) MQ 设计,消息幂等性,顺序性,不丢失
摘要:本文深入探讨了消息队列(MQ)的核心设计原理与关键问题解决方案。首先分析了同步RPC调用的弊端,提出异步消息机制实现服务解耦,并详细介绍了消息队列的两种基本模式(队列模式和发布订阅模式)。其次,阐述了Broker集群、分区机制和注册中心的高可用设计,构建完整的消息工作流程。最后重点讨论了消息幂等性和顺序性保障方案,包括唯一ID+Redis去重、数据库唯一约束等通用方案,以及生产者-消费者全链路防丢失策略。全文系统性地梳理了分布式消息系统的核心架构与最佳实践。
2025-12-22 10:28:38
762
原创 Java基础系列(十五) 缓存与数据库一致性
本文总结了缓存更新的常见策略与一致性保障方案。主要介绍了三种缓存模式:CacheAside(业务层控制读写)、ReadThrough/WriteThrough(缓存组件自动同步)、WriteBack(异步写库)。重点分析了CacheAside模式下的数据一致性问题,指出并发场景下单纯"先更库后更缓存"或相反顺序都无法保证一致性。提出了删除缓存优于更新缓存的实践原则,并推荐"更新数据库+删除缓存"的主流方案。针对删除失败问题,给出重试机制、异步任务和TTL过期三重保障。
2025-12-21 21:48:45
277
原创 Java基础系列(十四) Redis持久化和高可用
Redis提供了RDB和AOF两种持久化机制:RDB通过快照保存全量数据,恢复快但可能丢失数据;AOF记录写命令,数据更安全但恢复慢。混合持久化结合了两者优势。在高可用方面,主从复制配合哨兵实现故障转移,而Redis集群通过数据分片和内置故障转移机制同时解决扩展性和高可用问题。主从+哨兵适合单机内存足够场景,集群则适用于需要水平扩展的大规模应用。
2025-12-21 18:54:57
834
原创 Java基础系列(十三) Redis应用场景,缓存击穿 / 穿透 / 雪崩
Redis数据结构与应用场景全解析 Redis提供多种数据结构,各具特色: String:缓存对象、分布式锁、计数器 Hash:对象存储、购物车、多维度统计 List:消息队列、实时消息流 Set:抽奖系统、去重、共同好友 ZSet:排行榜、滑动窗口限流 Stream:专业消息队列 缓存三大问题解决方案: 缓存击穿:互斥锁/逻辑过期/本地缓存 缓存穿透:参数校验/空值缓存/布隆过滤器 缓存雪崩:随机TTL/永不过期/缓存预热 Redis不仅可作缓存,合理使用其数据结构可实现分布式锁、消息队列、社交Feed等
2025-12-21 18:27:46
450
原创 Java基础系列(十二) 索引,SQL执行,事务,MVCC
本文系统介绍了数据库索引与事务的核心知识。索引部分详解了B+树作为主流索引结构的原因,分析了不同数据结构的适用场景,阐述了聚簇索引与二级索引的区别,并总结了索引设计的最佳实践。事务部分深入讲解了ACID特性及其实现机制,包括MVCC、ReadView等关键技术,对比了不同隔离级别对并发问题的处理能力,特别强调了可重复读隔离级别如何通过MVCC和锁机制避免幻读。全文从理论到实践,全面剖析了数据库索引与事务的工作原理,为数据库性能优化提供了系统性的指导。
2025-12-21 14:42:04
547
原创 Java基础系列(十一) MySQL日志
本文系统介绍了MySQL中的三大日志机制:UndoLog(回滚日志)记录数据修改前的旧版本,用于事务回滚和MVCC实现;RedoLog(重做日志)记录数据页的物理修改,通过顺序I/O保证事务持久性和崩溃恢复;Binlog(二进制日志)记录逻辑SQL操作,用于主从复制和数据备份。重点分析了RedoLog的刷盘机制、BufferPool的缓存作用,以及通过两阶段提交协议确保RedoLog和Binlog的一致性。这些日志机制各司其职,共同保障了MySQL的事务特性(ACID)、性能优化和数据可靠性。
2025-12-21 12:03:14
373
原创 Java基础系列(十) JVM和垃圾回收
JVM架构核心解析:内存管理与垃圾回收 JVM由类加载系统、运行时数据区、执行引擎等五大组件构成。运行时数据区包括线程共享的堆(存储对象)和方法区(类元数据),以及线程私有的JVM栈、程序计数器和本地方法栈。对象通常存储在堆中,而基本类型存储在栈上。JVM采用可达性分析算法判断垃圾对象,通过分代收集策略(年轻代用复制算法,老年代用标记-清除/整理)进行垃圾回收。CMS和G1是两种主流垃圾收集器,其中G1采用Region化内存管理,具有更好的停顿控制能力。JVM通过这种分层设计实现了高效的内存管理和自动垃圾回
2025-12-20 19:59:10
833
原创 Java基础系列(九) 双亲委派
Java类加载器主要分为四类:启动类加载器(Bootstrap)、扩展类加载器(Extension/Platform)、应用类加载器(Application)和自定义类加载器(Custom)。双亲委派模型是类加载的默认机制,确保核心类库的安全性和一致性,但并非强制约束。SPI机制、Web容器等场景会打破该模型,通过线程上下文类加载器实现反向委派。这种灵活设计既保证了安全性,又支持了系统的扩展性和动态加载能力。
2025-12-20 19:33:07
432
原创 Java基础系列(八) JMM
Java内存模型(JMM)技术问答摘要: JMM规范定义了线程与主内存的交互规则,解决多线程环境下的可见性、有序性和原子性问题。核心机制包括:工作内存与主存间的八种交互操作(lock/unlock/read/load/use/assign/store/write)、内存屏障(LoadLoad/StoreStore/LoadStore/StoreLoad)和happens-before规则。JMM通过synchronized、volatile、CAS等工具保证:1)可见性-确保线程修改可见;2)有序性-防止指
2025-12-20 13:22:53
266
原创 Java基础系列(七) 线程池
Java线程创建和销毁开销大是因为其与内核线程一一对应,需系统调用分配资源。创建线程必须通过Thread.start(),而Runnable等只是任务提交方式。线程池通过复用线程降低开销,其核心流程包括使用核心线程、队列缓冲和拒绝策略。为避免任务被拒,可采用无界队列、持久化或CallerRunsPolicy策略。动态线程池可通过配置中心实现参数热更新。监控线程池需关注活跃线程数、队列大小等指标。线程池核心参数包括核心线程数、队列类型和拒绝策略等,ThreadFactory则用于线程命名和创建控制。
2025-12-20 13:03:01
281
原创 Java基础系列(六) ThreadLocal
摘要: ThreadLocal通过线程内部的ThreadLocalMap存储数据,key为ThreadLocal实例(弱引用),value为强引用。弱引用key可避免ThreadLocal对象内存泄漏,但需手动remove()清理无效Entry防止value泄漏。ThreadLocalMap采用线性探测解决哈希冲突,触发get/set时清理失效Entry。与锁不同,ThreadLocal通过数据副本隔离实现无锁线程安全。静态ThreadLocal变量因存储在线程私有Map中,仍能保证线程间数据独立。正确使用
2025-12-20 11:57:37
620
原创 Java基础系列(四) AQS 与并发工具类设计
摘要:AQS(AbstractQueuedSynchronizer)是Java并发工具类的核心框架,通过int型state变量(volatile+CAS)实现资源状态管理。其设计特点包括:1)支持独占/共享模式,满足不同并发场景;2)使用双向链表实现高效线程等待队列;3)提供tryAcquire/acquire等灵活API;4)相比synchronized更轻量且功能更丰富。典型实现如ReentrantLock(支持公平/非公平锁)、Semaphore(许可证控制)和CountDownLatch(任务计数器
2025-12-20 10:56:03
583
原创 Java基础系列(二) CAS
摘要:悲观锁通过获取锁保证线程安全,但性能较低;乐观锁采用CAS机制实现无锁并发,通过硬件指令保证原子性。Java的Atomic类使用CAS和volatile实现原子操作,数据库乐观锁通过版本号或条件更新实现。CAS存在ABA问题和自旋开销,可通过版本号或混合锁策略解决。虽然硬件层面存在锁定操作,但从开发者角度CAS仍被视为高效的无锁方案。
2025-12-20 01:18:30
138
原创 Java基础系列(三) Synchronized锁
摘要:锁机制解决并发编程中的可见性、有序性和原子性问题。Java的synchronized通过monitorenter/monitorexit字节码指令实现,保证互斥性、可见性和有序性。Java6引入锁升级机制(无锁→偏向锁→轻量级锁→重量级锁)优化性能,针对不同竞争场景采用不同策略:偏向锁优化单线程访问,轻量级锁使用CAS自旋减少切换开销,重量级锁处理高竞争场景。Monitor机制管理锁状态,包含Owner线程、重入计数、EntryList(阻塞线程)和WaitSet(等待线程)等组件,分别处理锁竞争和线
2025-12-20 00:00:57
309
原创 Java基础系列(五) 分布式锁
Redis分布式锁实现要点:1.使用SETNX+EX命令保证互斥性,设置过期时间防止死锁;2.释放锁时需校验持有者,避免误删;3.通过看门狗机制续期,防止业务未完成锁过期;4.支持可重入性,使用哈希表记录线程ID和重入次数;5.主从架构存在锁丢失风险,Redisson采用多主节点锁定解决;6.RedLock算法存在争议,实际生产中多采用简单分布式锁或Redisson框架。关键要保证互斥性、防死锁和可重入性。
2025-12-19 22:32:19
348
原创 Java基础系列(一) Synchronized,ReentrantLock
摘要:Java的synchronized是内置线程安全机制,通过对象锁实现原子性、可见性和有序性。JDK1.6引入锁升级(无锁→偏向锁→轻量级锁→重量级锁)、锁消除和锁粗化优化,显著提升性能。其可重入特性通过计数器实现,与ReentrantLock的AQS机制类似。分布式锁(如Redis)通过哈希存储重入次数实现可重入。尽管虚拟线程(JDK21)采用N:M模型降低切换开销,但synchronized仍是核心同步机制。现代JVM中,优化后的synchronized在多数场景性能接近显式锁。
2025-12-19 22:26:32
241
原创 Spring AI, LangChain和LangGraph(三)
文章摘要:现代大语言模型的Prompt已从简单文本演变为复合执行契约,包含行为规则、工具能力、记忆状态、检索知识和输出约束等要素。SpringAI采用隐式强类型方式,通过Advisor自动注入上下文,适合企业开发;而LangChain以显式函数式风格实现相同功能,更适合研究场景。结构化输出确保了类型安全,工具调用从指令式转为能力声明式。这标志着Prompt Engineering已发展为Prompt Programming,开发者不再编写提示词,而是编程AI的完整行为契约。
2025-12-19 16:24:33
569
原创 Spring AI, LangChain和LangGraph(二)
摘要:本文介绍了基于RAG(检索增强生成)技术的大模型应用开发实践,分别使用SpringAI、LangChain和LangGraph三种框架实现。通过整合智谱AI的LLM模型、向量检索和对话记忆功能,构建了能够解决大模型幻觉、私有数据训练和实时知识更新问题的RAG系统。文章详细展示了各框架下的项目结构、核心代码实现(包括向量检索、对话记忆管理和结构化输出)以及运行方式,该方案为开发者提供了从零构建RAG系统的参考实现。
2025-12-18 12:27:05
664
原创 Spring AI, LangChain和LangGraph(一)
摘要:本文对比了SpringAI、LangChain和LangGraph三种AI架构。SpringAI采用分层设计,强调结构化Prompt处理和拦截器机制;LangChain以Python优先,专注于LLM编排和工具快速集成;LangGraph采用图结构编排,支持可视化节点流程设计。三者各有侧重:SpringAI适合企业级强类型应用,LangChain注重开发者灵活性,LangGraph擅长复杂流程的可视化编排。核心差异体现在Prompt处理、工具集成方式和编排模型上,为不同场景的AI应用开发提供了多样化选
2025-12-17 18:13:50
708
原创 Vue和React开发规范 (六)
本文总结了JavaScript编码规范的主要要点: 变量声明推荐使用const/let替代var,优先使用const 对象和数组应使用字面量创建,方法使用简写形式 推荐使用解构赋值获取对象/数组的多个值 字符串使用单引号,长字符串推荐使用模板字符串 函数参数避免修改,使用默认参数替代arguments 推荐使用箭头函数,简单表达式可省略return 数组操作推荐使用push/map等现代方法 对象属性简写应与普通声明分组 规范旨在提升代码可读性和一致性,部分规则可由Prettier/ESLint自动格式化,
2025-08-21 17:38:15
720
原创 Vue和React开发规范 (五)
本文总结了CSS规范要点,包括编码格式、代码风格、选择器使用、值与单位、属性书写顺序等。强调UTF-8编码、展开格式、多选择器换行、0值省略单位、属性分组书写等最佳实践。推荐使用Autoprefixer自动处理浏览器前缀,避免滥用!important,并提供了Vue/React项目的样式覆盖方案。通过正反示例对比,帮助开发者编写更规范、易维护的CSS代码。
2025-08-20 13:10:26
1091
原创 Vue和React开发规范 (四)
Vue和React在属性命名规范上有显著差异:Vue遵循HTML短横线命名(kebab-case),而React采用JS驼峰命名(camelCase)。Vue中HTML原生属性、特殊属性(class/for)、aria-*和data-*属性都使用短横线命名;React则将特殊属性转换为className/htmlFor,其他保留原样。组件Props传递时,Vue父组件用短横线命名,子组件接收可用驼峰;React全程使用驼峰命名。组件作为属性传递时,Vue需通过<component :is="">渲染,Rea
2025-07-28 21:21:36
755
原创 Vue和React开发规范 (三)
Vue和React在编码规范上有许多相似之处,主要包括:1. 将导入语句放在其他JavaScript语句之前,提高代码可读性;2. 为可选属性设置默认值,增强组件健壮性;3. 使用业务相关的唯一ID作为组件key,提高渲染性能;4. 避免在模板中使用复杂表达式,保持视图层简洁;5. 限制行内样式的使用,优先使用CSS类管理样式。这些规范通过各自的ESLint插件(如vue/require-default-prop和react/require-default-props)强制执行,旨在提高代码质量、可维护性和
2025-06-17 17:03:17
931
原创 Vue和React开发规范 (二)
本文介绍了前端开发中常用的编码命名规范,包括 lower-kebab-case(短横线命名法)、camelCase(驼峰命名法)和 PascalCase(帕斯卡命名法),并详细说明了在 Vue 和 React 项目中的具体应用规范。主要涵盖:1)目录文件夹采用 lower-kebab-case 命名;2)非组件文件统一使用 lower-kebab-case;3)组件文件和组件名使用 PascalCase;4)组件 props 属性采用 camelCase;5)自定义事件使用 kebab-case,而非自定义
2025-06-16 20:22:32
960
原创 Vue和React开发规范 (一)
本文总结了Vue和React框架在HTML规范、组件样式隔离方面的差异与最佳实践。在HTML规范方面,Vue更接近原生HTML,而React采用JSX语法,在属性命名、闭合规则等方面有所不同。组件样式隔离方面,Vue提供scoped和CSS Modules方案,React则推荐CSS Modules和styled-components。文章对比了各方案的适用场景,为开发者选择合适的技术方案提供了参考
2025-06-16 15:50:12
952
原创 Python3一些常用函数
参数说明:prompt: 提示信息函数接受一个标准输入数据,返回为 string 类型。无论输入的是数字还是字符串,统一按照字符串类型输出。
2023-08-16 16:25:26
496
原创 从FastAPI,Django,Flask到Express(五)异步任务
本文总结了四大主流Web框架(FastAPI、Django、Flask、Express)配置异步任务的完整方案。重点解析了FastAPI与Celery集成的详细步骤,包括任务类型区分(同步/原生异步)、Celery实例配置、任务定义、Worker启动方式及生产环境部署建议。对于轻量任务推荐使用FastAPI内置的BackgroundTasks,复杂任务则需Celery支持。还提供了项目结构示例、代码优化建议和生产环境配置,帮助开发者实现高效可靠的异步任务处理。
2023-05-03 17:56:48
458
原创 从FastAPI,Django,Flask到Express(四)Session和JWT
FastAPI提供了两种用户认证方式:Session和JWT。Session方式通过starlette-sessions实现,需要配置中间件并存储会话数据,适用于传统Web应用。JWT方式使用python-jose生成令牌,无状态且适合分布式系统。两种方式都包含密码哈希处理、用户验证和登录/登出接口,但Session依赖服务器存储状态,而JWT通过签名令牌实现认证。示例代码展示了完整的实现流程,包括密码加密、用户验证和接口保护。
2023-05-03 17:56:13
285
原创 从FastAPI,Django,Flask到Express(三)ORM
三大主流ORM框架(Django/SQLAlchemy/Sequelize)对比分析 摘要: 本文重点介绍Django ORM的特性与使用方法,涵盖从配置到CRUD的完整流程。
2023-05-03 17:55:39
275
原创 从FastAPI,Django,Flask到Express(二)路由和视图
本文整理了FastAPI、Django等主流Web框架的核心实现指南。FastAPI部分详细展示了模块化项目结构,包含数据库配置、数据模型(Pydantic+ORM)定义,路由分组(APIRouter)实现书籍管理和通用功能接口,以及应用入口配置。Django部分采用标准MVC模式,通过路由分发、视图类和模板渲染实现功能。文章采用统一结构对比各框架在路由配置、视图处理、请求验证等方面的实现差异,为开发者提供清晰的参考模板。
2023-05-03 17:54:17
452
转载 Golang与Java全方位对比总结
本文对比了Golang与Java在基础语法、结构体函数、异常处理、并发编程及垃圾回收等方面的差异。Golang具有严格的编码规范,变量必须使用,可见性通过首字母大小写控制,支持逗号ok模式和多返回值。结构体代替类,支持组合而非继承,函数与方法分离。Java则基于类构建,具有清晰的层次接口。在参数传递方面,Golang的slice表现类似引用类型,而固定长度数组为值传递;Java数组均为引用传递。对象处理上,Golang是值拷贝,Java是引用传递。两种语言在类型系统、作用域控制和程序设计理念上存在显著差异。
2023-05-03 17:47:42
1430
1
转载 消息队列基本原理和选型对比
erlang 有并发优势,性能较好。虽然源码复杂,但是社区活跃度高,可以解决开发中遇到的问题;业务流量不大的话可以选择功能比较完备的 RabbitMQ。
2023-05-03 17:43:39
250
原创 Windows上Docker Desktop安装和Kubernetes使用
先安装Docker_Desktop,用docker -v 看版本,我的显示是Docker version 20.10.8, build 3967b7d
2021-10-16 17:50:22
1277
原创 电商App项目的离线数仓
相关概念SKU,SPU:首先通过检索搜索出来的商品列表中,每个商品都是一个SKU。每个SKU都有自己独立的库存数。也就是说每一个商品详情展示都是一个SKU。比如,咱们购买一台iPhoneX手机,iPhoneX手机就是一个SPU,但是你购买的时候,不可能是以iPhoneX手机为单位买的,商家也不可能以iPhoneX为单位记录库存。必须要以什么颜色什么版本的iPhoneX为单位。比如,你购买的是一台银色、128G内存的、支持联通网络的iPhoneX ,商家也会以这个单位来记录库存数。那这...
2021-09-27 15:29:09
997
原创 Vue2,Vue3,React的对比
本文对比了Vue2、Vue3和React三大主流前端框架的关键特性,包括:安装方式、生命周期、目录结构、组件写法、状态管理、路由等核心概念。Vue2采用选项式API,Vue3引入组合式API和TypeScript支持,React则基于函数组件和Hooks。在状态管理方面,Vue使用Vuex,React采用Redux;路由系统实现方式类似但API不同。文章通过代码示例展示了三者语法差异,如双向绑定、事件处理等,并分析了各自的设计理念和适用场景,为开发者选择框架提供参考。
2021-09-18 13:10:01
3445
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅