- 博客(68)
- 收藏
- 关注
原创 【Redis】Sentinel哨兵
Redis Sentinel(哨兵)是 Redis 官方提供的分布式系统监控与故障转移组件监控(Monitoring):持续监控主从节点是否在线;通知(Notification):当某个节点出现问题时,通过 API 通知系统管理员或其他服务;自动故障转移(Automatic Failover):当主节点宕机,自动从从节点中选举新的主节点;服务发现(Configuration Provider):客户端可以通过 Sentinel 获取当前主节点地址。能力是否支持主从自动同步✅ 主从复制实现。
2025-06-19 20:38:15
1204
原创 【Redis】主从复制
一个 Redis 实例(主节点 master)将自己的数据同步给一个或多个从节点(slave,也叫 replica)。数据冗余(防止主节点宕机造成数据丢失)读写分离(提高读性能)构建哨兵、高可用、集群的基础特性主从复制数据同步异步(默认)或部分半同步读写分离支持(主写从读)宕机容错需结合哨兵或手动切换可扩展性高(多从复制)构建高可用基础是(与 Sentinel、Cluster 结合)
2025-06-19 20:11:52
1192
原创 【Redis】RDB 与 AOF
Redis 持久化是指将内存中的数据保存到磁盘中,以便在 Redis 重启后可以恢复数据。维度RDBAOF数据完整性丢失最后一次快照后的数据丢失最多 1 秒数据(默认)文件大小小,压缩存储大写入性能更高稍低恢复速度快(直接载入)慢(逐条命令重放)适用场景冷备份、全量迁移实时数据要求高可读性二进制,不可读文本,可读RDB 更适合全量快照和快速恢复,AOF 更适合高可用和数据完整性。生产环境中建议两者结合使用,以最大限度保证数据的安全与效率。持久化方式启动恢复方式。
2025-06-19 16:48:26
810
原创 【Java并发】线程池
线程池(Thread Pool)是一种线程复用机制,通过事先创建好一定数量的线程来应对后续不断到来的任务,而不是每次来任务时都重新创建线程。线程可以重复使用,避免频繁创建销毁;控制并发线程数,防止系统资源被耗尽;支持任务排队和拒绝策略。Executor。线程池就像一个有调度能力的营业厅,通过“排队”、“扩招”、“拒绝”三重策略,在高并发中有序处理大量任务,实现资源的复用、限制、控制与保护。线程池刚创建时 → 无线程↓调用 execute() 提交任务↓。
2025-06-19 15:56:28
1077
原创 【Java并发】线程死锁
线程死锁,指的是两个或多个线程因争夺资源而互相等待,形成了一个无限循环,导致所有相关线程都无法继续执行的状态。死锁条件含义解决方式示例互斥条件资源不可共享使用读写锁、信号量请求与保持条件一边占有一边请求一次性申请全部资源不可剥夺条件不主动释放资源失败时释放已有资源循环等待条件构成资源环等待链统一加锁顺序,破坏循环死锁发生必须满足互斥、请求与保持、不可剥夺、循环等待四个条件。我们可以通过统一加锁顺序、一次性获取所有资源、使用 tryLock() 限时获取锁。
2025-06-19 10:04:38
1010
原创 【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
830
原创 【Java并发】AQS & ReentrantLock
你可以通过继承 AQS 来实现自己的锁或同步器。@Override// 如果 state 是 0,尝试加锁@Override// 解锁acquire(1);// AQS 提供的方法release(1);// AQS 提供的方法通过封装方法,结合状态管理和队列唤醒机制,就能轻松实现一个锁。AQS 是构建同步器的强大工具,隐藏了复杂的线程等待队列、阻塞唤醒机制,让我们只需关注“如何判断资源是否可用优点说明提供原子操作接口CAS + volatile 保障并发安全支持独占与共享模式。
2025-06-18 10:35:55
1097
原创 【Java并发】synchronized 优化与锁升级机制
锁类型适用场景是否阻塞开销偏向锁无竞争的单线程否最低轻量级锁有轻度竞争的多线程否(自旋)中等重量级锁激烈竞争是较高特性Mark Word 的作用锁标志位识别当前锁状态(无锁、偏向、轻量级、重量级)偏向锁储存线程 ID 和时间戳哈希码用于 hashCode 运算GC 信息储存年龄和标记位等,用于分代 GC。
2025-06-18 10:14:47
908
原创 【Java并发】synchronized 锁住的到底是什么?
用法锁的对象锁粒度实例方法this单实例锁静态方法当前类的 Class 对象全类锁代码块 synchronized(x)x 指向的对象自定义锁粒度是 Java 中最经典的并发控制方式,理解其锁的本质非常重要。✅ 它锁的不是代码,而是某个对象的 monitor。✅ 谁被锁住,线程就得排队获取它的 monitor。✅ 写并发代码时,要明确锁的粒度、对象以及作用范围。Monitor(监视器)是 JVM 层面提供的一种对象级的同步机制,用于实现 Java 中的。
2025-06-18 09:50:31
953
原创 【Java并发】ThreadLocal
是 Java 提供的一种线程本地变量工具,它为每个线程都提供一个独立的变量副本,线程之间互不干扰,互不共享。每个线程都有一个我们通过设置的值,实际上是设置到了当前线程的 map 中所以不同线程访问相同的实例时,得到的值是独立的提供了一种线程安全的共享变量方案;它最适合用于跨层传递与当前线程相关的上下文数据;在使用中一定要注意生命周期和及时清理,避免内存泄漏;利用每个线程私有的实现线程隔离;本身不存储数据,仅作为键,数据存储在的 Entry 数组中;使用时务必remove()清理,避免泄漏。
2025-06-17 20:23:30
675
原创 【Java并发】volatile 与 synchronized 关键字
volatile适合用于保证可见性但不涉及复合操作的场景;适合用于需要原子性和互斥访问的逻辑块;二者在某些场景可以配合使用,例如在**双检锁模式(DCL)**中,volatile保证有序性与可见性,保证创建过程的原子性。特性volatile可见性✅ 保证✅ 保证原子性❌ 不保证✅ 保证是否加锁❌ 无锁✅ 加锁(互斥)性能高(但功能弱)低(但功能全)死锁风险无有可能(使用不当)因此我在实际项目中会根据场景选用,比如只需要保证状态变量可见性时用volatile。
2025-06-17 19:26:21
1217
原创 【Java集合】new HashMap<>(17) 背后到底发生了什么?
你写的代码Java 的真实行为设置阈值为 ≥17 的最小 2 的幂:32首次put()初始化数组,长度为 32threshold真正扩容点超过 24 个键值对时,触发扩容为 64≠ 分配一个大小为 17 的数组✅ 它会自动向上调整为32,以便配合位运算做高效定位。计算懒初始化:第一次put()才真正创建数组,长度为 32扩容阈值:默认负载因子为 0.75,因此扩容门槛为。
2025-06-17 15:59:07
1035
原创 【Java集合】从底层理解 HashMap:为什么要用扰动函数?为什么容量总是 2 的幂?
项目说明为什么加扰动使高位信息参与低位计算,减少冲突结果更均匀地分布 key 到桶中,提升查询/插入效率项目说明2 的幂好处高效等价于hash % n非 2 的幂问题位掩码无法覆盖全部桶,造成 hash 冲突Java 策略自动将初始容量调整为最近的 2 的幂问题技术优点hashCode 太集中过于相似扰动函数混淆高位信息,提升随机性哈希表扩容或初始化数组长度为 2 的幂位运算替代取模,性能更优。
2025-06-17 15:46:35
891
原创 【Java集合】HashMap存储结构
组件含义说明底层数组结构,存放的是链表或红黑树的头节点Node键值对实体,包含 key、value、hash、next链表结构解决哈希冲突的主要方式红黑树结构链表过长时优化为树,提高查找效率。
2025-06-17 15:19:48
775
原创 【Java基础】抽象类 vs 接口
抽象类是"is-a"关系,强调继承和模板;接口是"can-do"关系,强调行为规范和多态。二者共同构成Java面向对象设计的基础,需根据场景灵活选择。
2025-06-09 11:26:57
355
原创 【Java基础】向上转型(Upcasting)和向下转型(Downcasting)
将子类对象赋值给父类引用(自动完成,无需强制转换)。将父类引用强制转回子类引用(需手动转换,且可能抛出异常)。向上转型:子类对象 → 父类引用(自动,用于多态)。向下转型:父类引用 → 子类引用(手动,需用instanceof检查)。记住向上转型是“放宽视野”(把狗当成动物)。向下转型是“缩小范围”(把动物还原成狗)。
2025-06-09 10:56:39
439
原创 【Java基础】继承 vs 多态
🔹 “像什么,做什么”(看起来是Animal,实际是Dog,叫起来就是狗叫)。比如统一管理动物,但实际调用时各叫各的,不用写一堆。• 多态:“表面是动物,实际是狗,叫起来就是狗叫” 🐕🦺 → 解决灵活调用。• 继承:“你爸有的你也有,还能自己加” 👨👦 → 解决代码复用。💡 继承的作用:少写重复代码!✅ 运行时根据实际对象类型调用方法(动态绑定)。🔹 编译时确定(代码结构在写代码时就固定了)。🔹 运行时决定(代码执行时才确定调用的方法)。✅ 修改:重写父类方法(Override)。
2025-06-09 10:35:33
913
原创 【EasyPan】loadDataList方法及checkRootFilePid方法解析
【代码】【EasyPan】loadDataList方法及checkRootFilePid方法解析。
2025-05-07 21:10:36
486
原创 【EasyPan】recoverFileBatch回收站文件批量还原方法解析
调用recoverFileBatch(userId, fileIds)批量更新选中文件状态(RECYCLE→USING)批量更新子文件状态(DEL→USING)查询根目录文件(为后续的重命名做准备)查询回收站文件(query)返回fileInfoList。递归查询子内容(DEL状态)返回rootFileList。解析fileIds为数组。
2025-04-23 21:24:11
911
原创 【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
750
原创 【EasyPan】MySQL FIELD() 函数实现自定义排序
相比Java内存排序,数据库层排序减少数据传输量。bQFKAj16Ig0 → 位置2。• 最终只保留两个有效ID进行处理。yACII63FDS → 位置1。在SQL执行时会被优化器自动去重。确保返回结果顺序与路径参数。这类路径,保证父级目录在前。参数列表顺序决定排序优先级。实际处理时只保留唯一值。
2025-04-23 15:58:56
966
原创 【EasyPan】文件上传、文件秒传、文件转码、文件合并、异步转码、视频切割分析
出现任何异常时,引用记录创建和空间更新操作同时回滚。:确保只有初始状态为TRANSFER的记录能被更新。:避免每个分片都进行数据库查询,减少系统压力。:确保只有处于"转码中"状态的文件才会被处理。:按月份分目录存储,避免单目录文件过多。:缩略图生成失败时直接复制原文件。触发afterCommit回调。:防止重复处理或无效操作。:前置检查避免无效操作。
2025-04-22 21:41:59
1158
原创 【EasyPan】AOP实现参数校验与登录校验
/ 全局拦截器注解// 登录校验开关// 参数校验开关// 管理员校验// 参数校验规则注解// 最小长度// 最大长度// 必填校验// 正则规则。
2025-04-22 10:28:40
774
原创 【EasyPan】MySQL主键与索引核心作用解析
🔍 用EXPLAIN命令查看,就像检查快递员是否真的用了最优路线。👉 把最常用的查询条件放前面,就像"先查省→再查市"的快递地址。👉 朋友圈按"发布时间"排序(给created_at加索引)👉 比如电商平台按"商品名称"搜索(给name字段加索引)👉 用户注册防重复手机号(给phone加唯一索引)👎 像"文章阅读数"这种每分钟都更新的字段。👎 像"用户血型"这种几乎不用的字段。
2025-04-21 21:27:49
716
原创 【EasyPan】application.properties配置文件解析
【代码】【EasyPan】application.properties配置文件解析。
2025-04-21 20:59:39
300
原创 小白也能看懂【微服务】
setResource("queryOrder") // 保护谁?.setGrade(RuleConstant.FLOW_GRADE_QPS) // 按什么限?.setCount(100) // 阈值是多少?// 怎么限?
2025-04-10 11:27:37
1385
1
原创 LINE大规模信息网络嵌入论文中的一些问题
我们定义节点iii的邻居分布(即上下文)为条件分布p2vj∣vip2vj∣vip2vj∣viexpuj′⊤⋅ui∑k1∣V∣expuk′⊤⋅uip2vj∣vi∑k1∣V∣expuk′⊤⋅uiexpuj′⊤⋅uiuiui是节点iii的嵌入向量,uj′uj′是节点jjj。
2024-12-11 20:17:58
527
原创 移动应用开发项目——图书影片管理系统【安卓项目|前后端】
通过本平台,用户可以将自己的感受转化为评论与他人分享,这种基于差异化的评论为其他用户提供了新的知识扩展线索,激发更多的发散性思维。与传统的网上书店推荐书籍的方式不同,本项目强调评论和人际关系的作用,这不仅能更好地满足用户探索新知识的需求,还能在知识学习上取得更加显著的效果。对于被动型用户(即仅浏览内容、不主动创作的用户)而言,平台同样提供了价值,他们可以通过浏览其他用户的评论和推荐,发现符合自己兴趣的书籍或电影。影视表、管理员表、书评表、影评表、电影图片表、演职员表、演职员参演表、推荐评论表、管理员表…
2024-11-08 11:21:05
1040
原创 SpringBoot项目中如何在AOP中拿到Session信息
在 Spring Boot 项目的 AOP 中可以通过来获取当前请求的信息。提供了访问当前请求上下文的能力,这样我们可以在 AOP 切面中获取。
2024-11-05 11:09:43
941
原创 AOP实现参数校验的一些问题【代码贴在最后】
是一个灵活且强大的工具,它简化了请求处理中的登录验证和参数校验逻辑,提高了代码的可维护性与一致性,同时也降低了重复代码的数量。通过 AOP 和自定义注解的结合,开发者可以更高效地管理和扩展这些功能。VerifyParam的作用是一个自定义注解,用于在 Spring Boot 应用中对方法参数进行验证。它的主要作用是提供一种灵活的方式来定义参数验证规则。以下是是一个强大且灵活的参数验证工具,通过结合 AOP 提供的机制,可以有效地管理方法参数的合法性,减少了手动验证的代码量,提高了代码的整洁性和可维护性。
2024-11-02 20:03:27
908
原创 SpringBoot项目中枚举类的作用
在 Spring Boot 项目中,枚举类不仅可以帮助开发人员以更清晰和安全的方式管理常量,还能提高代码的可读性和维护性,减少错误,并与其他框架(如 Spring 和 Jackson)无缝集成。使用枚举类是良好的编程实践之一。
2024-11-02 19:32:48
742
原创 Vue3父子组件中关于ref和emit的一些问题
在父组件中使用 ref=“UpdateAvatarRef”,它的作用是通过 ref 获取子组件 UpdateAvatar 的实例,从而可以在父组件中直接调用子组件的属性或方法。2.emit(“update:modelValue”, file) 的作用: 当 emit(“update:modelValue”, file) 在子组件中被调用时,它会触发 update:modelValue 事件,并将 file 作为参数传递给父组件。在 Vue 组件中,emit 用来向父组件发送事件通知。
2024-10-23 10:26:27
480
1
原创 如何用JAVA中的BigInteger实现进制转换
然后使用BigInteger的构造函数将二进制字符串转换为BigInteger对象。接着,我们可以使用toString()方法将BigInteger对象转换为十进制字符串,或者使用toString(int radix)方法将其转换为指定进制的字符串,例如16进制。:首先,你需要创建一个BigInteger对象,表示你要转换的数字。:一旦你有了BigInteger对象,你可以使用其提供的方法将其转换为其他进制的字符串表示。这将创建一个BigInteger对象,表示十进制数12345。
2024-04-10 20:26:54
602
空空如也
影院排片系统如何让排片时间不发生冲突
2023-03-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人