自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 【Easylive】单服务模块的问题

轮询上报心跳→ 维护用户状态→ 判断用户是否下线Redis Key 失效通知→ 更新在线观看人数既保证了系统的简洁性,又能达到实时统计在线人数的效果。// 视频播放在线人数相关 Key 的统一前缀// 视频总人数 Key,格式:video:play:online:count:{fileId}// 用户在线 Key 的前缀// 用户在线 Key,格式:video:play:online:user:{fileId}:{deviceId}+ "%s:%s";✅。

2025-09-17 10:23:47 550

原创 【Easypan】云盘项目板块的问题

上传过程中分片上传 → 更新 Redis 空间统计用户前端查询空间 → 直接读取 Redis,实时性高上传完成或超时清理Redis 中的统计信息同步到 MySQL保证数据库与磁盘存储最终一致系统优点避免高频率数据库写操作保证前端空间显示实时保证数据库最终一致性组件作用Redis分片上传状态缓存,实时统计用户已上传空间MySQL最终一致性存储,定时/批量更新用户空间Kafka 延时任务异步触发未完成上传分片的清理,保证磁盘空间不被长期占用换句话说,Kafka 延时任务。

2025-09-16 17:43:29 557

原创 【Easylive】微服务板块的问题

单体架构:模块都在一个应用里,共享数据库,事务简单。伪微服务:只是把 Controller 拆出去,本质还是单体,没有解决分布式问题。真正的微服务:独立服务、独立数据库、服务间调用,涉及分布式事务、注册发现、配置管理、容错限流等机制。SpringBoot:用来快速开发单个服务,让服务能跑起来。:用来治理多个服务,解决服务之间的通信、配置、负载、事务等问题。关系:SpringBoot 是基础,SpringCloud 是架构。真正的微服务系统,往往是。

2025-09-16 09:56:05 577

原创 AOP可以做耗时统计和限流

/ 时间窗口内的请求数// 时间窗口大小(秒)耗时统计:用@Around,前后记录时间,计算执行耗时。限流:用自定义注解 + AOP + Redis(或 Guava)来统计调用次数,超出限制就拒绝请求。

2025-09-14 20:40:10 226

原创 【Redis】Sentinel哨兵

Redis Sentinel(哨兵)是 Redis 官方提供的分布式系统监控与故障转移组件监控(Monitoring):持续监控主从节点是否在线;通知(Notification):当某个节点出现问题时,通过 API 通知系统管理员或其他服务;自动故障转移(Automatic Failover):当主节点宕机,自动从从节点中选举新的主节点;服务发现(Configuration Provider):客户端可以通过 Sentinel 获取当前主节点地址。能力是否支持主从自动同步✅ 主从复制实现。

2025-06-19 20:38:15 1376

原创 【Redis】主从复制

一个 Redis 实例(主节点 master)将自己的数据同步给一个或多个从节点(slave,也叫 replica)。数据冗余(防止主节点宕机造成数据丢失)读写分离(提高读性能)构建哨兵、高可用、集群的基础特性主从复制数据同步异步(默认)或部分半同步读写分离支持(主写从读)宕机容错需结合哨兵或手动切换可扩展性高(多从复制)构建高可用基础是(与 Sentinel、Cluster 结合)

2025-06-19 20:11:52 1301

原创 【Redis】RDB 与 AOF

Redis 持久化是指将内存中的数据保存到磁盘中,以便在 Redis 重启后可以恢复数据。维度RDBAOF数据完整性丢失最后一次快照后的数据丢失最多 1 秒数据(默认)文件大小小,压缩存储大写入性能更高稍低恢复速度快(直接载入)慢(逐条命令重放)适用场景冷备份、全量迁移实时数据要求高可读性二进制,不可读文本,可读RDB 更适合全量快照和快速恢复,AOF 更适合高可用和数据完整性。生产环境中建议两者结合使用,以最大限度保证数据的安全与效率。持久化方式启动恢复方式。

2025-06-19 16:48:26 974

原创 【Java并发】线程池

