- 博客(93)
- 收藏
- 关注
原创 Java 的 volatile 是如何保证内存可见性的
摘要: volatile 关键字通过强制读写主内存(而非线程本地缓存)、插入内存屏障防止指令重排序,以及遵循 JMM 的 happens-before 规则,确保多线程环境下的变量可见性。例如,当线程 A 修改 volatile 变量时,线程 B 能立即读取最新值。但需注意,volatile 仅解决可见性问题,不保证原子性(如 i++ 仍需同步机制)。其底层依赖 JVM、CPU 缓存一致性协议和内存屏障协同实现。
2025-09-04 18:22:11
556
原创 FFmpeg + Spring Boot + ZLMediaKit 实现本地视频推流
本文介绍了基于ZLMediaKit和Spring Boot的RTMP推流系统实现方案。首先详细说明了ZLMediaKit的Docker安装配置步骤,包括端口映射和配置文件设置,以及FFmpeg的安装方法。然后重点讲解了Spring Boot后端的实现过程,包括推流配置类、服务类的设计,其中服务类通过Apache Commons Exec管理FFmpeg进程,实现了视频文件的RTMP推流功能,并提供了启动、停止等操作。该系统可以实现视频文件的RTMP推流,并支持多路推流管理。
2025-08-12 18:25:55
1263
原创 若依权限管理实现方式
本文介绍了基于RBAC的权限管理系统设计,采用Spring Security框架实现认证授权,使用JWT令牌进行身份验证。系统包含用户、角色、菜单等核心实体,通过关联表实现多对多关系。权限控制采用注解式方式,支持权限表达式和数据权限分级管理。权限加载流程包括角色权限和菜单权限获取,管理员拥有全部权限。系统实现了前后端统一的权限控制,权限标识采用"模块:业务:操作"三级结构,角色标识使用简单字符串,具有灵活性和安全性。
2025-06-27 13:57:35
575
原创 git .gitignore 文件不起作用
Git忽略文件失效的常见原因是文件已被Git跟踪。解决方法是通过清理缓存让Git重新应用.gitignore规则:使用git rm -r --cached *删除所有文件的缓存,或git rm --cached file/path删除指定文件缓存,然后提交更改。这将使Git重新评估需要跟踪的文件。
2025-06-27 13:56:08
487
原创 Vue 的组件生命周期
Vue 3组合式API提供了一系列生命周期钩子函数,包括onBeforeMount、onMounted、onBeforeUpdate、onUpdated、onBeforeUnmount、onUnmounted等,需通过import导入使用。这些钩子对应选项式API的生命周期,执行顺序保持一致,可用于DOM操作、事件监听、资源清理等场景。组合式API的钩子使代码更模块化,便于管理组件状态和行为。示例展示了各钩子的典型用法,如onMounted发起请求、onUnmounted清除定时器等。调试钩子onRende
2025-06-27 13:51:21
302
原创 Vue 的组件通信
Vue组件通信方式总结: Vue提供了多种组件通信方法: 父子组件 父传子:使用props传递数据 子传父:通过$emit触发事件 兄弟组件 通过父组件中转数据 使用Vuex/Pinia全局状态管理 跨级组件 使用provide/inject 全局状态管理 其他方式 v-model实现双向绑定 自定义v-model 不同场景选择合适的方式: 简单父子通信用props/emit 复杂应用建议使用Pinia/Vuex 跨多层级组件推荐provide/inject
2025-06-27 13:50:18
258
原创 Vue 的路由
Vue 3通过Vue Router实现单页应用路由管理。安装需使用npm install vue-router@4。路由配置包括基本路由、动态路由、嵌套路由和路由守卫(全局/独享/组件级)。核心用法是在根组件挂载路由实例,通过<router-link>导航和<router-view>渲染组件。支持编程式导航、参数传递(params/query)和滚动行为控制。其他功能包括404页面处理和路由懒加载优化性能。Vue Router提供了完整的路由解决方案,适用于构建复杂SPA应用。
2025-06-27 13:49:42
308
原创 Pinia 状态管理
Pinia是Vue 3新一代状态管理库,具有简洁API、组合式风格和TypeScript支持等特点。它采用模块化设计,去除了Vuex的mutations,简化了状态管理流程。基本使用包括安装Pinia、创建Store(包含state、getters和actions)及在组件中调用。此外还支持插件扩展、映射辅助函数及SSR功能。相比Vuex,Pinia更契合Vue 3的Composition API,提供更灵活高效的状态管理方案。
2025-06-27 13:48:25
437
原创 Axios 详解
Axios是基于Promise的HTTP客户端,支持浏览器和Node.js环境,提供简洁API处理网络请求。主要特点包括:Promise支持、跨平台兼容、请求/响应拦截、JSON自动转换、请求取消和进度监控等。通过创建实例可自定义配置,拦截器功能强大,能统一处理认证和错误。提供GET、POST等常见HTTP方法,支持AbortController取消请求。安装简单,使用方便,是前端开发中处理API请求的高效工具。
2025-06-27 13:47:48
540
原创 Vue 的数据响应式
Vue 3通过Proxy API重构了响应式系统,比Vue 2更高效。核心改进包括:基于Proxy监听对象/数组变化、惰性响应追踪、自动检测属性增减。主要API有reactive(响应式对象)、ref(基本类型值)、computed(计算属性)和watch/watchEffect(监听变化)。系统通过代理对象、依赖追踪和更新触发机制实现响应。相比Vue 2,Vue 3能原生检测数组/对象变化,无需特殊处理,性能更优,内存占用更少,使数据管理更直观高效。
2025-06-27 13:47:06
442
原创 Spring Cloud 和 Spring Cloud Alibaba 区别
Spring Cloud和Spring Cloud Alibaba提供了完整的微服务解决方案。文章对比了两者的核心组件:注册中心(Eureka vs Nacos)、配置中心(Config vs Nacos)、服务调用(Ribbon/Feign)、网关(Zuul vs Gateway)、熔断降级(Hystrix vs Sentinel)以及分布式事务(Seata)。重点介绍了Nacos、Feign、Gateway、Sentinel和Seata的特性与优势,包括Nacos支持AP/CP模式、Feign的声明式调
2025-06-27 13:45:35
696
原创 Java 8 Stream详解
Java 8 Stream流是处理集合数据的函数式API,具有延迟执行、不修改源数据等特点。文章详细介绍了Stream的创建方式(集合、数组、静态方法),分为中间操作(筛选、映射、排序)和终端操作(匹配、归约、收集)。还讲解了数值流和并行流的使用,并提供了实际应用示例。Stream流通过链式操作简化了集合处理,提高了代码可读性和效率,是Java 8的重要特性。
2025-06-27 13:44:20
174
原创 Docker 中 MySQL 认证方式问题
MySQL 8.0与5.7版本认证方式不同,在使用连接工具时需注意兼容性问题。可通过SQL命令将root用户的认证方式改为传统的mysql_native_password,并设置新密码(示例为"123456")。修改后需执行FLUSH PRIVILEGES刷新权限,最后可通过查询mysql.user表验证修改结果。这种方法确保工具能够正常连接新版MySQL服务器。 (注:示例密码"123456"仅为演示,实际使用应设置强密码)
2025-06-27 13:43:17
135
原创 Spring Boot上传文件到阿里云OSS的完整流程
本文详细介绍了Spring Boot项目中实现文件上传至阿里云OSS的全流程。首先需在阿里云开通OSS服务并配置存储桶;其次在项目中添加OSS SDK依赖和配置文件;然后创建OSS工具类封装上传/删除方法,其中包含文件命名、路径生成等逻辑;接着通过Service层整合业务逻辑;最后提供RESTful API接口。整个方案实现了文件管理功能,包括自动生成唯一文件名、按日期分类存储等特性,代码结构清晰,可直接用于实际项目开发。
2025-06-27 13:41:37
419
原创 Redis 的持久化
Redis提供三种持久化机制:RDB持久化通过快照保存数据,有save(主线程)和bgsave(子线程)两种方式;AOF持久化记录写命令,支持三种同步策略,会触发重写压缩文件;混合持久化结合二者优势,在AOF重写时首先生成RDB快照再追加新命令。Redis 7.0改进了AOF重写机制,采用基础AOF+增量文件方式,减轻主线程压力并避免重复写入,通过清单文件统一管理。
2025-05-27 22:06:44
172
原创 Redis 的哨兵机制
Redis哨兵(Sentinel)是Redis的高可用解决方案,负责监控主从集群状态并在主节点故障时自动触发故障转移。哨兵系统由多个哨兵实例组成,具备监控、自动故障转移、配置提供和通知功能。工作原理包括监控阶段(PING检测)、主观/客观下线判定、领导者选举(基于Raft变种算法)和执行故障转移(选择新主节点并重配置从节点)。建议部署至少3个哨兵实例,并合理设置检测参数。哨兵虽能提升系统可用性,但也存在复杂度增加、潜在数据丢失和脑裂风险等缺点,需权衡使用。
2025-05-27 22:06:06
623
原创 Redis 的事务
Redis事务通过MULTI、EXEC、DISCARD、WATCH和UNWATCH等命令实现原子性操作,支持将多个命令打包执行而不被中断。虽然不提供传统数据库的回滚功能,但通过WATCH可构建乐观锁机制。事务保证命令执行的隔离性和顺序性,适用于需要批量操作或并发控制的场景,但需注意其不支持嵌套事务和命令执行错误时的限制。
2025-05-27 22:05:32
961
原创 Redis 的缓存问题
本文探讨了使用Redis作为缓存时常见的六大问题及解决方案:1)缓存穿透:采用布隆过滤器或缓存空对象;2)缓存击穿:使用互斥锁或逻辑过期策略;3)缓存雪崩:通过随机过期时间或多级缓存缓解;4)数据一致性:建议先更新数据库再删除缓存;5)缓存预热:系统启动时加载热点数据;6)缓存污染:采用LRU淘汰策略或定期清理。这些方案综合考虑了性能与数据可靠性的平衡,为构建高效缓存系统提供了实用指导。
2025-05-27 22:04:56
607
原创 Redis 的看门狗机制
Redis的看门狗机制是分布式锁实现中的关键特性,通过自动续期解决锁超时问题。当客户端获取锁后,看门狗线程会在锁过期前定期续期,确保任务完成前锁不会被释放。Redisson实现了该机制,默认30秒过期时间,每10秒续期一次。优点包括自动续期和故障处理,但存在网络依赖和资源消耗问题。适用于长时间任务、分布式定时任务等场景。最佳实践建议合理设置过期时间并监控锁状态,在集群环境中需注意一致性和网络分区问题。
2025-05-27 22:04:21
1573
原创 数据库的三大范式
数据库规范化包含三个范式要求:第一范式要求列值不可再分;第二范式要求非主键字段必须完全依赖主键;第三范式进一步规定非主键字段之间不能相互依赖,只能依赖于主键。这些范式有助于消除数据冗余,确保数据完整性。(99字)
2025-05-27 22:02:04
115
原创 MySQL 的主从同步
MySQL主从复制通过binlog日志同步数据,采用三线程两日志机制,包含异步(高性能低一致性)、同步(低性能高一致性)和半同步(折中方案)三种复制类型。复制流程包含主库dump线程推送变更、从库IO线程写入relay log、SQL线程重放数据。主从延迟不可避免,MySQL 8.0引入WriteSet并行复制提升效率。常见解决方案包括:二次查询兜底、强制关键读写走主库、业务拆分主从访问、以及引入缓存(可能带来新的一致性问题)等。这些方法各有利弊,需根据业务特点选择合适策略。
2025-05-27 22:01:12
412
原创 MySQL 中如何进行 SQL 调优
SQL性能优化要点包括:1)合理设计索引,利用覆盖索引减少回表操作;2)避免SELECT *,只查询必要字段;3)防止函数计算导致索引失效;4)慎用模糊查询;5)遵循最左匹配原则;6)避免无索引字段排序;7)注意连表查询字符集一致性。此外可通过缓存减轻数据库压力,以及业务层面的优化如分页查询、精简字段展示等。
2025-05-27 22:00:40
203
原创 MySQL 中锁类型
数据库锁机制主要包括行锁、表锁、共享锁、排它锁、间隙锁和临键锁。行锁针对单行数据,表锁锁定整张表;共享锁允许多事务并发读,排它锁则独享读写权限;间隙锁保护行间空隙,临键锁结合行锁与间隙锁防止幻读。这些机制共同保障数据一致性与并发安全。
2025-05-27 21:59:30
110
原创 MySQL 的MVCC
MVCC机制解析 MySQL InnoDB通过MVCC实现高并发,核心原理是保存数据多版本: 版本链:每行记录携带事务ID和回滚指针,形成历史版本链 ReadView:事务通过ReadView判断可见性,解决读写冲突 隔离级别差异: 读已提交每次查询新建ReadView,可能不可重复读 可重复读沿用初始ReadView,但更新操作仍可能导致幻读 优势:无锁读取提升并发,缺陷是存储开销大且长事务影响性能 锁协同:MVCC处理读冲突,锁机制解决写冲突
2025-05-27 21:58:54
781
原创 MySQL 事务
MySQL通过锁、redo log、undo log和MVCC实现事务,确保ACID特性。长事务可能导致死锁、主从延迟、回滚耗时和资源竞争等问题。MySQL默认隔离级别为可重复读,兼容主从复制的binlog格式,避免数据不一致。不同隔离级别解决脏读、不可重复读和幻读问题,其中幻读指数据数量不一致,不可重复读指数据内容不一致。串行化隔离级别性能最低但能避免所有并发问题。
2025-05-27 21:58:12
247
原创 为什么 MySQL 选择使用 B+ 树作为索引结构
摘要: B+树通过非叶节点仅存储键和指针的特性,减少树高度和磁盘IO,提升查询效率。其叶子节点构成链表,便于范围查询。相比B树,B+树查询更稳定,内存利用率更高。在MySQL中,三层B+树可存储约2000万条数据,适合大规模数据索引。
2025-05-27 21:57:34
159
原创 B+ 树中查询数据的过程
摘要:本文介绍了通过二分法在数据库索引中查找记录的具体流程。首先从根节点开始,利用二分法定位到叶子节点。叶子节点中包含页目录、槽和组结构,每个槽对应组的最大记录。查找过程通过二分定位槽位置,再通过槽找到对应组或记录,最后可能需要遍历单向链表获取目标记录。以查找主键3为例,详细展示了二分定位槽位、调整高低位、最终通过槽1遍历链表找到目标记录的全过程。
2025-05-27 21:56:15
275
原创 聚簇索引和非聚簇索引的区别
数据库索引技术摘要:聚簇索引存储完整行数据,适合范围查询,每表仅限一个;非聚簇索引存储主键和索引列,支持多索引创建。回表指非聚簇索引查询后需二次查找聚簇索引。最左匹配原则要求联合索引从左开始匹配。覆盖索引避免回表,索引下推预先过滤减少回表。建立索引需注意:避免冗余、重复值、长字段和频繁修改列,以平衡查询效率与存储/修改成本。(149字)
2025-05-27 21:53:19
182
原创 MySQL 的存储引擎
MySQL主要存储引擎包括InnoDB和MyISAM。InnoDB支持事务、行锁和外键,采用聚集索引存储,适合高并发场景。MyISAM仅支持表级锁,不支持事务和外键,但读性能优异,适用于读多写少的应用场景。两者各具优势,可根据业务需求选择。
2025-05-27 21:51:09
223
原创 聚簇索引和非聚簇索引的区别
本文介绍了MySQL索引的核心概念和使用要点。聚簇索引在叶子节点存储完整行数据,适合范围查询,每个表只能有一个;非聚簇索引存储主键和索引列,可以建立多个,适合快速查找。解释了回表操作、最左匹配原则、覆盖索引和索引下推等关键技术。最后指出建立索引的注意事项:避免过度索引、重复值字段、长字段和频繁修改字段不宜建索引,以平衡查询性能和维护成本。这些知识对优化数据库性能至关重要。
2025-05-26 18:28:00
142
原创 MySQL 一条语句的执行过程
SQL语句执行流程:首先连接器验证用户权限,接着查询缓存(若未命中),然后分析器进行语法解析,优化器选择最佳执行方案,最后由执行器调用存储引擎(如InnoDB)完成数据操作。整个过程从客户端验证到数据存储形成完整链路。
2025-05-26 18:26:47
203
原创 MySQL 的索引类型
本文系统介绍了MySQL索引的三种分类方式:数据结构(B+树、哈希、倒排、R-树索引)、InnoDB引擎实现(聚簇/非聚簇索引)和索引性质(主键、唯一、联合等索引)。重点分析了B+树索引适用于范围查询、哈希索引适合等值查询的特性,以及聚簇索引存储完整数据、非聚簇索引仅保存键值和主键的区别。同时详细说明了各类索引的应用场景,如全文索引支持文本搜索、空间索引处理地理数据等,为数据库索引选择和优化提供了全面参考。
2025-05-26 18:25:53
314
原创 Java 父子类初始化顺序
Java父子类初始化顺序遵循特定规律:首先执行父类静态成员(变量和代码块),然后是子类静态成员;接着处理父类实例成员(变量和代码块)和构造方法,最后执行子类实例成员和构造方法。通过示例代码可清晰看到执行顺序:父类静态部分(1)→子类静态部分(2)→父类实例部分(3-4)→子类实例部分(5-6)。这种顺序确保了继承体系中的正确初始化,避免因依赖关系导致的错误。掌握此顺序对理解Java对象初始化机制至关重要。
2025-05-26 18:20:12
189
原创 Java 网络编程
Java通过java.net和java.nio包提供网络编程支持,支持TCP和UDP协议。TCP使用Socket实现可靠连接通信,包含ServerSocket(服务端)和Socket(客户端);UDP通过DatagramSocket实现无连接通信。示例代码展示了基本的TCP/UDP服务端与客户端实现流程,包括建立连接、数据收发等关键步骤。此外,Java还提供HttpURLConnection类专门处理HTTP协议通信,可方便地发起HTTP请求。这些API为开发网络应用提
2025-05-26 18:19:22
320
原创 Java 的注解
摘要:Java注解是JDK5.0引入的元数据形式,用于为程序元素添加补充信息。分为内置注解(如@Override)和元注解(如@Target)。可自定义注解并通过编译时或运行时处理,广泛应用于配置、代码检查等场景。Java8增强了重复注解和类型注解功能。注解能简化代码、提高开发效率,是强大的元编程工具。
2025-05-26 18:17:54
810
原创 Java 的泛型
Java泛型是Java 5引入的重要特性,它通过参数化类型实现代码复用和类型安全。泛型包括泛型类、泛型接口和泛型方法,允许在定义时使用类型参数,避免类型转换和运行时错误。泛型提供了类型通配符(无界、上界和下界)等高级特性,但其实现基于类型擦除机制,因此存在一些使用限制。泛型广泛应用于集合框架、算法实现和容器类设计,能显著提高代码的可读性、安全性和可维护性。合理使用泛型可以编写出更灵活、更健壮的Java程序。
2025-05-26 15:03:50
472
原创 Java 的反射
Java反射机制允许程序在运行时动态获取类信息并操作对象,是Java动态性的核心体现。反射通过Class类获取类结构,包括构造方法、字段和方法,还能创建对象、调用方法和修改字段值。反射支持泛型类型信息获取,广泛应用于框架开发、动态代理等场景。尽管反射功能强大,但性能开销较大,且可能破坏封装性,需谨慎使用。
2025-05-26 15:00:59
1169
原创 Java 的动态代理
动态代理是一种在运行时动态生成代理对象的技术,主要用于在不修改原始代码的前提下增强或控制对象行为。它通过解耦通用逻辑与业务代码,提升灵活性和可维护性。Java提供两种实现方式:JDK动态代理(基于接口)和CGLIB动态代理(基于继承)。JDK代理要求目标类实现接口,而CGLIB可直接代理普通类但无法处理final方法。两者性能接近,但CGLIB通过FastClass机制避免反射开销。动态代理是Spring AOP等框架的核心实现基础,为系统提供非侵入式的功能扩展能力。
2025-05-26 15:00:04
951
原创 HashMap 详解
本文深入解析了Java中HashMap的实现原理与使用方法。HashMap基于哈希表实现,提供高效的键值对存储与检索,具有无序性、非线程安全、允许null值等特点。分析了其内部结构(数组+链表/红黑树)、核心操作(put/get)流程、哈希冲突解决方案和扩容机制。详细介绍了重要参数(初始容量、负载因子)、性能优化建议、常见操作方法,并与其他Map实现进行了比较。特别强调了线程安全问题及解决方案。文章全面讲解了HashMap的工作原理和使用技巧,帮助开发者更好地利用这一数据结构。
2025-05-26 14:59:07
973
原创 DNS(域名系统)详解
DNS(域名系统)是互联网的核心服务,将易记的域名(如www.baidu.com)转换为机器可读的IP地址(如192.168.1.1)。它采用分层结构,包括根域名服务器、顶级域名服务器和权威域名服务器等。解析过程涉及本地缓存查询和递归/迭代查询机制。DNS支持多种记录类型(A、CNAME、MX等),应用于网页浏览、电子邮件、负载均衡等领域。这种分布式设计使DNS能高效处理全球域名解析请求,是互联网的关键基础设施。
2025-05-26 14:57:18
563
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