- 博客(64)
- 收藏
- 关注
原创 【Easylive】视频在线人数统计系统实现详解 & WebSocket 及其在在线人数统计中的应用
心跳上报接口:客户端定期调用以维持在线状态Redis存储结构:使用两种键存储在线信息过期监听机制:通过Redis的键过期事件自动减少在线人数计数维护逻辑:确保在线人数的准确性WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
2025-04-02 09:32:59
610
原创 【Easylive】关于Spring事务内部调用的问题
事务信息绑定在线程本地变量(ThreadLocal)中,新线程无法获取。:抛出的异常类型不在rollbackFor指定的范围内。:Spring AOP无法代理非public方法。这种设计既保证了事务完整性,又实现了代码复用。:内部调用绕过了Spring的代理机制。例如使用MyISAM引擎的MySQL表。:事务回滚需要异常传播到事务管理器。
2025-04-02 08:54:21
409
原创 【Easylive】跨系统事务处理策略
常规场景:采用"先本地后远程+异步重试"方案金融等严格场景:考虑两阶段提交或Saga模式必须保证• 本地操作的可回滚性• 远程调用的幂等性• 完善的监控报警机制通过这种设计,即使在远程调用超时的情况下,系统仍能保持最终一致性,同时避免长时间的资源锁定和用户等待。
2025-04-02 08:53:17
923
原创 【Easylive】乐观锁与悲观锁详解及实例对比
• 使用Zookeeper或Redis实现分布式锁。• 问题:版本号从A→B→A,检查不出变化。• 解决:使用时间戳+随机数组合作为版本号。• 解决:按固定顺序获取锁,设置锁超时。• 系统响应时间比数据绝对一致更重要。• 或者外层乐观锁,关键操作悲观锁。• 并发冲突概率低(<20%)• 使用Redis实现版本控制。• 重试成本高(如银行转账)• 结合重试机制(3次重试)• 问题:多个事务互相等待锁。• 临界区代码执行时间长。• 读操作远多于写操作。• 数据一致性要求极高。• 使用适当的隔离级别。
2025-04-01 21:11:11
651
原创 【Easylive】MySQL中LEFT JOIN与INNER JOIN的使用场景对比
•使用INNER JOIN:当你确定关联数据必须存在,且只需要匹配成功的记录时•使用LEFT JOIN:当需要保留左表所有记录,无论是否匹配,或者需要查找缺失关联数据时正确选择JOIN类型不仅能确保查询结果的准确性,还能显著影响查询性能。在设计查询时,应先明确业务需求,再决定使用哪种JOIN方式。
2025-04-01 21:10:26
844
原创 【Easylive】auditVideo方法详细解析
Override// 方法实现功能验证审核状态合法性更新视频审核状态处理审核通过/不通过的逻辑分支用户积分奖励(首次发布)数据同步到正式表清理待删除文件同步数据到搜索引擎参数•videoId:视频唯一标识•status:目标审核状态•reason:审核原因(如不通过原因)事务控制确保方法内所有数据库操作要么全部成功,要么全部回滚auditVideo严谨的状态管理:通过枚举和乐观锁确保状态流转安全数据隔离设计:发布数据与正式数据物理分离完整的业务流程。
2025-04-01 21:09:46
748
原创 【Easylive】convertVideo2Ts 和 union 方法解析
这两个方法是中用于视频文件处理的核心辅助方法,下面我将结合它们在中的使用场景进行详细解释。
2025-04-01 21:09:09
879
原创 【Easylive】transferVideoFile 方法详细解析
Override// 方法实现功能从临时目录转移视频到正式目录合并视频分片(如果有)获取视频元信息(时长等)更新数据库状态处理转码失败情况检查并更新视频整体状态文件转移流程• 从临时目录 → 正式目录• 清理临时文件• 删除Redis缓存视频处理• 合并分片(如需要)• 获取元信息(时长、大小)• 转换为TS格式(用于流媒体)状态管理• 单个文件状态更新• 整体视频状态检查• 失败处理和成功状态更新事务完整性。
2025-04-01 21:08:24
668
原创 【Easylive】MyBatis 批量插入或更新语句解析insertOrUpdateBatch
这段代码是一个 MyBatis 的 Mapper XML 配置,实现了批量插入或更新视频文件信息的功能。
2025-04-01 21:07:41
678
原创 【Easylive】详细解析 `stream()` 方法的使用
操作类型方法说明示例创建流stream()从集合创建流中间操作filter()过滤元素map()转换元素终止操作collect()收集结果forEach()遍历元素。
2025-04-01 21:07:00
423
原创 【Easylive】saveVideoInfo 方法详细解析
Override•事务注解表示该方法在一个事务中执行,遇到任何异常都会回滚•参数•:视频主信息•:视频关联的文件列表参数校验:检查分P数限制、视频状态是否允许修改新增视频:生成ID、设置初始状态、插入数据库更新视频• 比较新旧文件列表,识别新增、删除和修改的文件• 根据修改情况设置视频状态• 更新视频主信息文件处理• 删除不再需要的文件记录和实际文件• 为新增文件生成ID并设置属性• 批量保存文件信息• 将新增文件加入处理队列。
2025-04-01 21:06:09
613
原创 【Easylive】分片上传视频文件 uploadVideo方法
如果 Redis 中没有找到对应的上传任务,说明任务已过期或无效,需重新上传。的功能,主要用于处理大文件的上传(如视频)。• 返回空响应(HTTP 200),表示当前分片上传成功。:接收客户端上传的视频文件分片,并保存到服务器临时目录。:当前分片比预期分片大(如预期传第3片,但传了第5片)。:唯一标识本次上传任务(用于关联所有分片)。:如果已上传的文件总大小超过限制,直接拒绝。:当前分片的序号(如第1片、第2片)。• 云存储服务(如网盘的大文件上传)。:已上传的最大分片索引。:当前分片超过总分片数。
2025-04-01 21:05:26
688
原创 【Easylive】file.transferTo(new File(filePath)) 代码解析
• 用户通过 HTTP 请求上传文件,Spring MVC 将其封装为。• 文件可能暂存在内存或临时目录(取决于文件大小和配置)。:添加文件名冲突检查(如追加随机字符串或时间戳)。• 如果成功,文件会永久存储在服务器的指定位置。• 手动写入需要处理缓冲区和流关闭,代码更复杂。已优化文件流处理,直接操作文件系统,拼接出完整的存储路径(如。• 确保目标目录存在(通过。• 大文件上传时,建议使用。:捕获异常并返回友好提示。• 返回相对路径(如。◦ 目录无写入权限。,避免阻塞请求线程。
2025-04-01 21:04:39
364
原创 【Easylive】saveCategory方法中的if判断(对应增加和修改)
可能和数据库一致(此时应允许保存)。:确保分类编号的唯一性,避免数据冲突。如果不等,说明用户试图将当前分类的。修改为一个已被其他分类占用的值。避免误判:修改操作中,当前分类的。占用(允许修改为自己的原值)。• 新增时:禁止使用已存在的。区分操作类型,结合查询结果。从数据库查询到的已有分类。关键点:确保当前修改的分类。:抛出异常,阻止重复新增。数据库中找到的那个分类。• 用户尝试新增一个。• 但数据库中已存在。• 但数据库中已存在。• 修改时需额外检查。改为其他分类的编号。
2025-04-01 21:03:52
555
原创 【Easylive】convertLine2Tree 方法详解
等具有父子层级关系的数据。:若原始数据是乱序的,可能漏掉深层节点。• 返回当前层级的所有子节点(已递归包含所有后代节点)。:任何需要父子层级展示的数据(如分类、菜单、评论回复)。:树形结构的分类列表,每个节点的子分类挂在。对每个符合条件的节点,继续查找其子节点(以。指向父节点),但前端需要树形结构展示。:O(n²)(每个节点遍历整个列表)。:通过递归将扁平列表转换为树形结构。分组减少遍历次数,确保数据无环。将子节点列表设置到当前节点的。的子节点)准备一个空列表。条件中:当没有节点的。无子节点,递归终止。
2025-04-01 21:02:52
1099
原创 【Easylive】AppInterceptor和WebAppConfigurer 基于 Token 的请求拦截验证机制
• 主要功能:验证请求中的 Token 是否有效(从 Header 或 Cookie 获取),无效则拒绝访问。提取 Token(因为浏览器不会为这些请求设置自定义 Header)。:定义不需要 Token 验证的白名单路径(如登录、文件公开访问)。:从 Cookie 中提取 Token(用于文件请求等特殊场景)。)通过 Cookie 传递 Token,确保只有登录用户可访问。:前后端分离架构中,前端(如 Vue/React)通过。:空实现,用于拦截后处理(如日志记录),当前未使用。应用到所有请求路径(
2025-04-01 21:02:04
878
原创 【Easylive】服务端操作 Cookie 的完整流程(结合案例解析)
用户登录成功后,服务端生成一个身份令牌(Token),并通过 Cookie 自动保存到浏览器。通过这种方式,服务端可以轻松管理浏览器端的持久化数据!操作 Cookie,并附上完整案例和关键点解析。以下通过 saveToken2Cookie。(HTTPS 环境下)。
2025-04-01 21:00:15
251
原创 【Easylive】TokenUserInfoDto中@JsonIgnoreProperties和 Serializable 接口作用
提供标准的 Java Bean 方法,便于框架(如 Spring、Jackson)通过反射访问字段。,表示该类的对象可以被转换为字节流(例如存储到文件、通过网络传输或存入 Redis 等缓存)。• 该 DTO 可能用于用户登录后返回的令牌信息(通过 JSON 响应给前端)。:添加此注解后,多余的字段会被静默忽略,确保反序列化不会因字段不匹配而失败。的 DTO(数据传输对象),用于封装用户令牌信息。• 也可能被序列化后存入 Redis(作为缓存或分布式会话)。:用户认证令牌(如 JWT)。
2025-04-01 20:58:39
412
原创 【Easylive】获取request对象的两种方式
在 Controller 方法中直接声明参数,Spring 会自动注入当前请求的request:简单直接,无需手动处理。
2025-03-31 20:38:29
196
原创 【Easylive】HttpServletRequest、HttpServletResponse、HttpSession 介绍
掌握这三个对象是 Java Web 开发的基础,无论是传统 Servlet 还是 Spring MVC 都离不开它们!这三个是 Java Web 开发(Servlet/JSP)的核心接口,用于处理。• 客户端信息(IP、User-Agent)• 设置响应状态码(200/404/500)• 写入响应体(HTML/JSON)• 请求参数(GET/POST)• 添加响应头(Headers)封装客户端(浏览器)发送的。• 请求头(Headers)(如登录状态、购物车信息)。• 会话(Session)
2025-03-31 20:37:45
1300
原创 【Easylive】SpringBoot启动类——EasyLiveWebRunApplication
这个启动类是 Spring Boot 应用的“大脑”,通过注解驱动了整个框架的协作运行。:启用 Spring Boot 的自动配置(如自动配置数据源、Web MVC 等)。后,Spring 会自动管理数据库事务(如提交、回滚)。:显式指定扫描的包路径(覆盖默认扫描当前包及其子包)。:标识这是一个 Spring Boot 配置类。:启动 Spring Boot 应用的入口方法。禁用 Spring Boot 的默认配置。:告诉 MyBatis 扫描指定包(:启用 Spring 的。:启用 Spring 的。
2025-03-31 20:36:39
441
原创 【Easylive】JDBC 连接池(Connection Pool)是什么意思?
JDBC(Java Database Connectivity)是 Java 连接数据库的标准 API,而。通过连接池,你的应用可以轻松应对高并发数据库访问!消耗大量资源(TCP 三次握手、数据库认证等)。是目前最快的连接池,适合大多数 Java 应用。,避免频繁创建和销毁连接带来的性能开销。• 启动时创建一定数量的连接(如。,数据库可能因连接数过多而崩溃。:长时间未使用的连接会被回收(,避免重复创建的开销。,自动剔除失效连接。:连接超过存活时间(
2025-03-31 20:35:56
365
原创 【Easylive】HikariCP 介绍
Spring Boot 2.x 默认使用 HikariCP,只需配置。:如果数据库宕机,HikariCP 会立即抛出异常,而不是无限等待。它的名字来源于日语“光”(Hikari),意为“快速、高效”。:可通过 Actuator 或 JMX 查看状态。:定期检查连接是否有效,避免使用已断开的连接。如果你的应用不需要 Druid 的额外功能,:速度快、轻量级、自动维护连接健康。:减少 JVM 方法调用开销。,减少 SQL 解析时间。数据结构,减少锁竞争。,适合绝大多数场景。
2025-03-31 20:35:20
368
原创 【Easylive】application.yml文件中都是什么作用
HikariCP 是 Spring Boot 默认的高性能数据库连接池,这里配置了连接池参数。,采用 YAML 格式,用于定义应用程序的各种配置参数。: 限制整个 HTTP 请求(可能包含多个文件)的最大大小(如。等关键配置,是 Spring Boot 应用的核心配置文件。• 用于标识当前应用(如微服务架构中的服务名)。: 自定义文件存储路径(如上传的文件存放位置)。: 可能是用于后台管理的默认账号密码。: 指定应用运行的端口号(默认。: 限制单个上传文件的大小(如。: 设置应用的根路径(如。
2025-03-31 20:34:03
309
原创 【Easylive】Maven 多模块项目的 POM 文件配置详解
这个文件是一个 Maven 的 POM (Project Object Model) 文件,它是 Maven 项目的核心配置文件,用于定义项目的结构、依赖关系、构建配置等信息。• 继承 Spring Boot 的父 POM,提供了默认的依赖管理、插件配置等。• 如果某个子模块需要特殊配置,可以在其 POM 中覆盖父 POM 的设置。• 子模块的 POM 文件会继承父 POM 的配置,无需重复定义版本号。• 子模块使用时无需指定版本号(继承父 POM 的版本)。:统一管理子模块的依赖版本,避免版本冲突。
2025-03-31 20:32:56
1167
原创 【Easylive】项目常见问题解答(自用&持续更新中......)
Easylive是一个来自B站知名UP主"程序员老罗"的优质开源项目。我强烈推荐大家去B站关注老罗,个人感觉他的项目质量都非常高,技术内容也很实用!
2025-03-31 20:31:02
328
原创 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
461
原创 移动应用开发项目——图书影片管理系统【安卓项目|前后端】
通过本平台,用户可以将自己的感受转化为评论与他人分享,这种基于差异化的评论为其他用户提供了新的知识扩展线索,激发更多的发散性思维。与传统的网上书店推荐书籍的方式不同,本项目强调评论和人际关系的作用,这不仅能更好地满足用户探索新知识的需求,还能在知识学习上取得更加显著的效果。对于被动型用户(即仅浏览内容、不主动创作的用户)而言,平台同样提供了价值,他们可以通过浏览其他用户的评论和推荐,发现符合自己兴趣的书籍或电影。影视表、管理员表、书评表、影评表、电影图片表、演职员表、演职员参演表、推荐评论表、管理员表…
2024-11-08 11:21:05
983
原创 SpringBoot项目中如何在AOP中拿到Session信息
在 Spring Boot 项目的 AOP 中可以通过来获取当前请求的信息。提供了访问当前请求上下文的能力,这样我们可以在 AOP 切面中获取。
2024-11-05 11:09:43
671
原创 AOP实现参数校验的一些问题【代码贴在最后】
是一个灵活且强大的工具,它简化了请求处理中的登录验证和参数校验逻辑,提高了代码的可维护性与一致性,同时也降低了重复代码的数量。通过 AOP 和自定义注解的结合,开发者可以更高效地管理和扩展这些功能。VerifyParam的作用是一个自定义注解,用于在 Spring Boot 应用中对方法参数进行验证。它的主要作用是提供一种灵活的方式来定义参数验证规则。以下是是一个强大且灵活的参数验证工具,通过结合 AOP 提供的机制,可以有效地管理方法参数的合法性,减少了手动验证的代码量,提高了代码的整洁性和可维护性。
2024-11-02 20:03:27
779
原创 SpringBoot项目中枚举类的作用
在 Spring Boot 项目中,枚举类不仅可以帮助开发人员以更清晰和安全的方式管理常量,还能提高代码的可读性和维护性,减少错误,并与其他框架(如 Spring 和 Jackson)无缝集成。使用枚举类是良好的编程实践之一。
2024-11-02 19:32:48
611
原创 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
414
1
原创 如何用JAVA中的BigInteger实现进制转换
然后使用BigInteger的构造函数将二进制字符串转换为BigInteger对象。接着,我们可以使用toString()方法将BigInteger对象转换为十进制字符串,或者使用toString(int radix)方法将其转换为指定进制的字符串,例如16进制。:首先,你需要创建一个BigInteger对象,表示你要转换的数字。:一旦你有了BigInteger对象,你可以使用其提供的方法将其转换为其他进制的字符串表示。这将创建一个BigInteger对象,表示十进制数12345。
2024-04-10 20:26:54
488
原创 动态规划:最长公共子序列(文末附有例题)
给定一个序列X=,另一个序列Z=,若存在一个的X的下标序列对所有的1,2,3,...,k,都满足x(ik)=zk,则称Z是X的子序列比如Z=是X=的子序列。
2023-10-20 20:23:42
380
原创 【前后端交互】前端传参Date类型,后端@RequestBody属性接收不到,前端报错400
本人做的系统是电影院购票系统,在更新排片信息的时候遇到了这个问题,因为报了400的错误,所以当时的初步估计是参数方面的错误。我感觉是前端那几个Date类型的数据跟后端类型不匹配之类的出问题了,然后我就换了一种传参的方法。后端:(这种方法后端接收Date必须用String类型接)出错的系统是Vue与后端的交互。当然肯定不止这一种方法。这样我的问题就解决了。
2023-05-13 11:26:01
1991
空空如也
影院排片系统如何让排片时间不发生冲突
2023-03-25
TA创建的收藏夹 TA关注的收藏夹
TA关注的人