自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java并发List实战:CopyOnWriteArrayList原理与ArrayList常见面试题

本文讨论了ArrayList的线程安全问题及其解决方案。通过多线程并发测试验证了ArrayList的非线程安全性,指出了可能出现的null值、索引越界和size计数错误问题。提供了三种线程安全解决方案:Collections.synchronizedList()、CopyOnWriteArrayList和使用Vector。重点分析了CopyOnWriteArrayList的实现原理,包括volatile修饰数组、写操作加锁及写时复制机制。还解析了ArrayList的扩容机制(默认容量10,扩容1.5倍)。文

2025-11-04 13:53:51 2204

原创 《深入浅出RabbitMQ:从零基础到面试通关》

本文介绍了消息队列的核心概念及其在分布式系统中的应用。消息队列采用FIFO结构实现进程间通信,主要解决系统耦合、提高性能、保证数据可靠性等问题。RabbitMQ作为主流消息队列,其核心组件包括生产者、消费者、队列、交换机等。文章详细解析了RabbitMQ的延迟消息实现(死信队列和插件)、死信队列机制及防止重复消费的方案(幂等性、消息确认、持久化等)。这些知识点不仅是实际开发中的重要工具,也是后端开发岗位的高频面试题,理解这些概念对设计高可用分布式系统至关重要。

2025-08-03 23:16:42 1894

原创 《秋招在即!Redis缓存三大坑:穿透、击穿、雪崩详解与实战解决方案

本文介绍了三种常见的缓存问题及解决方案。缓存击穿指热点key失效导致请求直接访问数据库,可通过互斥锁、逻辑过期或京东hotkey中间件解决;缓存穿透是查询不存在的数据导致数据库压力过大,建议采用参数校验、缓存空值结合布隆过滤器;缓存雪崩是大量key同时失效或Redis宕机,可通过随机过期时间、多级缓存、预热和集群高可用预防。这些方案在实际开发中常需组合使用,是保障系统稳定性的重要技术手段。

2025-07-30 21:04:07 1316

原创 蓝桥杯Python算法竞赛常用的函数库

most_common(x):返回出现频率最高的 x 个元素及其出现次数,以元组列表的形式返回。使用dict时,当访问一个不存在的key,就会抛出KeyError。如果希望这个key不存在时,会使用提供的默认工厂函数创建一个默认值。在字典中获益key有两种方式,第一种是get,第二种通过[]获取。2.repeat:表示这些可迭代序列重复的次数。elements():返回一个迭代器,每个元素重复对应次数。用于计数,他可以统计列表中每个元素出现的次数。2.操作序列和集合方面的函数。clear():清空。

2024-07-20 12:23:55 11272

原创 拒绝服务雪崩!4种经典限流算法图文详解(附Java实战代码)

在高并发系统中,如何防止流量洪峰击垮服务器?本文深入浅出地讲解了固定窗口、滑动窗口、漏桶、令牌桶4种经典限流算法,配合生动的图解和Java代码示例,助你轻松掌握高并发“保命”技能。

2026-01-10 01:32:52 428

原创 互联网大厂“黑话”完全破译指南

刚入职大厂听不懂“对齐”、“抓手”?开会被WLB、TP99、灰度发布绕晕?本文为你准备了一份保姆级黑话词典,从职场通识到技术硬核,用最接地气的大白话拆解20+个高频词汇,助你从小白秒变资深“互联网人”,建议收藏防身!

2026-01-07 03:31:22 809

原创 拒绝频繁写库!SpringBoot 整合 BufferTrigger 实现高性能“流量聚合”

摘要:BufferTrigger是快手开源的一款轻量级数据缓冲触发器,用于解决高并发场景下的数据库写入压力问题。通过"攒够N条或等待T秒"的聚合策略,将高频小数据批量处理,显著提升I/O效率。文章以视频播放量统计为例,展示了如何在SpringBoot中整合BufferTrigger,通过配置批量大小(1000条)和时间窗口(3秒)实现自动聚合入库,同时处理了线程安全和优雅停机问题。该方案适用于播放量统计、埋点上报等高并发低价值密度的业务场景,相比直接写入数据库可提升千倍性能。

2025-12-28 23:25:14 476

原创 ZooKeeper 实战指南:从入门到场景解析

