自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SpringBoot+WebSocket实现直播连麦

随着互联网技术的发展,直播已成为一种主流的内容传播形式。其中,连麦功能作为直播互动的重要手段,能够有效提升用户参与感和观看体验。本文将介绍如何使用SpringBoot和WebSocket技术构建一个直播连麦系统,实现主播与观众之间的实时音视频交流和文字聊天功能。为了方便DEMO的运行,本系统基于纯内存操作实现核心业务逻辑,不依赖外部数据库或者缓存组件。

2025-10-28 17:04:42 462

原创 SpringBoot内存泄漏的11个排查方法

内存泄漏问题是Java应用尤其是长期运行的SpringBoot应用面临的常见挑战。在实际应用中,通常需要结合多种方法进行综合分析,才能准确找出问题根源。同时,完善的监控体系也能帮助我们及早发现并解决潜在问题,确保应用的长期稳定运行。

2025-10-28 16:53:46 956

原创 SpringBoot实现面对面建群(基于Redis)

面对面建群是一种基于位置的社交应用场景,允许用户在物理位置相近的情况下快速创建和加入临时群组。本文将介绍如何使用SpringBoot和Redis实现面对面建群,本示例基于Redis的各种数据结构存储应用数据。

2025-10-28 16:34:49 592

原创 SpringBoot的4种数据水平分片策略

在实际应用中,应根据业务特点、查询模式、性能需求和扩展预期来选择最合适的分片策略。无论选择哪种分片策略,都应保持分片逻辑的简洁性和可维护性,并在系统设计初期就考虑未来的扩展需求。通过合理选择分片键,结合SpringBoot和ShardingSphere等工具,可以构建出既满足业务需求又具备良好扩展性的应用。

2025-10-28 16:26:35 802

原创 SpringBoot的3种六边形架构应用方式

六边形架构的核心价值在于将业务逻辑与技术细节分离,提高系统的可维护性、可测试性和灵活性。无论选择哪种实现方式,都应该坚持这一核心原则,保持领域模型的纯粹性和边界的清晰性。需要特别说明的是,架构应该服务于业务,而非相反。选择合适的架构方式,应以提高开发效率、系统质量和业务适应性为目标。

2025-10-28 16:23:21 912

原创 SpringBoot的6种数据库垂直分片实现策略

垂直分片是数据库分库分表的一种方式,它按照业务功能或数据表将原本在同一个数据库的数据拆分到不同的数据库实例中。与水平分片(将同一张表的数据按照某种规则分散到不同库或表中)不同,垂直分片主要解决的是业务模块的解耦和单库的资源瓶颈问题。

2025-10-27 19:14:20 1422

原创 Spring Boot 的 3 种二级缓存落地方式

一级缓存(本地缓存):直接在应用服务器内存中,访问速度极快,但容量有限且在分布式环境下无法共享二级缓存(分布式缓存):独立的缓存服务,如Redis或Memcached,可被多个应用实例共享,容量更大二级缓存的工作流程通常是:先查询本地缓存,若未命中则查询分布式缓存,仍未命中才访问数据库,并将结果回填到各级缓存中。该方案通过自定义缓存框架,精确控制缓存的读写流程、失效策略和同步机制,实现更加贴合业务需求的二级缓存。这种方式虽然实现复杂度高,但提供了最大的灵活性和控制力。

2025-10-27 17:25:32 648

原创 Spring Boot 的 3 种动态 Bean 注入技巧

/ 自定义条件判断逻辑@Override// 获取注解属性// 获取当前环境// 检查是否匹配// 自定义条件注解@Bean@Bean通过合理选择和组合这些技巧,我们可以构建更加灵活、模块化和可扩展的 Spring Boot 应用。关键是根据实际需求选择合适的技术,保持代码的简洁和可维护性。

2025-10-27 17:16:06 400

原创 SpringBoot实现6种JWT令牌失效方案

每种方案都有其优缺点和适用场景,选择合适的方案取决于应用的安全需求、性能要求和架构设计。在实际应用中,常常需要组合使用多种策略,构建多层次的安全防护。

