- 博客(173)
- 收藏
- 关注
原创 RabbitMQ-消息可靠性-publisher-confirm持久化与手动ack
本文详解RabbitMQ消息丢失的三大环节:发布端、Broker、消费端,并给出可靠性三件套方案——开启publisher confirm与return,启用队列与消息持久化,消费端采用手动ack。结合实战代码与常见坑点,强调需配合幂等性设计,确保消息不丢不重。
2026-09-17 00:15:00
298
原创 JVM-元空间溢出-OutOfMemoryError-Metaspace排查与解决
JVM 元空间溢出(Metaspace OOM)常因类加载器泄漏导致类元数据无法卸载,而非堆内存不足。Metaspace 存储类信息,与堆分离,需通过 jstat -gc 及 Arthas 工具定位异常 ClassLoader。根本解决需控制动态类生成频率或复用加载器,避免频繁创建。调大 -XX:MaxMetaspaceSize 仅治标不治本。
2026-09-16 08:30:00
218
原创 Java-volatile可见性-为什么改了标志位线程却读不到
主线程修改boolean标志后,工作线程却读不到,根源是JMM中工作内存与主内存的可见性问题。未加volatile时,变量可能被缓存,导致修改不可见。volatile确保读写直接访问主内存,保障可见性与有序性,但不保证原子性。复合操作如i++仍需用AtomicInteger或锁。关键:共享标志位必须加volatile,复杂操作另用同步机制。
2026-09-15 08:30:00
95
原创 Java-ThreadLocal内存泄漏-线程池场景下的成因与正确用法
ThreadLocal在线程池中易引发内存泄漏,因key为弱引用、value为强引用,线程复用导致ThreadLocalMap长期持有值,无法被GC回收。根本原因在于未调用remove()。正确做法是使用try-finally确保每次用完必清理,避免异常时遗漏。排查时关注“内存缓慢上涨+老年代满+线程池场景”。核心原则:线程池中使用ThreadLocal,必须成对调用set与remove,且remove放finally块。
2026-09-14 08:30:00
376
原创 MySQL慢查询排查:EXPLAIN看type等于ALL全表扫描与索引失效
本文通过真实案例揭示MySQL索引失效的常见陷阱:对索引列进行函数运算(如DATE(create_time))、表达式计算、隐式类型转换或前导模糊匹配,均会导致EXPLAIN显示type=ALL全表扫描。核心解决方案是避免在索引列上做任何计算,日期查询应使用>= '起始时间' AND < '结束时间'的范围写法,确保索引命中。排查慢查询时,重点分析EXPLAIN的type(如range优于ALL)、key(是否用索引)和Extra(有无排序/临时表)。建议开启慢查询日志,结合工具精准定位问题。
2026-09-13 08:30:00
246
原创 HikariCP连接池耗尽:全站接口超时的根因与解决
<think>We need answer Chinese, ≤150字 abstract. Need summarize article. Must be concise. Need include root cause slow SQL occupying connections, HikariCP exhaustion, solution parameters fast fail. Ensure ≤150 characters? "字" means Chinese characters, likely
2026-09-12 08:30:00
107
原创 线程池OOM:为什么禁止用Executors创建线程池
<think>我们只需要根据内容生成摘要,不超过150字。注意摘要要涵盖核心要点:禁止用Executors,因为无界队列导致OOM;显式构造ThreadPoolExecutor,有界队列,合理拒绝策略,按CPU/IO密集估算线程数。语言简洁。</think>Executors.newFixedThreadPool 默认无界队列,任务堆积致内存溢出。应显式构造 ThreadPoolExecutor,使用有界队列(如 ArrayBlockingQueue)、合理拒绝策略(如 CallerRunsPolicy),
2026-09-11 08:30:00
213
原创 Spring@Async失效:同类自调用为何不生效及3个配置要点
<think>我们只需要根据内容生成摘要,不超过150字。摘要应涵盖核心问题、原因、解决方案和配置要点。注意语言简洁。</think>@Async 在同类自调用时失效,因 this 绕过代理。解决:拆独立 Bean 或注入代理对象。生产配置要点:自定义线程池防 OOM、处理异步异常、不依赖执行顺序。
2026-09-10 08:30:00
157
原创 Redis分布式锁:SETNX加锁的3个坑与正确姿势
<think>我们根据要求生成摘要,≤150字。内容核心:Redis分布式锁SETNX三个坑:解锁不保证、无超时、不校验归属;正确姿势用SET NX EX原子加锁,try-finally解锁,校验value;超时问题用Redisson看门狗。摘要需简洁。</think>基于SETNX实现Redis分布式锁存在三大坑:业务异常导致锁泄漏、锁无过期时间、解锁不校验归属。正确做法是使用SET NX EX原子加锁,在finally中校验后删除,并设置超时。对于业务超时,可采用Redisson看门狗自动续期,避免锁提
2026-09-09 08:30:00
433
原创 SpringCloudFeign调用超时与降级:别让一个下游挂掉拖垮整个服务
<think>我们需要根据要求,生成≤150字的文章摘要。内容来自关于Spring Cloud Feign调用超时与降级的文章。摘要要概述核心内容,包括问题、解决方案和原则。注意字数限制。我们用中文写。可以提炼:案例说明下游服务变慢导致上游超时,通过配置超时时间和降级策略解决,降级原则等。确保简明扼要。</think>本文以“查会员计划”案例说明Feign调用超时与降级的重要性:下游服务变慢会拖垮上游,需显式配置超时(连接1秒、读3秒),并通过FallbackFactory降级为默认值(如FREE),同时遵
2026-09-08 08:30:00
152
原创 JWT刷新Token策略:accessToken过期如何优雅续期
<think>我们根据要求,将全文内容压缩为不超过150字的摘要。注意摘要要涵盖核心:JWT过期问题、双token策略、实现方式及安全要点。</think>JWT鉴权面临有效期两难:过短频繁掉线,过长泄露风险高。推荐双token策略:短期access token(30分钟)保障安全,长期refresh token(7天)用于无感续期。前端收到401时自动调用刷新接口换取新token并重试请求。安全上,refresh token应存httpOnly cookie、支持一次性轮换与主动吊销。
2026-09-07 08:30:00
346
原创 Nginx反向代理504排查:proxy_read_timeout默认60秒的坑
<think>我们根据内容生成摘要,不超过150字。需要概括问题、原因、解法。</think>Nginx反代504常因proxy_read_timeout默认60秒早于后端响应。解法:长任务宜异步化(返回任务ID+轮询),而非硬调超时。需区分504(等不到响应)与502(连不上后端),并显式配置超时参数。</position>
2026-09-06 08:30:00
195
原创 MySQL死锁排查:两个事务互相等待的成因与解决方案
<think>我们只需要根据内容生成不超过150字的摘要。摘要是对全文核心内容的精炼概括。关注死锁成因、解决方案、定位工具。字数要严格控制。</think>两个并发事务因加锁顺序相反(下单锁stock等balance,退款锁balance等stock)形成循环等待触发死锁。用SHOW ENGINE INNODB STATUS定位后,最有效方案是统一加锁顺序;同时建议缩短事务、必要时重试,并确保update走索引防锁范围扩大。
2026-09-05 08:30:00
217
原创 Java基础:为什么重写equals必须重写hashCode
<think>我们根据用户要求,生成≤150字的文章摘要。内容来自文章,核心是说重写equals必须重写hashCode,否则HashMap找不到。摘要要简洁。</think>重写 equals 不重写 hashCode,会使相等的对象在 HashMap 中因落入不同桶而无法匹配。HashMap 先按 hashCode 定位桶,再用 equals 比较,二者缺一不可。正确做法是 equals 和 hashCode 使用同一批字段,并尽量设计不可变对象作为 key。这是 Java 集合框架的重要契约。
2026-09-04 08:30:00
212
原创 Spring事务失效:@Transactional自调用不生效的原因与4大失效场景
<think>我们需根据内容生成≤150字的文章摘要。内容主要讲@Transactional自调用失效原理和4大场景。摘要应简洁概括核心。字数限制150字。注意是“文章摘要”,需包括关键信息:同类自调用导致代理失效、4大场景及解决。我们写个摘要,约100字左右。</think>Spring 声明式事务依赖 AOP 动态代理;同类 this 自调用绕过代理,导致 @Transactional 静默失效。解决方案:拆分独立 Bean、注入自身代理或 AopContext。失效四大场景:同类自调用、非 publi
2026-09-03 08:30:00
809
原创 Redis缓存击穿:热点Key过期打崩数据库的3种解决方案
<think>我们根据内容生成不超过150字的摘要。内容讲Redis缓存击穿,热点key过期导致数据库被打,三种解决方案:互斥锁、逻辑过期、异步重建/永不过期,并延伸防穿透。摘要要简洁、覆盖核心。控制在150字内。</think>本文通过“今日推荐”热点key过期故障,区分缓存击穿、穿透、雪崩,重点给出3种解决方案:互斥锁、逻辑过期、永不过期+后台刷新,并顺带提到空值缓存和布隆过滤器防穿透,适合高并发缓存场景。
2026-09-02 21:25:45
513
原创 Spring-Bean生命周期-构造器访问Autowired字段为null
构造器执行时,@Autowired字段尚未注入,访问必为 null。推荐使用构造器注入,或把初始化逻辑放到。三个初始化回调(@PostConstruct / afterPropertiesSet / initMethod)都在注入之后。我是无羡(小剑),全栈偏后端的独立开发者。无羡 · 独立开发者作品集。
2026-09-01 08:30:00
405
原创 Redis-内存淘汰策略-key凭空消失
Redis 内存到maxmemory会按策略淘汰 key,根本不看 TTL。重要数据别和缓存混在一个实例里,核心数据用noeviction。缓存实例优先。我是无羡(小剑),全栈偏后端的独立开发者。无羡 · 独立开发者作品集。
2026-08-31 08:30:00
162
原创 MySQL-JOIN优化-NLJ与BNL的区别与实战
join 慢,先看EXPLAIN的Extra,出现就是被驱动表没走索引。优化方向:小表驱动大表 + 被驱动表 join 字段建索引。优化器选错顺序时,用强制。我是无羡(小剑),全栈偏后端的独立开发者。无羡 · 独立开发者作品集。
2026-08-30 08:30:00
211
原创 Java-泛型擦除-反射往List塞Integer
泛型是编译期约束,运行时擦除成Object。别用反射绕过泛型检查,否则炸弹会留到遍历时才引爆。泛型方法重载要注意擦除后的签名冲突。我是无羡(小剑),全栈偏后端的独立开发者。无羡 · 独立开发者作品集。
2026-08-29 21:09:00
248
原创 CountDownLatch与CyclicBarrier的区别
计数到 0 不能重置,循环复用要么每轮 new 一个,要么换。记得放finally,避免异常导致计数永远减不到 0。Semaphore用于限流,和前两者语义不同,别混用。我是无羡(小剑),全栈偏后端的独立开发者。无羡 · 独立开发者作品集。
2026-08-29 20:54:16
286
原创 节目编排拖素材定时间分区域数字标牌的心脏在这
本文介绍了数字标牌系统的核心模块——节目编排功能的设计与实现。系统通过节目表管理播放计划(一次性、每日、每周、自定义四种排期类型),使用关联表组织素材与节目的多对多关系,并支持多区域分屏显示。前端采用拖拽式节目编辑器,设备端通过API获取JSON格式的播放指令。文章重点解析了数据库设计、排期逻辑和前后端交互方案,指出节目编排作为连接硬件与内容的关键模块,是数字标牌系统最复杂的核心功能。
2026-08-08 08:30:00
178
原创 素材管理上传图片视频分类怎么让屏幕有内容可播
本文介绍了数字标牌系统的素材管理模块设计要点。核心采用单表存储素材信息(t_material表),包含文件类型、URL、缩略图等关键字段,其中图片默认播放10秒以统一调度逻辑。文件上传通过Spring Boot处理并配置Nginx实现动静分离,素材分类采用树形结构支持无限层级。列表页设计强调可视化操作,包含类型筛选、分类树、缩略图预览和批量操作功能。作者指出这是系统文件最密集的模块,后续将重点介绍节目编排功能。文章由全栈工程师无羡撰写,属于技术复盘类内容。(149字)
2026-08-07 08:30:00
10
原创 设备管理注册心跳远程指令屏幕是怎么活起来的
本文介绍了设备管理模块的设计与实现。作为系统核心模块,设备管理包含设备注册、状态监控、分组管理等功能。文章详细解析了设备表结构设计、心跳上报机制(5分钟无心跳判定离线)、远程指令流程(异步执行状态流转)以及RESTful接口设计(包含6个认证接口和3个公开接口)。作者采用极简分组策略,仅支持一级分组,并强调权限控制(viewer/operator/admin三级权限)。该模块为后续素材管理、节目下发等功能奠定基础,实现了设备全生命周期管理能力。
2026-08-06 08:30:00
173
原创 19个权限码三级角色我用一个注解搞定了整个系统的权限校验
本文介绍了数字标牌系统的用户认证与权限管理实现方案。针对三类用户角色(管理员、操作员、只读访客),作者采用简化RBAC模型,仅通过用户表的role字段管理权限。权限设计采用"模块:操作"格式(19个权限码),角色权限映射硬编码在Java中。系统使用JWT实现登录认证,将用户角色和权限列表嵌入Token。后端通过注解+AOP实现接口权限校验,前端根据权限动态控制UI元素。文章还提到默认账号初始化及精简的代码实现(仅4个核心文件),展现了独立开发者"够用就好"的务实设计理念。
2026-08-05 08:30:00
168
原创 建一个SpringBoot3项目骨架然后跑通第一个接口
本文介绍了如何搭建一个Spring Boot 3项目骨架,包括项目结构、关键依赖配置和第一个接口的实现。主要内容有: 标准项目结构设计,按模块划分controller、service等组件 关键依赖配置(MyBatis-Plus、Liquibase、JWT等) 分层配置文件管理,开发环境与生产环境分离 使用Liquibase进行数据库迁移管理 实现第一个健康检查接口验证项目运行 这是系列文章的第二篇,为后续开发奠定了基础,下篇将介绍JWT认证和权限系统的实现。
2026-08-04 08:30:00
188
原创 JWT过期用户还在操作我设计了一套刷新策略才解决
摘要: JWT过期机制常因忽视用户体验导致数据丢失问题。当用户长时间操作(如填写表单)时,Token过期直接跳转登录页会丢失未保存内容。解决方案采用双Token策略:短效Access Token(15分钟)搭配长效Refresh Token(7天),前端拦截401错误并静默刷新Token,用户无感知。同时引入刷新令牌轮转与黑名单机制,防止泄露风险。关键点:短效Token保安全,Refresh Token保体验,表单类页面建议额外增加自动保存功能。适用于C端或高交互场景,避免用户操作中断。(150字) 关键词
2026-08-03 08:30:00
203
原创 Nginx代理超时查了一天发现是upstream忘了配这3个参数
摘要: 本文分享了Nginx配置中常见的三个文件上传与代理问题及解决方案:1) client_max_body_size默认1MB限制导致413错误,需根据业务调整;2) 后端处理超时引发504,需配置proxy_read_timeout等超时参数;3) 大文件场景下缓冲策略选择,建议关闭proxy_buffering节省内存。作者通过实战案例总结出核心配置要点,并提供了文件服务的完整Nginx配置示例,强调合理设置请求体大小、超时时间和缓冲策略对性能优化的关键作用。(150字)
2026-08-02 11:31:55
215
原创 JDK装不上Maven配不对MySQL密码忘了搭个环境搞了一下午
这篇文章记录了搭建数字标牌CMS开发环境的过程。作者详细介绍了安装配置JDK 17(包括环境变量设置)、Maven(配置阿里云镜像加速)、MySQL 8.0(忘记密码的解决方案)以及Node.js + Vue CLI的完整步骤。文章总结了三个实用经验:1)Java/Maven必须手动配置环境变量;2)提前配置Maven镜像源;3)重要密码要记录备忘。最后预告下篇将开始构建Spring Boot 3项目骨架。作者以独立开发者视角,分享了全栈开发中环境搭建的实操经验。
2026-07-27 08:30:00
199
原创 怎么把管屏幕三个字拆成9张数据库表
文章摘要: 本文探讨了独立开发者如何拆解模糊需求,以“数字标牌管理系统”为例,将一句话需求分解为五层核心模块(设备管理、素材管理、节目编排、播放统计、用户权限),并转化为数据库表结构。作者提出两大原则:单一表职责、以查询场景驱动存储设计,最终形成9张表支撑系统功能。下篇将进入开发环境搭建环节。全文聚焦需求拆解方法论,适合开发者学习从抽象需求到具体落地的实践思路。 关键词: 需求拆解、数据库设计、独立开发、系统架构、模块化设计
2026-07-26 08:30:00
194
原创 Async和Transactional自调用不生效我查了一上午才发现是同一个坑
摘要: Spring的@Async、@Transactional等注解通过AOP代理实现,但自调用(方法内部调用同类带注解方法)会绕过代理,导致异步/事务失效。常见场景如this.sendNotification()中的this指向原始对象而非代理。解决方案: 注入自身代理(需@Lazy避免循环依赖); 拆分Service(推荐,职责分离); 通过ApplicationContext获取代理(不推荐)。 同类问题适用于@Transactional,核心原理是AOP代理机制限制。开发者需注意避免自调用,合理设
2026-07-25 08:30:00
144
原创 市面上已经有数字标牌系统了我凭什么再做一个
《为什么再造一个数字标牌CMS?轻量化开源方案的定位思考》 作者分析了三类现有方案:商业方案(功能冗余价格高)、开源方案(部署复杂)和小团队自研(封闭不共享),指出它们对中小商家不友好。基于此,作者提出自研Signage CMS的三大优势:1)极致轻量(单JAR包+9张表);2)全Java技术栈(Spring Boot/Vue3)便于自主迭代;3)MIT开源降低使用门槛。产品定位介于商业系统与重型开源方案之间,面向Java开发者、小商户等"用不起商业版也玩不转Docker"的群体。下文将展开需求拆解与架构设
2026-07-24 08:30:00
225
原创 缓存穿透把我数据库打挂了我加了个布隆过滤器扛住了
双十一期间,一个简单的主键查询SQL导致数据库CPU飙升至95%。排查发现是缓存穿透问题:大量不存在的数据请求绕过Redis直接压垮数据库。解决方案是引入布隆过滤器,通过哈希映射快速拦截无效请求,配合空值缓存机制防止误判。优化后接口响应时间从2.3秒降至12毫秒,数据库CPU降至15%。关键点包括:布隆过滤器高效拦截不存在key、空值缓存兜底、定期重建过滤器。该方案既提升性能又增强系统安全性,有效防御恶意遍历攻击。
2026-07-23 08:30:00
171
原创 猪八戒上有个数字标牌的项目我没接但我把它做出来了
无羡在公众号开启新系列《从零搭建完整项目》,首篇分享项目起源:7月初发现猪八戒网上有商家发布数字标牌CMS需求(预算6-12K/月),虽可接单但选择自主开发开源。他分析了外包局限(时间换金钱、无产品所有权)与独立开发优势(作品展示、吸引合作),用Spring Boot 3+Vue 3等技术三天完成Signage CMS(含设备/素材管理等模块),并开源上线。下期将详解需求拆解过程。无羡是独立开发者,专注AI与微服务,文末附个人技术资源链接。
2026-07-22 08:30:00
195
原创 我一个死锁排查了3小时最后发现是两条update的顺序问题
上线第三天,生产环境报警了。一个简单的审批接口,偶尔报。频率不高,一天两三次,但每次出现用户就操作失败,得重试。我查了 3 个小时,最后发现原因简单得离谱——。
2026-07-21 20:01:26
206
原创 ThreadLocal没remove内存慢慢涨最后OOM了
ThreadLocal内存泄漏问题复盘:线上服务因未调用remove()导致OOM,堆内存中积压数十万User对象。ThreadLocal数据实际存储在Thread的ThreadLocalMap中,当线程池复用线程时,若未清理Entry会导致value强引用无法被GC回收。正确做法是在finally块中调用remove()。另外需注意线程池复用导致脏数据问题,以及InheritableThreadLocal在线程池场景失效的问题,推荐使用TransmittableThreadLocal。遵循三大原则:set
2026-07-20 08:30:00
391
原创 缓存同时过期数据库差点挂了
摘要:文章分析了一起因缓存雪崩导致的服务崩溃事故。凌晨批量导入数据时重建索引导致缓存清空,大量请求穿透到数据库,慢查询打满连接池。文章区分了缓存穿透(查询不存在数据)、缓存击穿(热点 key 过期)和缓存雪崩(大量 key 同时失效)三种场景,并给出解决方案:布隆过滤器+空值缓存防穿透,分布式锁+热点永不过期防击穿,随机过期时间+异步刷新防雪崩。最后强调缓存设计需考虑随机过期、互斥锁和空值缓存等防护措施。
2026-07-19 08:30:00
175
原创 Transactional没生效我查了3个小时才发现是自己调了自己
摘要:Spring事务失效的常见陷阱与解决方案。文章通过一个订单服务案例,揭示@Transactional因类内自调用绕过AOP代理导致事务不生效的问题,提出四种解决方案:注入自身代理、拆分服务类、使用AopContext及事务上移。同时指出其他失效场景:非public方法、异常被吞、非RuntimeException未配置回滚。排查事务问题时,建议检查代理拦截情况。作者为全栈工程师无羡,专注AI与微服务架构。(150字)
2026-07-18 08:30:00
388
原创 Map.of传了个null本地没事一部署就炸了
摘要: 开发者在 CommonAuthFilter 中通过 Map.of() 返回 401 JSON 响应时,线上环境出现白屏问题,本地测试正常。排查发现是 Map.of() 对 null 值的严格限制导致 NPE(data 字段传了 null)。根因在于本地未触发该分支,而线上首次调用暴露问题。解决方案包括改用 HashMap(允许 null)或省略 null 字段。其他不可变集合(如 List.of())也有类似限制。关键点:Map.of() 简洁但不容忍 null,生产环境需谨慎测试边界条件。 (字数
2026-07-17 08:30:00
152
原创 iframe嵌了个页面白屏排查3小时发现是忘了传token
Console 管理后台用 iframe 嵌了审计日志页面。上线后点开——白屏。F12 一看,iframe 里的请求全返回 403。URL 直接在新标签页打开,正常。嵌在 iframe 里就 403。
2026-07-16 08:30:00
230
审批引擎系统-SpringBoot3+React通用审批引擎
2026-07-15
定时任务回调中心-SpringBoot3+React通用Quartz调度系统
2026-07-15
在线考试系统-SpringBoot3+React全栈考试系统
2026-07-15
认证中心-SpringBoot3+Vue3独立认证中心
2026-07-14
前端+React+ECharts数据可视化+6页暗色仪表盘大屏源码
2026-07-14
人工智能+DeepSeek+代码审查+AI自动审查Java代码工具源码
2026-07-14
Spring Boot 3 + Vue 3 前后端分离个人博客系统(源码+数据库)
2026-07-14
【数据库优化】基于MySQL执行计划的SQL性能调优:从索引设计到生产环境实战优化策略
2026-07-14
Java后台+全栈开发+数字标牌CMS管理系统+源码
2026-07-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