线程池(Thread Pool)是一种线程复用机制,通过事先创建好一定数量的线程来应对后续不断到来的任务,而不是每次来任务时都重新创建线程。线程可以重复使用,避免频繁创建销毁;控制并发线程数,防止系统资源被耗尽;支持任务排队和拒绝策略。Executor。线程池就像一个有调度能力的营业厅,通过“排队”、“扩招”、“拒绝”三重策略,在高并发中有序处理大量任务,实现资源的复用、限制、控制与保护。线程池刚创建时 → 无线程↓调用 execute() 提交任务↓。

2025-06-19 15:56:28 1128

原创 【Java并发】线程死锁

线程死锁,指的是两个或多个线程因争夺资源而互相等待,形成了一个无限循环,导致所有相关线程都无法继续执行的状态。死锁条件含义解决方式示例互斥条件资源不可共享使用读写锁、信号量请求与保持条件一边占有一边请求一次性申请全部资源不可剥夺条件不主动释放资源失败时释放已有资源循环等待条件构成资源环等待链统一加锁顺序,破坏循环死锁发生必须满足互斥、请求与保持、不可剥夺、循环等待四个条件。我们可以通过统一加锁顺序、一次性获取所有资源、使用 tryLock() 限时获取锁。

2025-06-19 10:04:38 1366

原创 【Java并发】CAS

CASCompare And Swap(比较并交换)。它是一种原子性指令,通常由 CPU 提供,用于实现无锁线程安全。// 假设 v 是内存值,a 是旧预期值,b 是准备更新的新值v = b;} else {解释v:当前内存值a:期望值b:新值当v == a时,说明未被其他线程改动,CAS 将 v 替换为 b。否则,说明有线程修改了 v,CAS 更新失败。Java 中最常用的 CAS 实现方式是Unsafe特性CAS 原子操作synchronized 锁机制是否加锁。

2025-06-18 16:38:45 972

原创 【Java并发】AQS & ReentrantLock

你可以通过继承 AQS 来实现自己的锁或同步器。@Override// 如果 state 是 0,尝试加锁@Override// 解锁acquire(1);// AQS 提供的方法release(1);// AQS 提供的方法通过封装方法,结合状态管理和队列唤醒机制,就能轻松实现一个锁。AQS 是构建同步器的强大工具,隐藏了复杂的线程等待队列、阻塞唤醒机制,让我们只需关注“如何判断资源是否可用优点说明提供原子操作接口CAS + volatile 保障并发安全支持独占与共享模式。

2025-06-18 10:35:55 1190

原创 【Java并发】synchronized 优化与锁升级机制

锁类型适用场景是否阻塞开销偏向锁无竞争的单线程否最低轻量级锁有轻度竞争的多线程否(自旋)中等重量级锁激烈竞争是较高特性Mark Word 的作用锁标志位识别当前锁状态(无锁、偏向、轻量级、重量级)偏向锁储存线程 ID 和时间戳哈希码用于 hashCode 运算GC 信息储存年龄和标记位等,用于分代 GC。

2025-06-18 10:14:47 995

原创 【Java并发】synchronized 锁住的到底是什么?

用法锁的对象锁粒度实例方法this单实例锁静态方法当前类的 Class 对象全类锁代码块 synchronized(x)x 指向的对象自定义锁粒度是 Java 中最经典的并发控制方式,理解其锁的本质非常重要。✅ 它锁的不是代码,而是某个对象的 monitor。✅ 谁被锁住,线程就得排队获取它的 monitor。✅ 写并发代码时,要明确锁的粒度、对象以及作用范围。Monitor(监视器)是 JVM 层面提供的一种对象级的同步机制,用于实现 Java 中的。

2025-06-18 09:50:31 1068

原创 【Java并发】ThreadLocal