2025-10-27 17:13:58 1025

原创 SpringBoot的4种Bean注入冲突解决方案

Bean注入冲突指的是当Spring容器中存在多个相同类型的Bean实例时,在进行依赖注入时,Spring不知道应该注入哪一个实例的情况。多个类实现了同一个接口配置了多个相同类型的Bean引入的第三方库中含有相同类型的Bean定义@Qualifier@Qualifier@Service@Alipay// 实现略@Service@Wechat// 实现略@Service@Autowired@Wechat// 方法略@Override// 获取注解属性。

2025-10-27 17:07:24 836

原创 SpringBoot防重放攻击的5种实现方案

重放攻击是一种网络攻击手段,攻击者截获一个有效的数据传输,然后在稍后的时间重新发送相同的数据,以实现欺骗系统的目的。重复提交订单付款请求重复使用过期的访问令牌重复提交表单数据重新发送包含认证信息的请求在实际应用中,往往需要组合使用多种防重放策略,实施分层防护,并与业务逻辑紧密结合,才能构建出既安全又易用的系统。防重放攻击只是Web安全的一个方面,还应关注其他安全威胁,如XSS、CSRF、SQL注入等,综合提升系统的安全性。

2025-10-24 16:41:27 685

原创 Spring Boot Fat Jar 的三种打包方式

对于更复杂的打包需求,可以创建自定义的Assembly描述符文件:<formats></formats><fileSets>-- 应用jar文件 --><fileSet><includes></fileSet>-- 配置文件 --><fileSet><includes></fileSet>-- 启动脚本 --><fileSet><includes></fileSet>-- 所有依赖 --><excludes><plugin><goals></goals>

2025-10-24 16:30:57 647

原创 SpringBoot的5种请求映射优化方式

Spring MVC使用HandlerMapping组件将HTTP请求映射到处理器(通常是控制器方法)。通过自定义HandlerMapping,可以实现更灵活的请求路由策略,满足特定业务需求。

2025-10-24 16:26:24 457

原创 SpringBoot的4种抽奖活动实现策略

在实际项目中,我们需要根据业务需求、用户规模、性能要求等因素,选择合适的抽奖策略或组合多种策略,以构建高效、可靠、安全的抽奖系统。无论选择哪种抽奖策略,都需要关注系统的公平性、性能、可靠性和安全性,不断优化和改进。

2025-10-24 16:23:52 843

原创 SpringBoot的5种签到打卡实现方案

在实际应用中,可以根据具体需求、用户规模、安全要求和预算等因素选择最合适的方案,也可以将多种方案结合使用,构建更加完善的签到打卡系统。

2025-10-24 16:17:09 675

原创 SpringBoot的4种死信队列处理方式

Override// 记录重试失败信息try {// 存储失败消息到数据库// 添加失败信息到消息头// 发送到失败队列// 发送告警// 构造函数、getter方法等headers,new Date()死信队列是消息中间件系统中的重要安全网,通过合理的处理策略,可以提高系统的可靠性和健壮性。在实际应用中,可能需要结合多种方式,构建一个全面的死信处理框架。

2025-10-23 21:53:09 706

原创 SpringBoot的5种日志输出规范策略

Service// 处理支付逻辑@Component});// 确保应用关闭时处理完所有日志try {if (!}));= null) {} else {这些策略不是相互排斥的,而是可以结合使用,共同构建完整的日志体系。

2025-10-23 21:47:19 640

原创 SpringBoot离线应用的5种实现方式

嵌入式数据库直接集成在应用程序中,无需外部数据库服务器,非常适合离线应用场景。在SpringBoot中,可以轻松集成H2、SQLite、HSQLDB等嵌入式数据库。本方案利用Java内存缓存框架(如Caffeine、Ehcache)结合本地持久化存储,实现数据的本地缓存和离线访问。该方案特别适合读多写少的应用场景。离线优先架构(Offline-First)是一种设计理念,它将离线状态视为应用的默认状态,而不是异常状态。在这种架构中,数据首先存储在本地,然后在条件允许时同步到服务器。