本文介绍了Apache ZooKeeper分布式协调服务的核心概念与应用。主要内容包括:1)ZooKeeper的树形Znode数据模型及四种节点类型特性;2)使用Docker快速搭建单节点环境的实践方法;3)常用CLI命令详解,涵盖CRUD操作和关键参数;4)典型应用场景解析,如分布式锁、配置管理和服务注册中心;5)以美团Leaf为例展示ZooKeeper在分布式ID生成中的实际应用。文章为读者提供了从基础搭建到典型应用的完整学习路径,帮助理解ZooKeeper如何解决分布式系统中的协调问题。

2025-12-18 10:38:54 1313

原创 深入浅出分布式 ID 生成方案:从原理到业界主流实现

分布式ID生成系统在分库分表场景下至关重要。本文分析了传统方案(UUID、数据库自增、Snowflake)的局限性,重点介绍了三种主流开源方案: 百度UidGenerator:基于Snowflake改进,采用RingBuffer缓存机制,支持600万+QPS; 滴滴TinyID:基于数据库号段模式,提供双号段缓存和HTTP接口,保证高可用性; 美团Leaf:提供号段和雪花两种模式,创新性采用双Buffer机制优化性能,通过ZK管理WorkID并有效解决时钟回拨问题。 这些方案各具特色,可满足不同业务场景

2025-12-18 10:21:58 562

原创 为什么你的 MySQL 存不下海量文本?聊聊 Cassandra 的正确打开方式

本文探讨了海量短文本数据的存储方案选型问题。首先分析了MySQL在处理大规模文本数据时的局限性,包括存储效率低、索引性能差等问题。随后对比了Redis、MongoDB等NoSQL方案的优缺点,重点推荐了Apache Cassandra这一分布式NoSQL数据库,其无中心化架构、高写入吞吐量和线性扩展能力特别适合海量文本存储场景。文章还提供了使用Docker快速部署Cassandra的实战指南,包括镜像拉取、数据目录挂载和CQL命令行操作等步骤,为开发者提供了一个高效处理短文本数据的解决方案。

2025-12-17 18:52:30 828

原创 防住了超卖,却输给了“少卖”?

电商系统库存与订单管理的并发控制要点: 库存扣减策略:采用Redis预扣(下单减库存)+数据库实扣(支付减库存)的折中方案,平衡用户体验与库存安全。 防超卖:通过Redis Lua脚本实现原子性库存扣减,确保高并发下的数据一致性。 防少卖:异步订单落库时可能因消息丢失导致Redis库存已扣但订单未生成,需引入库存回补或对账机制。 支付与关单并发控制:使用状态机规范订单状态流转(如PENDING→PAID/CLOSED),结合乐观锁(CAS更新)避免支付回调与定时任务的冲突,确保状态变更的原子性。

2025-12-16 13:13:18 2421

原创 Kafka 技术架构与核心原理深度解析

本文深入解析Apache Kafka的核心架构与消息处理机制。Kafka作为分布式流媒体平台,通过Topic、Partition和Offset实现高吞吐消息处理。Producer API发布消息,Consumer Group实现可扩展消费,保证单Partition单消费者顺序处理。Kafka结合队列和发布订阅优势,采用Pull模式避免过载。文章重点分析消息可靠性问题:先提交Offset可能导致数据丢失,后提交则可能重复消费,建议通过幂等性设计解决。

2025-12-15 19:51:43 965

原创 深入解析 Apollo:微服务时代的配置管理利器

Apollo是携程开源的分布式配置中心,解决微服务架构下配置管理的核心痛点。它提供统一Web界面管理多环境、多集群配置,支持秒级热发布、灰度发布和版本回滚,确保配置修改实时生效且可追溯。Apollo具备完善的权限体系与审计功能,架构简单依赖MySQL,支持高可用和容灾。作为成熟的配置治理方案,是云原生应用的重要基础设施。

2025-12-14 14:51:28 657 1

原创 Java9-17新特性