是 Java 提供的一种线程本地变量工具,它为每个线程都提供一个独立的变量副本,线程之间互不干扰,互不共享。每个线程都有一个我们通过设置的值,实际上是设置到了当前线程的 map 中所以不同线程访问相同的实例时,得到的值是独立的提供了一种线程安全的共享变量方案;它最适合用于跨层传递与当前线程相关的上下文数据;在使用中一定要注意生命周期和及时清理,避免内存泄漏;利用每个线程私有的实现线程隔离;本身不存储数据,仅作为键,数据存储在的 Entry 数组中;使用时务必remove()清理,避免泄漏。

2025-06-17 20:23:30 765

原创 【Java并发】volatile 与 synchronized 关键字

volatile适合用于保证可见性但不涉及复合操作的场景;适合用于需要原子性和互斥访问的逻辑块;二者在某些场景可以配合使用,例如在**双检锁模式(DCL)**中,volatile保证有序性与可见性,保证创建过程的原子性。特性volatile可见性✅ 保证✅ 保证原子性❌ 不保证✅ 保证是否加锁❌ 无锁✅ 加锁(互斥)性能高(但功能弱)低(但功能全)死锁风险无有可能(使用不当)因此我在实际项目中会根据场景选用,比如只需要保证状态变量可见性时用volatile。

2025-06-17 19:26:21 1346

原创 【Java集合】new HashMap<>(17) 背后到底发生了什么?

你写的代码Java 的真实行为设置阈值为 ≥17 的最小 2 的幂:32首次put()初始化数组,长度为 32threshold真正扩容点超过 24 个键值对时,触发扩容为 64≠ 分配一个大小为 17 的数组✅ 它会自动向上调整为32,以便配合位运算做高效定位。计算懒初始化:第一次put()才真正创建数组,长度为 32扩容阈值:默认负载因子为 0.75,因此扩容门槛为。

2025-06-17 15:59:07 1115

原创 【Java集合】从底层理解 HashMap:为什么要用扰动函数?为什么容量总是 2 的幂?

项目说明为什么加扰动使高位信息参与低位计算,减少冲突结果更均匀地分布 key 到桶中,提升查询/插入效率项目说明2 的幂好处高效等价于hash % n非 2 的幂问题位掩码无法覆盖全部桶,造成 hash 冲突Java 策略自动将初始容量调整为最近的 2 的幂问题技术优点hashCode 太集中过于相似扰动函数混淆高位信息,提升随机性哈希表扩容或初始化数组长度为 2 的幂位运算替代取模,性能更优。

2025-06-17 15:46:35 969

原创 【Java集合】HashMap存储结构

组件含义说明底层数组结构,存放的是链表或红黑树的头节点Node键值对实体,包含 key、value、hash、next链表结构解决哈希冲突的主要方式红黑树结构链表过长时优化为树,提高查找效率。

2025-06-17 15:19:48 871

原创 【Java基础】抽象类 vs 接口

抽象类是"is-a"关系,强调继承和模板;接口是"can-do"关系,强调行为规范和多态。二者共同构成Java面向对象设计的基础,需根据场景灵活选择。

2025-06-09 11:26:57 418

原创 【Java基础】​​向上转型(Upcasting)和向下转型(Downcasting)

将子类对象赋值给父类引用(自动完成,无需强制转换)。将父类引用强制转回子类引用(需手动转换,且可能抛出异常)。向上转型:子类对象 → 父类引用(自动,用于多态)。向下转型:父类引用 → 子类引用(手动,需用instanceof检查)。记住向上转型是“放宽视野”(把狗当成动物)。向下转型是“缩小范围”(把动物还原成狗)。

2025-06-09 10:56:39 557

原创 【Java基础】继承 vs 多态

🔹 “像什么,做什么”(看起来是Animal,实际是Dog,叫起来就是狗叫)。比如统一管理动物,但实际调用时各叫各的,不用写一堆。• 多态:“表面是动物,实际是狗,叫起来就是狗叫” 🐕‍🦺 → 解决灵活调用。• 继承:“你爸有的你也有,还能自己加” 👨👦 → 解决代码复用。💡 继承的作用:少写重复代码!✅ 运行时根据实际对象类型调用方法(动态绑定)。🔹 编译时确定(代码结构在写代码时就固定了)。🔹 运行时决定(代码执行时才确定调用的方法)。✅ 修改:重写父类方法(Override)。