2025-10-23 21:42:29 729

原创 SpringBoot实现简易直播

采集端:负责采集、编码音视频数据流媒体服务器:处理音视频流的转发、转码和分发CDN:提供内容分发服务,解决大规模用户访问问题播放器:解码并播放音视频内容信令服务:管理直播间信息、用户状态等。

2025-10-22 19:57:35 1218

原创 SpringBoot实现实时弹幕

弹幕系统允许用户发送的评论直接显示在视频画面上,这些评论会从右向左横向滚动。@Data// 弹幕内容// 弹幕颜色// 字体大小// 视频时间点// 关联的视频ID// 发送用户ID// 用户名// 创建时间@Mapper/*** 根据视频ID查询所有弹幕,按时间排序*//*** 根据视频ID和时间范围查询弹幕*/

2025-10-22 19:47:07 506

原创 SpringBoot模块化开发的5种组织方式

Bean@Bean@Bean@Bean# 在应用配置文件中@Service@AutowiredSpringBoot模块化开发提供了多种组织方式,每种方式都有其适用场景和优缺点。选择合适的模块化策略应考虑项目规模、团队结构、业务复杂度和未来演进方向。最重要的是,模块化应该是渐进式的过程,随着项目的发展不断调整和优化模块结构,以适应不断变化的业务需求和技术环境。

2025-10-22 19:38:19 977

原创 SpringBoot慢查询的6种监控方案

几乎所有主流关系型数据库都提供了内置的慢查询日志功能,通过设置阈值,将执行时间超过阈值的SQL记录到专门的日志文件中。利用Spring AOP机制,在Repository方法执行前后添加切面,计算执行时间并记录超过阈值的方法调用。利用Spring Boot Actuator和Micrometer提供的指标收集功能,监控数据库操作性能,并将数据导出到监控系统。P6Spy是一个开源的JDBC代理框架,能够拦截JDBC操作并记录SQL语句的执行情况,包括执行时间、参数等信息。

2025-10-22 19:34:04 891

原创 SpringBoot扫码登录实现

在移动互联网时代,扫码登录已成为Web应用不可或缺的登录方式。本文基于SpringBoot框架实现了一个完整的扫码登录系统DEMO。

2025-10-22 19:29:37 483

原创 SpringBoot数据转换的4种对象映射方案

/ 默认值处理// 自定义方法处理复杂转换// 格式化电话号码逻辑对象映射是Spring Boot应用中的常见需求,选择合适的映射方案能显著提高开发效率和应用性能。根据项目规模、性能要求和团队熟悉度选择合适的方案,同时注意映射过程中的深浅拷贝、循环引用等问题。合理使用对象映射工具,可以大幅减少样板代码,提高代码质量和可维护性。

2025-10-20 21:34:46 551

原创 SpringBoot解决依赖冲突的5个技巧

精简依赖:只引入真正需要的依赖,移除未使用的依赖版本统一:尽量使用同一个版本的关联库,如Spring各组件定期更新:定期更新依赖版本,特别是安全补丁使用属性管理版本:将版本号提取为属性统一管理建立依赖白名单:在企业级应用中,建立统一的依赖白名单,避免引入不必要或有安全风险的依赖在SpringBoot项目中,依赖管理的重要性不言而喻。合理的依赖管理不仅能解决冲突问题,更能提升应用的稳定性和安全性。最后,依赖管理是一个持续的过程,随着项目的迭代和发展,需要不断优化和调整依赖策略。

2025-10-20 21:32:59 897

原创 SpringBoot多租户系统的5种架构设计方案

多租户架构是构建现代SaaS应用的关键技术,选择多租户模式需要平衡数据隔离、资源利用、成本和复杂度等多种因素。通过深入理解这些架构模式及其权衡,可以根据实际情况选择适合的多租户架构,构建可扩展、安全且经济高效的企业级应用。

2025-10-20 21:31:19 734

原创 SpringBoot插件化架构的4种实现方案

