- 博客(100)
- 收藏
- 关注
原创 枚举举例(开发中常用)
代码含义split[0]字符串数组第一个元素一个枚举类把字符串转为对应枚举值整体将字符串转为枚举类型,用于类型判断或流程控制这在实际开发中非常常见,尤其是在消息处理、状态机、协议解析等场景。
2025-08-30 02:58:17
135
原创 枚举的用法
枚举是一种数据类型,用于定义一组相关的、有限的、命名的常量值。✅枚举 = 一组命名的、固定的、有意义的常量在开发中,状态、类型、选项类字段,优先考虑使用枚举。提高代码可读性减少错误方便维护增强类型安全如果你告诉我你用的是哪种语言(Java、Python、TS 等),我可以给出更具体的代码模板和实战例子。
2025-08-30 02:54:58
99
原创 SpringBoot集成KafkaStream
可注入StreamsBuilder返回值必须是KStream且放入spring容器中KStream设置成bean是为了实现自动监听(被Spring容器管理可以实现)@Slf4j@Bean//创建kstream对象,同时指定从那个topic中接收消息@Override})//根据value进行聚合分组//聚合计算时间间隔//求单词的个数.count()//处理后的结果转换为string字符串})//发送消息。
2025-08-29 03:28:08
114
原创 Iterable接口
Iterable是 Java 中表示“可以被遍历”的对象的接口。实现了Iterable的类,就可以用for-each循环来遍历它的元素。// 一个简单的容器,存放整数,支持遍历// 实现 iterator() 方法@Override// 直接返回 list 的迭代器// 使用// ✅ 可以使用 for-each// ✅ 也可以使用 forEach要点说明🎯Iterable是什么?所有可遍历集合的根接口🔑 核心方法iterator()✅ 支持什么?for-each循环、
2025-08-29 01:53:46
145
原创 KTable 和 KStream
类型一句话解释KStream数据流:像一条不断流动的河,每条消息都是一个独立事件KTable动态表:像一个不断更新的数据库表,每条消息是对某行的修改KStreamKTable🧩像什么河流、录像带数据库表、Excel📌核心所有事件最新状态🔄转换.count()→KTable→KStream🎯你的代码中拆词后的单词流单词计数结果💡记住“发生了什么”“现在是什么”
2025-08-29 01:50:37
648
原创 实时流式计算KafkaStream
文章摘要: 本文介绍了基于Kafka Streams的实时流式计算实现方法,重点讲解了实时分值更新场景的应用。通过日志分析、大屏统计、公交定位等实际案例,说明实时计算的价值。详细解析了Kafka Streams的核心概念和架构,包括Source/Sink处理器、时间窗口、状态存储等特性。以单词计数为例,展示了从Kafka读取数据、拆分单词、分组统计、窗口聚合到结果输出的完整流程,并提供了生产者和消费者的测试代码。文章强调Kafka Streams轻量级、无外部依赖的优势,适合嵌入Java应用实现实时数据处理
2025-08-29 01:00:13
597
原创 批量数据(Batch Data) 和 流式数据(Streaming Data)
类型定义批量数据(Batch Data)在固定时间间隔内收集的一组静态数据,一次性处理。比如:每天凌晨处理昨天的订单数据。流式数据(Streaming Data)连续不断产生的数据流,实时或近实时处理。一句话总结🔷批量数据 = “事后诸葛亮”适合做总结、分析、报表🔴流式数据 = “实时哨兵”适合做响应、预警、推荐💡记住批量处理数据攒够了再算→ 准确但慢流式处理来了就立刻算→ 快但复杂高阶玩法:两者结合,既快又准!实时热度榜→ 流式处理(Kafka + Flink + Redis)
2025-08-28 20:52:53
727
原创 将热点文章保存到redis,用户查看时优先展示,解决数据重复的问题
本文提出了解决首页推荐与数据库查询文章重复展示的4种方案:1)查询时排除Redis缓存ID(最佳平衡方案);2)业务分离区分推荐位与热门榜;3)全量缓存Top1000到Redis(最优生产方案);4)数据库标记推荐状态。核心推荐方案3,通过每晚缓存Top1000热门文章到Redis,实现首页前30篇展示与后续分页查询都从Redis获取,既避免重复又提升性能。其他方案各具特点,可根据项目规模灵活选择,最终形成"缓存TopN,查询分段取"的最佳实践。
2025-08-28 20:01:43
382
原创 使用redis实时更新热度榜单Top,并实现数据的持久化
操作Redis 命令说明更新热度实时累加查询前 50从高到低删除文章下架时用清空榜单重置时用✅这是生产环境最推荐的实时热度方案!💡一句话记住“用 Redis ZSET 做实时热度榜,ZINCRBY更新,ZREVRANGE查询,毫秒级响应,轻松应对百万数据!✅这是一个非常关键的问题!Redis 是内存数据库,进程重启或服务器宕机后数据会丢失。因此,要实现“持久化”,必须将 Redis 中的热度数据定期同步到持久化存储(如 MySQL、PostgreSQL 等)。目标推荐方案。
2025-08-28 18:53:50
400
原创 常见的 Top K 热度查询解决方案
文章总结了6种TopK热度排序方案:1)分治+合并排序适合分库分表大数据场景;2)Redis ZSET推荐度高,适合实时榜单;3)Elasticsearch支持复杂多维度排序;4)数据库索引+LIMIT适用于小规模数据;5)堆算法适合内存批处理;6)Spark/Flink处理海量实时数据。推荐根据数据规模选择:小数据用数据库,中数据用Redis,大数据用ES或分治,超大数据用Flink。生产环境建议采用Redis+Flink+MySQL的高性能架构。
2025-08-28 18:47:53
555
原创 分治 + 合并解决数据量大时热度排序的问题
摘要:该文章介绍了一种高效的大规模数据TopK查询方法——分治合并策略。通过将100万条数据分成100份,每份查询前50-100条,再合并排序取前50,既能保证结果正确性,又能大幅提升性能。关键逻辑在于全局前50必然包含在某个分区的局部前50中。文章详细分析了方案原理、优化建议、实现伪代码和适用场景,并验证了该方法的正确性和高效性。这种"分而治之+局部最优→全局最优"的策略是大数据处理的经典解法。
2025-08-28 18:41:48
229
原创 大数据量分页 + 热度排序解决方案
摘要:针对大数据量分页和热度排序的性能优化问题,提出多层级解决方案。基础优化包括为热度字段添加索引、避免SELECT *查询和使用复合索引;进阶方案采用游标分页避免大偏移量;高性能推荐使用Redis ZSET维护实时榜单;额外技巧涉及热度字段预计算、分段查询和Elasticsearch复杂排序。根据数据量和场景可选择数据库索引+覆盖查询(几十万级)或Redis(高并发首选),相比原生ORDER BY方案可提升10倍以上性能。
2025-08-28 18:39:37
311
原创 黑马头条的上拉下拉和首页
5,如果是当前频道的首页,前端传递默认参数: maxBehotTime:0(毫秒) minBehotTime:20000000000000(毫秒) 2063年。4,当用户上拉可以加载更多的文章信息(按照发布时间)本页文章列表中发布时间最小的时间为依据。3,当用户下拉可以加载最新的文章(分页)本页文章列表中发布时间为最大的时间为依据。1,在默认频道展示10条文章信息。2,可以切换频道查看不同种类文章。
2025-08-28 18:10:50
51
原创 映射文件中常用的转义字符
=就是>=,是 XML/HTML 中表示“大于等于”的标准写法。✅ 使用>=代替>=✅ 使用<=代替<=✅ 使用代替💡一句话记住在 XML/HTML 里,>=就是>=,它不是 bug,而是正确的编码方式。✅。
2025-08-28 18:02:42
175
原创 为什么很多系统把未登录用户(游客)id设置成0
问题回答为什么userId默认是 0?因为int不能为null0是“无效用户”的通用占位符为什么不登录?id=0正是“未登录”的标志,不是登录了 ID 是 0id=0是真实用户吗?❌ 不是,数据库用户 ID 从 1 开始,0 永远不代表真实用户这种设计合理吗?✅ 合理,是常见实践,但可用Longnull更清晰💡一句话记住id=0不是“用户登录了”,而是“没人登录”,它是一个技术上的“空值替代品” ✅。
2025-08-28 16:43:26
179
原创 Redis中的String类型
问题回答String 类型会新增重复数据吗?❌ 不会,“重复 key”会被新值覆盖同一个 key 可以有多个值吗?❌ 不可以,String 是一对一映射如何避免覆盖?使用SETNX或先用EXISTS判断想存多个值怎么办?改用ListSetHash或Stream💡一句话记住Redis 的 String 就像一个“变量”,你给它赋新值,旧值就没了,不存在“重复”。
2025-08-28 16:27:19
226
原创 什么是热加载和热替换
本文对比了Java开发中的热加载(HotReload)和热替换(HotSwap)技术。热加载通过spring-boot-devtools实现,修改代码后自动重启应用上下文,适合日常开发;热替换利用JVM的JPDA,在调试模式下动态替换方法体代码,不重启应用。文章详细介绍了IntelliJ IDEA中两种技术的配置方法、使用场景和限制(如热替换不支持修改类结构),并推荐了商业工具JRebel作为高级替代方案。建议开发者根据实际需求选择:日常开发用devtools快速重启,调试时用HotSwap微调代码,复杂修
2025-08-28 15:47:47
709
原创 Hot Swap failedArticleApplication: add method not implementedArticleApplication报错是什么意思
热加载(Hot Reloading)和热替换(HotSwap)是开发中的动态更新技术。热加载可在不重启应用的情况下重新加载修改后的代码,如SpringBoot DevTools自动重启应用上下文。热替换允许在运行中的JVM动态替换方法体,但不支持添加/删除方法或修改类结构,且需JVM支持(如Java11+)。常见错误提示表明尝试了不支持的操作(如添加新方法),解决方案包括:重启应用、升级JVM、使用JRebel工具或配置SpringBoot DevTools。热替换适合方法体修改,而复杂变更需结合其他工具实
2025-08-28 15:46:09
343
原创 测试启动了完整的上下文
启动了完整的上下文”= 启动一个和你的真实 Spring Boot 应用几乎一模一样的运行环境,包括:✅ 所有配置、✅ 所有 Bean、✅ 数据库连接、✅ Web 层、✅ 安全、✅ 缓存等,就像你在生产环境中启动应用一样。Spring 容器的“运行时环境”所有被 Spring 管理的 Bean(对象)所有的配置信息(yml、properties)数据源、事务管理器、消息队列连接等Web 环境(如果是 Web 项目)事件机制、国际化、环境变量等。
2025-08-28 15:39:52
571
原创 一改代码,测试类自动启动?
你看到的“一改代码测试类自动启动”,其实是:🔧IDEA 自动编译 +自动重启的组合效果。这不是 bug,而是Spring Boot 为开发者提供的便利功能,目的是让你专注编码,无需频繁手动重启。💡小提示你就知道:是devtools在工作了 ✅。
2025-08-28 15:38:24
359
原创 idea中java代码改动之后每次都要compile才能启动
热部署工具可以监视项目的源代码文件,并在检测到文件改动时自动重新加载已修改的类。Spring Boot Devtools 是 Spring Boot 提供的一个开发工具,它可以自动检测代码改动并进行热部署。JRebel 是一款商业化的热部署工具,它支持各种 Java 编译器和应用服务器,并能够在开发过程中实时加载代码变更。我们可以通过在项目的。然后,在 IDE 中启动应用程序,并配置 JRebel 插件。然后,在IDE中开启自动编译功能,并启动应用程序。当代码改动后,保存文件即可自动触发热部署。
2025-08-28 15:23:54
57
原创 开发中如何进行高质量测试
这篇文章介绍了开发中测试Service的4种方法,重点推荐单元测试。摘要如下: 4种测试方式对比:从最快的日志调试到最慢的接口测试,推荐单元测试(JUnit+Mockito)作为核心验证手段 单元测试详解: 添加依赖后编写测试类 覆盖正常/边界/异常情况 使用Mockito模拟数据库依赖 可重复执行且能防止回归 测试策略: 优先单元测试验证核心逻辑 必要时使用集成测试 建议开发流程:编码→写测试→验证→提交 测试重点:需覆盖条件判断、循环处理、状态转换等业务逻辑,单纯DAO调用可不测 专业建议:将单元测试作
2025-08-28 03:26:41
796
原创 使用redis缓存热点文章,使用xxl-job进行热点文章定时计算
本文总结了Java开发中的几个实用技巧:1.时间处理使用LocalDateTime获取当前时间并减5天;2.Stream流的高级用法,包括过滤(filter)和排序(sorted)操作;3.集合截断时的异常处理,建议先检查size再调用subList;4.远程调用时要检查状态码,并处理JSON响应数据。文中还介绍了热点文章计算功能实现,包括SQL查询前5天文章、计算文章分值(按阅读、点赞等行为加权)以及使用Stream流按频道分类并缓存前30条高分文章。
2025-08-28 03:22:54
277
原创 使用 LocalDateTime 获取 当天最小时间以及减去某个时间
场景推荐写法获取当天 0 点 0 分 0 秒✅(首选)已有 LocalDate,想转开始时间已有 LocalDateTime,想归零想明确表达“最小时间”概念🎯要获取当天最小时间,最简单的方式是这是 Java 8 时间 API 设计的“最佳实践”!
2025-08-27 23:55:52
164
原创 MyBatis和MybatisPlus中的@Param注解
问题答案@Param必须加吗?❌ 不是必须,但强烈建议加@Param是匹配#{}里面的参数吗?✅ 完全正确!#{xxx}匹配不加会出问题吗?⚠️ 可能,尤其在编译参数名丢失时加了有什么好处?安全、清晰、兼容性好🎯@Param("名字")就是给参数起个“外号”,让 SQL 中的#{名字}能找到它。为了代码健壮性和可维护性,建议所有参数都加@Param!在 MyBatis 的 Mapper 接口中,如果方法只有一个参数,@Param通常可以省略,但建议加上,尤其是用于 XML 或复杂场景。
2025-08-27 23:42:41
652
原创 xxl-job分布式广播(课上)
通过分片取模的方式找到具体的分片方法去执行,如1%3=1,去找分片1,3是实例数。分片广播是三个分片同时执行,区别于轮询,执行效率大大提高。
2025-08-27 03:17:27
177
原创 xxl-job的分片广播
分片广播 = 包工头把活拆了,同时派给所有工人取模 = 按“余数”分派任务,确保每人干自己那部分调度中心(包工头)↓广播任务(带分片号)↓ ↓实例A (0/3) 实例B (1/3) 实例C (2/3)↓ ↓ ↓处理数据 处理数据 处理数据分片广播 + 取模,就是让多个机器并行干活的最简单、最高效的方式!项目中要做“批量推送”、“数据同步”,这就是最佳选择!❓“发一次,有两个实例,是不是发了两次?🚫不会!✅只要正确使用分片每个实例只处理“属于自己”的那部分数据每条数据只被一个实例处理。
2025-08-27 02:53:15
664
原创 xxl-job基础知识
XXL-JOB是一个轻量级开源分布式任务调度平台,核心包含调度中心(Admin)和执行器(Executor)两大组件。调度中心通过8888端口提供Web管理界面,执行器通过9999端口(可配置)的Netty服务接收调度指令。关键配置包括执行器名称(appname)、通信端口(executor.port)等,需确保与调度中心配置一致。系统采用业务端口(如8881)与调度端口分离设计,支持多实例部署和动态配置。最佳实践建议包括:服务分配唯一appname、端口避免冲突、任务实现幂等性等。理解各端口职责(8888
2025-08-26 21:16:08
823
原创 分布式任务调度解决 xxl—job
如发放5000张优惠券,单体架构使用@Schedule是没问题的但是分布式应用会出现问题,如果有两个优惠券服务集群,且是使用@schudele,两个微服务都会去执行这个定时任务,最终总计发1w张优惠券解决方法:使用redis的分布式锁解决(谁抢占到这个定时任务谁执行)使用zookeeper的主从策略,让某个微服务执行发放这两个方法共同的缺点:耦合度高。
2025-08-26 19:38:29
960
原创 @Value注解以及使用方式以及带默认值的@Value
问题回答@Value是什么?Spring 注解,用于从配置文件读取值${}是什么意思?SpEL 表达式,表示“去配置里找这个 key”能不能设默认值?能,用:xxx,如用在什么地方?任何 Spring 管理的 Bean 中(@Component@Service等)✅@Value就是让 Java 代码能“读取配置文件里的值”,实现配置与代码分离,是 Spring 项目中最常用的注解之一。
2025-08-26 19:22:44
381
原创 MySQL为什么要开启SSL(在连接低版本 MySQL尤其是 5.7 及以下时,通常建议设置 useSSL=false)
问题回答是什么?禁用 SSL 加密开发时要不要加?✅ 建议加上,避免警告生产环境能用吗?❌ 绝对不能,有安全风险什么时候必须用true?数据库在公网、金融、敏感数据场景✅// 开发环境// 生产环境为什么“通常建议在连接低版本 MySQL(尤其是 5.7 及以下)时,通常建议设置 useSSL=false“?问题回答低版本 MySQL 要设置吗?✅通常需要,因为默认不支持 SSL为什么?❌ 默认未启用 SSL,会警告或失败能强制用吗?
2025-08-26 18:26:39
859
原创 使用redis缓存用户行为(包括用户点赞收藏关注不喜欢)
文章摘要: 本文介绍了基于Redis和Kafka的用户行为数据存储与处理方案。系统采用Redis存储用户行为(点赞、收藏、阅读等),利用其高性能和丰富数据结构特性;通过Kafka实现异步持久化到MySQL,保证数据最终一致性。详细设计了Redis Key命名规范(如LIKE-BEHAVIOR-{articleId}),并给出了Java实现示例。方案包含双写策略、幂等处理、降级机制等优化点,适用于高并发场景下的用户行为处理,实现秒级响应和可靠存储的平衡。
2025-08-26 16:09:38
725
原创 网络跨域设置
这里可以看到本机地址是192.168.200.1,而虚拟机的地址为192.168.200.130,在相同的网段,所以可以进行通信,但是和要求的192.168.200.150不一样。现在去把本机的网络设置成:192.168.200.150,方便请求可以到本机。允许任何hearder,任何域,任何方法请求到当前网关。文章上传到了MinIO,文章的js文章中有一个配置。虚拟机进行了地址的配置,用的时200这个网段。可以修改文件,也可以修改本机ip。这里进行修改本机ip。
2025-08-25 18:21:04
190
原创 Long类型精度丢失问题解决方案
本文提出了一种前后端数据转换方案,通过自定义注解和序列化处理实现ID字段的类型转换。核心包括: 定义@IdEncrypt注解标记需转换字段 实现ConfusionSerializer/Deserializer处理序列化/反序列化 使用Modifier类过滤处理字段 通过ConfusionModule注册转换模块 配置InitJacksonConfig自动注入ObjectMapper 该方案支持: 后端→前端:数字转字符串 前端→后端:字符串转数字 支持Long/Integer类型转换 通过注解灵活控制转换字
2025-08-25 17:59:17
334
原创 黑马头条解决MinIO上传文章格式不正确的问题(附有完整代码和修改后的模板文件)
本文介绍了将静态资源文件上传至MinIO存储服务并修改文章模板文件的过程。主要内容包括:1)使用Java代码将JavaScript和CSS文件上传到MinIO,并指定正确的contentType;2)修改HTML模板文件,调整资源引用路径;3)通过循环处理所有文章,使用Freemarker生成HTML文件后上传到MinIO,并更新数据库中的静态URL字段。整个过程实现了文章内容的静态化处理和统一存储管理。
2025-08-25 16:30:51
100
原创 高质量枚举
定义了一个自媒体文章状态枚举统一管理状态码(避免魔法值,如提高代码可读性比更清晰)与数据库/JSON 自动映射(通过 ORM 框架支持)防止错误状态值(只能是预定义的几个状态)
2025-08-25 16:18:10
356
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人