2025-06-09 10:35:33 975

原创 【EasyPan】回收站清理定时任务代码分析

【代码】【EasyPan】回收站清理定时任务代码分析。

2025-05-07 22:27:07 493

原创 【EasyPan】saveShare代码分析

【代码】【EasyPan】saveShare代码分析。

2025-05-07 22:18:52 654

原创 【EasyPan】loadDataList方法及checkRootFilePid方法解析

【代码】【EasyPan】loadDataList方法及checkRootFilePid方法解析。

2025-05-07 21:10:36 525

原创 【EasyPan】recoverFileBatch回收站文件批量还原方法解析

调用recoverFileBatch(userId, fileIds)批量更新选中文件状态(RECYCLE→USING)批量更新子文件状态(DEL→USING)查询根目录文件(为后续的重命名做准备)查询回收站文件(query)返回fileInfoList。递归查询子内容(DEL状态)返回rootFileList。解析fileIds为数组。

2025-04-23 21:24:11 989

原创 【EasyPan】removeFile2RecycleBatch方法及递归操作解析

调用removeFile2RecycleBatch(userId, fileIds)递归查找子文件夹(findAllSubFolderFileList)批量更新选中文件状态(updateFileDelFlagBatch)批量更新子文件状态(updateFileDelFlagBatch)批量更新(F11,F12,F121)→DEL。批量更新(F1,F2)→RECYCLE。查询F1子文件夹(F11,F12)查询有效文件列表(query)查询F12子文件夹(F121)文件F1-1-2-1。

2025-04-23 20:44:46 798

原创 【EasyPan】MySQL FIELD() 函数实现自定义排序

相比Java内存排序,数据库层排序减少数据传输量。bQFKAj16Ig0 → 位置2。• 最终只保留两个有效ID进行处理。yACII63FDS → 位置1。在SQL执行时会被优化器自动去重。确保返回结果顺序与路径参数。这类路径,保证父级目录在前。参数列表顺序决定排序优先级。实际处理时只保留唯一值。

2025-04-23 15:58:56 1032

原创 【EasyPan】文件上传、文件秒传、文件转码、文件合并、异步转码、视频切割分析

出现任何异常时,引用记录创建和空间更新操作同时回滚。:确保只有初始状态为TRANSFER的记录能被更新。:避免每个分片都进行数据库查询,减少系统压力。:确保只有处于"转码中"状态的文件才会被处理。:按月份分目录存储,避免单目录文件过多。:缩略图生成失败时直接复制原文件。触发afterCommit回调。:防止重复处理或无效操作。:前置检查避免无效操作。

2025-04-22 21:41:59 1265

原创 【EasyPan】AOP实现参数校验与登录校验

/ 全局拦截器注解// 登录校验开关// 参数校验开关// 管理员校验// 参数校验规则注解// 最小长度// 最大长度// 必填校验// 正则规则。

2025-04-22 10:28:40 862

原创 【EasyPan】发送邮箱验证码sendEmailCode

输入邮箱+图形验证码。

2025-04-22 09:10:38 1178

原创 【EasyPan】获取图片验证码

【代码】【EasyPan】获取图片验证码。

2025-04-22 08:54:57 962

原创 【EasyPan】MySQL主键与索引核心作用解析

🔍 用EXPLAIN命令查看,就像检查快递员是否真的用了最优路线。👉 把最常用的查询条件放前面,就像"先查省→再查市"的快递地址。👉 朋友圈按"发布时间"排序(给created_at加索引)👉 比如电商平台按"商品名称"搜索(给name字段加索引)👉 用户注册防重复手机号(给phone加唯一索引)👎 像"文章阅读数"这种每分钟都更新的字段。👎 像"用户血型"这种几乎不用的字段。

2025-04-21 21:27:49 775

原创 【EasyPan】application.properties配置文件解析

【代码】【EasyPan】application.properties配置文件解析。

2025-04-21 20:59:39 352

原创 【EasyPan】项目常见问题解答(自用&持续更新中…)