这种方案利用Spring提供的条件注解(如@Conditional、@ConditionalOnProperty等)实现插件的动态加载。通过配置文件或环境变量控制哪些插件被激活,适合简单的插件化需求。SPI(Service Provider Interface)是Java提供的一种服务发现机制,允许第三方为系统提供实现。SpringBoot也提供了类似机制的扩展,可以利用它实现一种松耦合的插件化架构。SpringBoot的自动配置机制是实现插件化的另一种强大方式。

2025-10-20 21:26:15 543

原创 SpringBoot接口安全的5种访问控制方法

*** 窗口期(秒)*//*** 窗口期内最大请求数*/在实际应用中,往往需要根据具体场景组合使用这些方法,构建多层次的安全防护体系。同时,安全是一个持续的过程,除了技术手段外,还需要定期的安全审计、漏洞扫描和安全意识培训。

2025-10-20 21:16:29 807

原创 【数据结构与算法】———深度优先:“死磕 + 回头” 的艺术

DFS 这算法说难也难,说简单也简单。核心就是 “一条道走到黑,走不通就回头”,跟咱生活中试错的过程一模一样。多练几道力扣题(比如子集、电话号码的字母组合),你就会发现:哦,原来 DFS 就是这么回事儿,之前真是想复杂了!最后送句抖音热评:“递归一时爽,一直递归一直爽,直到栈溢出 —— 那就换栈实现呗!” 掌握 DFS,算法题从此少掉一把头发~

2025-10-15 19:30:57 493

原创 别再用暴力排序了!大小顶堆让「取极值」效率飙升至 O (log n)

堆的本质是 “完全二叉树”(除最后一层外,每一层节点数均满;最后一层节点从左到右排列),但需满足以下优先级规则:类型核心规则(父节点 vs 子节点)关键特性大顶堆父节点的值大于等于其左右子节点的值根节点是整个堆的最大值小顶堆父节点的值小于等于其左右子节点的值根节点是整个堆的最小值结构本质:堆是 “完全二叉树” 的数组实现,核心是 “父节点与子节点的固定优先级关系”。操作效率:插入、删除堆顶的时间复杂度均为 O (log n),远优于 “直接排序后取极值” 的 O (n log n)。

2025-10-15 19:29:39 550

原创 正则表达式:为什么它成了程序员的 “分水岭”?

d:匹配任意数字(等价于[0-9])\D:匹配任意非数字(等价于[^0-9])\w:匹配字母、数字或下划线(等价于[a-zA-Z0-9_])\W:匹配非字母、数字和下划线\s:匹配空白字符(空格、制表符\t、换行符\n等)\S:匹配非空白字符# 匹配由字母组成的单词print(words) # 输出: ['Hello', 'world', 'This', 'is', 'a', 'test']

2025-10-15 19:29:04 941

原创 都说 SpringBoot 启动慢 ,你知道慢在哪里吗?

整个过程中 ,Client 端的连接是最耗时的,其次是配置读取。也就是外部资源的加载更耗时。所以后面看看新版本的时候 ,来看一下他们是怎么解决的 ,以及其他优秀的开源组件又是怎么解决的。SpringBoot 本身是知道自己过于臃肿的 ,所以在后面的迭代中都有意识的为自己的代码进行瘦身。先看懂了 SpringBoot2 的慢 ,后面会有一篇来感受一下SpringBoot3 干了什么 ,以及是否真的提升了加载的速度。清明光顾着玩去了 ,实在没时间研究什么,最后半天感兴趣研究了下。

2025-10-15 19:27:36 641

原创 十年经验竟不懂Springboot日志

有些时候,使用包提供的来热更新日志打印器级别,是有点不方便的,因为想要热更新日志级别而引入包,大部分时候这个操作都有点重,而通过上面的分析,我们发现其实热更新日志打印器级别的原理特别简单,就是通过来操作Logger,所以我们可以自己提供一个接口,通过这个接口来操作Logger的级别。// 省略getter和setter通过调用上述接口使用就能够完成指定日志打印器的级别热更新。对于Log4j2日志框架,我们需要知道Logger只是一个壳子,灵魂是Logger持有的。Springboot。

2025-10-15 19:26:12 610