Java接口特性演进:从Java8引入default/static方法,到Java9支持private私有方法,增强了接口封装性。Java11新增var关键字简化局部变量声明,但仅限方法内使用且不能赋null或未初始化。Java14改进switch语法,支持箭头表达式和代码块,省去break。Java15引入多行字符串文本(""")和转义字符处理。Java16增强instanceof模式匹配,支持自动类型转换,并新增record类型自动生成不可变数据类的构造器、getter等

2025-12-10 01:50:03 255

原创 Go和Java的语言特性对比

摘要:Go和Java在语言设计、并发模型、性能指标等方面存在显著差异。Go以简洁高效著称,采用轻量级goroutine和channel实现并发,适合云原生、高并发场景;Java强调面向对象和可移植性,线程模型较重量级,适用于企业级复杂系统。性能上Go在编译速度、内存占用和启动时间占优,而Java在JIT优化后性能接近Go。语法方面Go更简洁,Java更完整但复杂。未来Go将完善泛型支持,Java则聚焦低延迟和值类型优化。两者各有优势,需根据具体场景选择。

2025-11-24 21:25:54 684

原创 《后端开发者快速上手:Vue3 + Element Plus 前端开发概念映射与实战技巧》

本文总结了前端Vue与后端概念的对应关系,主要包括数据绑定、组件、属性、数据流和函数调用的映射。介绍了常见模式如搜索表单、下拉选择和表格列的写法,并提炼了5个记忆口诀。还涉及高级概念如模板插槽、组件导入和字典系统的使用。全文通过前后端类比,帮助开发者理解Vue的核心概念和Element UI组件的应用场景。

2025-11-19 23:23:01 3600 2

原创 Java并发常用的工具以及常见面试题

本文介绍了Java中常见的并发工具类及其应用。CountDownLatch通过计数器实现线程协调,当计数器归零时唤醒等待线程;CyclicBarrier让一组线程相互等待至公共屏障点,可重复使用;Semaphore通过许可证机制控制并发线程数;Callable接口支持有返回值的任务执行;Future用于获取异步任务结果。文中对每个工具都提供了示例代码和核心原理说明,并包含CountDownLatch的面试题解答,强调其通过计数器递减实现线程同步的特性。

2025-11-15 00:04:06 738

原创 Java并发实战:ConcurrentHashMap原理与常见面试题

摘要:本文探讨了Java中HashMap在多线程环境下的线程安全问题。通过代码示例展示了并发修改HashMap导致的ConcurrentModificationException异常,并提供了两种解决方案:使用synchronized同步代码块和采用ConcurrentHashMap。重点分析了JDK1.8中ConcurrentHashMap的put方法实现,结合CAS和synchronized实现高效并发控制,同时对比了1.7和1.8版本的设计差异。最后提出了关于线程安全HashMap设计的思考题

2025-11-06 14:44:29 1354

原创 Java并发Set集合实战:CopyOnWriteArraySet与常见Set集合面试题

本文探讨了Java并发环境下Set集合的安全性。通过模拟50个线程并发操作HashSet的实验,展示了线程不安全导致的ConcurrentModificationException异常。文章指出HashSet在并发状态下不是线程安全的,并给出了两种解决方案:使用Collections.synchronizedSet包装的同步Set或采用线程安全的CopyOnWriteArraySet。后者基于写时复制机制,特别适合读多写少的并发场景。通过实验验证,CopyOnWriteArraySet能有效避免并发异常

2025-11-05 00:23:07 688

原创 基于Spring Boot的Dubbo微服务实践指南

本文介绍了Apache Dubbo框架在微服务架构中的应用。作为高性能RPC框架,Dubbo具备多协议支持、动态负载均衡和容错机制等优势,能与Spring Boot无缝集成。文章重点解析了核心注解@DubboService、@DubboReference和@EnableDubbo的使用方法,并提供了YAML配置示例。最后给出了版本控制、性能优化等实践建议,强调Dubbo与Spring Boot结合可快速构建高可用微服务系统,建议配合DubboAdmin进行可视化监控。

2025-08-31 00:48:59 588

原创 Java的四种优化资源密集型任务的策略

本文介绍了四种优化资源密集型任务的策略:1)每次创建新实例,适用于简单低频任务;2)连接池模式,适合高并发场景;3)ThreadLocal模式,实现多线程资源隔离;4)使用队列进行异步任务调度。针对每种策略,文章分析了适用场景、核心思想,并提供了Java代码示例,同时列举了各自的优缺点。通过对比不同优化方案,帮助开发者根据具体需求选择合适方法,提升系统性能和稳定性。

2025-08-25 23:29:36 900

原创 Selenium框架Java实践截图服务

本文介绍了Selenium框架的核心架构及WebDriverManager实践指南。首先解析了Selenium的WebDriver三层工作原理(命令抽象、协议转换、浏览器执行)和跨浏览器兼容实现。然后详细说明WebDriverManager如何解决驱动管理痛点,包括版本匹配、自动下载和缓存优化,并提供了初始化示例和Maven配置。接着讲解了截图服务的实现方案,包括本地截图生成和对象存储集成的代码实现。最后给出了驱动管理优化、异常处理策略、性能优化等最佳实践建议,以及版本兼容性参考和常见问题解决方案。

2025-08-25 23:16:14 884

原创 Flux流式编程:从原理到实践,对比Java Stream流的异同

摘要:Flux是响应式编程的核心工具,实现异步非阻塞数据流处理,支持背压机制防止数据溢出。与Java Stream相比,Flux更适合处理实时数据流(如AI对话、日志监控),而后者适用于批量数据处理。文章介绍了Flux的创建方式、核心操作符以及Spring WebFlux集成应用,通过对比分析帮助开发者根据场景选择合适的处理方案。Flux的声明式编程风格能显著提升异步代码的可读性和性能。

2025-08-24 19:51:37 1087

原创 游标分页的原理与实战应用

文章摘要:游标分页是解决传统分页性能问题的新方案。相比基于偏移量的传统分页(如LIMIT 10 OFFSET 10),游标分页通过唯一标识符(主键/时间戳)标记位置,避免了大偏移量查询的性能下降和数据一致性问题。文章详解了游标分页的原理、SQL实现及适用场景(如社交媒体、电商评论、即时通讯),并指出其优势(性能稳定)与局限(无法跳页)。开发人员可根据业务需求,灵活选择游标字段和排序规则来优化分页体验。

2025-08-23 00:42:43 1067

原创 快速学会什么是gPRC

gRPC是一个由Google开发的高性能RPC框架,采用HTTP/2协议和Protobuf序列化技术,支持跨语言开发。其核心组件包括.proto接口定义文件和Protobuf序列化协议,能够实现高效的数据传输。在Java中使用gRPC需要先定义.proto文件,通过Maven插件生成代码,再实现业务逻辑。gRPC特别适合微服务架构、多语言系统和实时通信场景,通过统一的接口定义确保客户端和服务端的一致性,提供了一种高效、低延迟的远程调用解决方案。

2025-08-15 09:36:17 1340

原创 《四种姿势用Java玩转AI大模型:从原生HTTP到LangChain4j》

本文介绍了四种在Java项目中接入AI大模型的实用方法,重点以阿里云Qwen3模型为例进行演示。首先介绍了SDK接入方式,通过Maven依赖和API密钥实现快速集成;其次讲解了HTTP接入方案,适用于不支持SDK的语言环境;然后详细解析了SpringAI框架的核心价值与特性,包括跨供应商API、向量数据库支持等功能;最后探讨了LangChain4j框架的特点及其与SpringAI的对比。作者推荐使用SpringAI方案,因其与Spring生态的无缝集成和易用性,同时提供了完整的代码示例帮助开发者快速实现AI

2025-08-05 20:41:34 1180

原创 SpringBoot3效率神器:lombok(持续更新)

Lombok是一个Java库,它通过注解的方式自动插入代码到你的编辑器和构建工具中,从而简化Java类的编写。它可以帮助开发者自动生成Getter和Setter方法、toString、equals和hashCode方法等,让Java代码更加简洁、美观。Lombok是一个强大的Java库,它通过注解的方式自动插入代码,极大地简化了Java类的编写。通过合理使用Lombok注解,我们可以显著提高开发效率,减少样板代码的编写。

2024-09-25 19:00:09 1154

原创 SpringBoot3自动配置(持续更新)

SpringBootApplication:这是SpringBoot的主程序的注解,它包含了@SpringBootConfiguration这是一个配置类,@EnableAutoConfiguration开启自动配置,@ComponentScan自动扫描。在SpringBoot中,自动配置是一个核心的特性,在我们将SpringBoot的starter添加到自己的项目时,SpringBoot会自动配置starter所需的核心组件,会自动配置一些Servlet和Filter等。

2024-09-24 10:47:42 1272

原创 SpringBoot3快速入门(持续更新)

1.快速创建Spring应用:相较于传统的SSM框架(Spring+SpringMVC+Mybatis)架构有些繁琐的步骤(如导包,编写配置等),SpringBoot给我们提供了一些默认的配置,让我们可以快速的应用。3.提供Starter:我们可以直接在SpringBoot中引入starter:web,json,对象存储,异步,缓存等提供了配置的依赖,极大的简化了依赖管理和版本控制。4.自动配置:SpringBoot能够根据添加的依赖和配置自动配置Spring框架和第三方库。

2024-09-23 19:01:30 1471 1

原创 Mybatis快速入门

MyBatis是一款优秀的持久层框架,用于简化JDBC的开发 ,它支持定制化SQL、存储过程以及高级映射。MyBatis本是Apache的一个开源项目iBatis,2010年该项目由Apache Software Foundation迁移到了Google Code,并改名为MyBatis。2013年11月,MyBatis迁移到GitHub。

2024-08-06 14:44:58 1145

原创 Spring-Ioc,Di,Bean

在我们给大家讲解了三层架构和分层解耦,这次给大家注重的讲解一下控制反转和依赖注入,Bean对象等知识点如果我们要是实现一个案例比如:Service层及 Dao层的实现类,交给I0C容器管理,为Controller及Service注入运行时,依赖的对象。首先把Service层以及Dao层的实现类,交给IOC容器管理然后为Controller及Service注入运行时要依赖的对象。

2024-07-31 12:25:13 1259

原创 前后端分离的开发模式+YAPI接口文档

前后端的开发模式和接口的讲解

2024-07-25 16:15:08 2460 2

原创 后端开发工程师vue2初识的学习

快速认识vue

2024-07-24 14:27:56 1263

原创 3096.力扣每日一题 Java(前缀和)

如果在某个分割点,Alice的得分严格大于Bob在此之后可能获得的最大分数(这通常意味着Alice的得分加上至少一个关卡的最低分数仍然大于剩余关卡的分数总和),我们就找到了答案,即Alice需要完成的最少关卡数。然而,需要注意的是,上述过程中的第3步在实际编码时可能并不需要显式计算Bob的得分,因为我们可以直接通过比较Alice的得分和剩余关卡中简单模式与困难模式的数量差(或前缀和数组中的某个值)来做出判断。数组(从第二个元素开始,因为第一个元素代表只有一个关卡时的分数,不满足题目要求),对于每个分割点。

2024-07-19 16:47:26 1037 1

原创 3112.力扣每日一题7/18 Java 迪杰斯特拉(Dijkstra)算法

迪杰斯特拉算法的时间复杂度通常为 O(N²),其中N是顶点的数量。如果使用二叉堆如果使用二堆(或斐波那契堆)来优化选择最小距离顶点的操作,时间复杂度可以优化到O((N+M)logN),其中M是边的数量。同时考虑每个节点的消失时间,如果在节点消失之前无法到达,则标记为不可达(-1)。它的基本思想是:从一个起始顶点出发,逐步向外扩展,每次选择距离起始顶点最近且未被处理过的顶点,然后更新该顶点相邻顶点的距离。的数组来存储每个节点的最少到达时间和一个优先级队列,空间复杂度主要取决于节点数量。,还使用了一个长度为。

2024-07-19 16:35:49 967

原创 2959.力扣每日一题7/17 Java(暴力枚举+Floyd算法)

通过枚举所有可能的节点集合状态,对于每个状态,复制相关节点的距离信息到一个临时矩阵,然后在这个子集上运行 Floyd 算法计算最短路,最后检查这个子集中任意两个节点的最短路是否都不超过给定的最大距离,统计满足条件的方案数。在上述提到的问题中,使用 Floyd 算法来计算各个顶点之间的最短路径,通过三重循环遍历所有可能的中转顶点 k,以及起点 i 和终点 j,根据状态转移方程不断更新距离矩阵 f,以得到最终的最短路径信息。其核心思路是通过一个图的权值矩阵求出它的每两点间的最短路径矩阵。

2024-07-19 16:14:50 1112

原创 2956.力扣每日一题7/16 Java

来检查是否存在相同元素,若存在则。进行相同的操作,若存在相同元素则。加 1 并结束内层循环。加 1 并结束内层循环。通过两层循环来分别处理。

2024-07-19 15:55:20 455

原创 721.力扣每日一题7/15 Java(并查集)

最后,我们遍历所有邮箱地址,根据并查集的结果将它们分组到对应的账户中。对于每个组(即每个并查集的根节点),我们收集其下所有的邮箱地址,并从任意一个邮箱地址中获取对应的账户名称(因为我们已经假设了每个账户内的邮箱地址都关联到同一个名称)。对于每个账户,我们将其中的第一个邮箱地址作为代表,并将其与账户中的其他邮箱地址进行合并操作。:对于每个分组,收集其下的邮箱地址,并从任意一个邮箱地址中获取账户名称,然后构建并添加到结果列表中。:遍历所有邮箱地址,根据并查集的结果将它们分组到对应的账户中。

2024-07-19 15:45:49 1118

原创 807.力扣每日一题7/14 Java(执行用时分布击败100%)

以及一些固定大小的变量,空间复杂度为。

2024-07-14 22:54:05 843

原创 3011.力扣每日一题7/13 Java(冒泡排序)

冒泡排序解法以及冒泡排序讲解

2024-07-13 23:18:10 1367

空空如也

空空如也

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

TA关注的人

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