EasyPan 是一个基于的全功能网盘系统,支持文件存储、在线预览、分享协作及后台管理,技术栈涵盖主流前后端框架及中间件(MySQL、Redis、FFmpeg),适用于个人或企业文件管理场景。

2025-04-21 20:41:49 676 1

原创 【Easylive】手动实现分布式事务解决方案流程解析

该方案在电商、物流等互联网业务中广泛应用,是平衡实现复杂度与可靠性的典型折中方案。用这种模式可以处理:订单→库存、支付→通知等大多数最终一致性场景。注:所有方案都需要配合幂等控制、重试机制和日志追踪才能保证可靠性。🍜 就像优秀的外卖系统:订单可能稍有延迟,但绝不会丢失或重复!👨‍🍳 相当于厨师长看到相同订单号会说:“这份已经在炒了!💡 就像收银机:按一次按钮同时打印顾客账单和厨房小票。依赖定时任务扫描,消息处理延迟通常在秒级。需额外维护消息表、定时任务等组件。要求业务消息必须可序列化存储。

2025-04-21 19:13:26 784

原创 【Easylive】使用Seata解决分布式事务问题

方法就像有了一个全自动保险,无论评论数据保存和计数更新相隔多远,都能保证要么全部成功,要么全部回滚。使用@GlobalTransactional注解。1. 开启全局事务(XID=123)8. 用undo_log恢复数据。2. 执行SQL并注册分支事务。4. 调用远程服务并注册分支。3. 报告准备状态(就绪)5. 报告准备状态(就绪)8. 删除undo_log。

2025-04-21 17:31:11 1097

原创 【Easylive】AdminFilter 详细解析

是网关层的 统一权限守卫,通过 路径判断 和 多方式 Token 提取,确保只有合法请求能访问后端服务。是一个 Spring Cloud Gateway 的过滤器,用于在请求到达微服务之前进行 权限校验(如管理员 Token 验证)。• 适用场景:文件上传/下载可能通过浏览器发起,而浏览器通常将 Token 放在 Cookie 而非 Header。:特殊路径,文件相关接口从 Cookie 中提取 Token(而非 Header)。的请求无需 Token(如登录、注册接口)。• 逻辑:如果请求路径包含。

2025-04-21 16:44:07 845

原创 【Easylive】为什么需要手动转换 feign.Response 到 HttpServletResponse

是 Spring Web 或 Servlet 容器提供的 HTTP 响应对象,用于向客户端(如浏览器)返回数据。• Feign 的设计初衷是简化 REST API 调用,默认支持 JSON/XML 等结构化数据的自动反序列化(如。使用流式复制(如示例代码)避免内存溢出,同时保留灵活性(如限速、校验)。• 低内存占用:分块读写(如 1KB 缓冲区),适合大文件。• 但对于二进制流(如文件),Feign 不会自动将。• 内存消耗大:文件较大时(如 1GB),会撑爆内存。对象(如 JSON),而不是文件内容。

2025-04-21 15:39:27 617

原创 【Easylive】consumes = MediaType.MULTIPART_FORM_DATA_VALUE 与 @RequestPart

一致,否则会报 415 Unsupported Media Type 错误。• 作用:告诉 Feign 和 HTTP 客户端,这个接口 接收的是。) 或 非简单类型数据(如 JSON 字符串)。格式传输,不能直接用 JSON 或普通表单。• 不加这个参数,服务端可能无法正确解析文件。• 调用时,Feign 会自动将文件转换成。• 调用时,Feign 会把它变成。格式的数据(通常用于文件上传)。形式拼接到 URL 或表单中。• 用于接收 普通参数(如。• 用于接收 文件(

2025-04-21 15:21:01 607

原创 小白也能看懂【微服务】

setResource("queryOrder") // 保护谁?.setGrade(RuleConstant.FLOW_GRADE_QPS) // 按什么限?.setCount(100) // 阈值是多少?// 怎么限?

2025-04-10 11:27:37 1597 1

空空如也

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

TA关注的人

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