原创 SpringBoot接口限流的常用方案

http {# 定义限流共享内存区(名称=one,大小=10MB,速率=10请求/秒)# 其他全局配置...$binary_remote_addr:限流的键(基于客户端 IP 地址)。zone=one:10m:共享内存区名称为 one,大小为 10MB(根据客户端数量调整,10MB 约支持 16 万 IP)。rate=10r/s:基础速率(每秒允许 10 个请求)。

2025-10-15 19:24:29 884

原创 Redis是如何高效管理有限内存的?

Redis 内存淘汰时,会使用随机采样的方式来淘汰数据,它是随机取 5 个值 (此值可配置) ,然后淘汰一个最少访问的key,之后把剩下的key暂存到一个池子中,继续随机取出一批key,并与之前池子中的key比较,再淘汰一个最少访问的key。以此循环,直到内存降到maxmemory之下。

2025-10-14 21:25:52 620

原创 Redis的设计与实现——内部数据结构、IO模型、内存淘汰/过期策略

新算法会维护一个候选池(大小为 16),池中的数据根据访问时间进行排序,第一次随机选取的 key 都会放入池中,随后每次随机选取的 key 只有在访问时间小于池中最小的时间才会放入池中,直到候选池被放满。当然如果这个数组一直不变,那么哈希冲突会变很多,这个时候检索效率会大打折扣,所以 Redis 就需要把数组进行扩容(一般是扩大到原来的两倍),但是问题来了,扩容后每个哈希桶的数据会分散到不同的位置,这里涉及到元素的移动,必定会阻塞 I/O,所以这个 ReHash 过程会导致很多请求阻塞。

2025-10-14 21:24:55 664

原创 Redis缓存问题-缓存穿透、缓存击穿、缓存雪崩与多级缓存架构设计

Big Key 是指 key 对应的 value 所占的内存空间比较大,例如一个字符串类型的 value 可以最大存到 512MB,一个列表类型的 value 最多可以存储 232−12^{32}-1232−1 个元素。如果按照数据结构来细分的话,一般分为字符串类型 Big key 和非字符串类型 Big Key。字符串类型:体现在单个 value 值很大,一般认为超过 10KB 就是 Big Key,但这个值和具体的 OPS 相关。非字符串类型:哈希、列表、集合、有序集合,体现在元素个数过多。

2025-10-14 21:23:34 987

原创 Mysql锁的内部实现机制浅析

虽然现在关系型数据库越来越相似,但其背后的实现机制可能大相径庭。实际使用方面,因为SQL语法规范的存在使得我们熟悉多种关系型数据库并非难事,但是有多少种数据库可能就有多少种锁的实现方法。Microsoft Sql Server2005之前只提供页锁,直到2005版本才开始支持,乐观模式下允许实现行级别锁,在Sql Server的设计中锁是一种稀缺资源,锁的数量越多,开销就越大,为了避免因为锁的数量快速攀升导致性能断崖式下跌,其支持一种称为的机制,一旦行锁升级为页锁,并发性能就又回到原点。

2025-10-14 21:19:50 1005

原创 面试官微笑发问:第100万页怎么查?我差点当场沉默…

到这儿,我们已经盘点了超大分页的优化思路。那面试的时候,怎么说才显得层次分明?先指出问题本质:MySQL 分页是“扫描+丢弃”,大页 offset 性能差。再讲 SQL 优化用索引替代 offset子查询+join(延迟关联)游标式分页(基于主键/时间)补充业务优化:限制页数、增加条件、下拉刷新。顺带提 MySQL 8.x 特性:窗口函数、CTE 等。这样回答下来,既有深度,又有广度,面试官一定会点头。

2025-10-14 21:18:42 1368

原创 如何为MySQL中的JSON字段设置索引

尽管MySQL无法直接对JSON列建立索引,但通过生成列和函数索引的方式间接索引特定字段能够满足绝大多数场景。同时这种方式不仅适用于JSON,还适用于其它复杂或难以索引的模式。

2025-10-14 21:17:28 949

空空如也

空空如也

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

TA关注的人

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