- 博客(35)
- 收藏
- 关注
原创 SpringCloud Stream 快速入门
在分布式系统中,可能使用到的消息队列让人眼花缭乱,可能有使用(RabbitMq RroketMQ Kafka....),他们提供的客户端各不相同,使用的方式也让人眼花缭乱,此时就需要一个能够统一消息队列的客户端,通过更高级的抽象来实现更通用和更简单的集成不同的消息队列中间件,此时也就诞生了这个SCS 组件。
2025-11-23 17:47:49
754
1
原创 Ubunntu24.04 下载jdk 8
新版本的Ubuntu官方镜像仓库已经移除了JDK 8的镜像依赖,所以我们需要添加新的源来下载jdk8推荐你使用。
2025-11-15 13:12:37
406
原创 Vue3 + TypeScript 一篇文章 后端变全栈
Vue还是✔️还是✔️语法还是✔️构建工具还是✔️路由✔️共享存储还是✔️视图组件还是✔️。
2025-10-09 14:45:41
919
原创 Java多线程编程完全指南:从入门到精通
5, // 核心线程数10, // 最大线程数60L, // 空闲线程存活时间new LinkedBlockingQueue<>(100), // 任务队列new ThreadPoolExecutor.CallerRunsPolicy() // 拒绝策略Java多线程编程是构建高性能应用的基石。从基础的线程创建,到复杂的线程池和并发工具,掌握这些知识能让你的程序更加高效和稳定。记住:多线程不是银弹,要根据实际场景合理使用。过度使用多线程反而会增加系统复杂性和性能开销。
2025-08-26 18:49:39
858
1
原创 Spring Ai (Function Calling / Tool Calling) 工具调用
本文介绍了大语言模型(LLM)工具调用的实现方法。工具调用允许LLM在生成回答时决定是否需要调用外部函数获取信息或执行操作,如联网搜索、网页抓取等。文章详细讲解了工具调用的流程:用户提问→LLM判断是否需要工具→执行工具→返回结果→生成最终回答。重点演示了两个工具的编写:1)使用jsoup实现的网页抓取工具,可解析指定URL的HTML内容;2)基于阿里云通晓API的联网搜索工具,支持返回网页搜索结果和垂类场景结果。最后说明如何将工具集中注册,并通过ChatClient集成到应用中,使LLM获得扩展能力。测试
2025-08-26 17:10:29
1278
原创 Srping AI RAG 知识库 最佳实践
编写自定义检索器/*** 自定义文档检索器*/.similarityThreshold(similarityThreshold) // 相似度阈值.topK(topK) // 返回的文档数量// .eq("type", "web") //寻回检索 元数据中 type 为 web 的文档// ).build();@Override@OverrideChatClient的使用 方法dochatRag方法中的建议关联度达到0.4最好。
2025-08-21 18:21:51
1193
原创 Spring AI RAG 检索增强 应用
摘要:RAG(检索增强生成)技术通过结合信息检索与AI生成,有效提升大模型回答的准确性和时效性。文章首先介绍了RAG的核心功能:增强知识实时性(如回答最新赛事结果)、减少模型幻觉(基于真实数据生成)、处理专业领域问题(检索特定知识库)。随后详细展示了两种RAG实现方案:1)基于阿里百炼平台的云端方案,包括知识库创建、文档上传标注及SpringAI集成;2)本地内存向量数据库方案,涵盖Markdown文档读取、文本分块处理及向量存储配置。两种方案均通过SpringAI框架实现对话接口,并附有代码示例和测试结果
2025-08-18 18:39:46
1557
2
原创 Spring AI 的特性 及其 最佳实践
Ai的调用分为阻塞式调用 和 流式调用,所以自定义Advisor 需要实现两个不同的接口,分别是CallAroundAdvisor 和 StreamAroundAdvisor ,第一个需要实现的方法为 aroundCall ,第二个为 aroundStream每当阻塞式调用 就会走aroundCall 方法 流式调用则走 aroundStream 方法所以我们需要记录日志就需要在两个方法中都进行记录。@Slf4j//记录用户输入//打印模型返回结果@Override。
2025-08-13 17:46:49
890
原创 3分钟 Spring AI 实现对话功能
是 Spring 官方推出的一个基于 Spring 生态的,旨在简化将人工智能(如大语言模型、生成式 AI)集成到 Java 应用中的过程。它提供了统一的 API 和工具,让开发者能更轻松地调用 AI 模型。
2025-08-13 16:11:47
1323
原创 从零搭建Cloud Alibaba (下) Sentinel篇
写法1:在controller中添加以下代码/*** 测试sentinel限流 (添加了@SentinelResource)* @SentinelResource value 为 限流规则的资源名称 blockHandler 为限流规则的异常处理方法*/return "没有达到限流的规则 --- 添加了@SentinelResource 正常访问";/***作为(testSentinelRatilimitB)的限流异常返回方法*/
2025-08-05 18:23:13
1295
1
原创 从零搭建Cloud Alibaba (中) Seata篇
本文详细介绍了Seata分布式事务服务的配置与集成过程。主要内容包括:1)Seata服务端的安装和配置,重点讲解application.yml文件中端口、服务名、日志、安全等核心配置项,以及Nacos作为配置中心和注册中心的设置;2)创建Seata所需的数据库表结构,包括branch_table、global_table等5个核心表;3)微服务集成Seata的步骤,包括添加依赖、配置事务组、数据源代理模式设置,以及创建undo_log回滚表;4)分布式事务的使用方法,通过@GlobalTransaction
2025-08-03 17:27:31
994
原创 SpringBoot 实现 Redis读写分离
在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Spring的RedisTemplate底层利用lettuce实现了节点的感知和自动切换。3.自定义,配置Redis 读取操作时的。
2025-07-15 21:23:26
607
原创 Redis集群搭建(主从、哨兵、读写分离)
首先需要安装Redis所需要的依赖: (使用root 用户!如果下载失更换阿里云的镜像源)下载Redis 压缩包通过网盘分享的文件:redis-6.2.4.tar.gz链接: https://pan.baidu.com/s/1DvRoQBLLXcePo7OFeEhCbg?pwd=1234 提取码: 1234将压缩包上传至虚拟机 /tmp文件夹下以下命令均在/tmp下执行解压后:进入该文件夹进入redis-6.2.4的文件夹 修改一下配置文件在当前目录下启动单机redis停止redis。
2025-07-15 21:10:20
1263
原创 Redis主从同步原理(全量复制、增量复制)
在Redis的高可用架构中,是实现数据冗余、读写分离以及后续哨兵(Sentinel)和集群(Cluster)机制的基础。其中,和。本文将带你深入理解这两种同步机制的工作原理、触发时机、底层实现细节,以及它们在实际应用中的优缺点和注意事项。
2025-07-15 12:37:57
1022
原创 Redis的持久化RDB、AOF 精讲
是 Redis 提供的另一种持久化方式。与 RDB 不同,AOF 持久化记录的是客户端对数据库执行的所有写操作命令(如。
2025-07-12 21:39:08
1145
原创 如何使用BitMap实现签到功能
实际不是一个独立的数据类型,而是基于String类型实现的。它主要用于存储二值状态(即集合元素的取值只有0和1两种)。由于每个位只能表示两种状态,在需要快速进行大量数据的排序、查找、去重等操作时具有显著优势。
2025-07-11 16:43:41
531
原创 点赞功能实现!(史上最全,可以用在生产环境)
我在刷小红书的时候偶然看到一篇自己喜欢的文章,我毫不吝啬的给他点了个赞,在红心在屏幕上亮起来的时候,我的注意力被红星从文章中拉了出来。我带着我的疑问来到CSDN中试图找到一篇可以清楚讲解实现原理的文章。很显然上面那种操作根本不能使用到线上业务中,性能低的同时还会出现线程安全问题。所以我看完这些文章后心血来潮,自己思考了一种。也许方案中可能会出现不合理的,或者有问题的地方,我。
2025-06-06 19:47:19
472
原创 Redis有哪些方式可以实现消息队列?(List、PubSub、Stream)
消费者可以订阅一个或者多个channel,生产者向channel发送消息后,所有订阅者都能收到相关消息。可以支持数据持久化(因为他本质上就是一个结构,而Redis 有RDB快照 和AOF持久化机制)PubSub 是Redis 2.0时引入的发布订阅消息模型。Stream 是 Redis 5.0 引入的。2.PubSub(发布订阅)的消息队列。1.Redis提供哪些类型的消息队列。order.queue 队列。1.基于List的消息队列。order.queue队列。order.* (通配符)
2025-06-05 20:01:06
259
原创 Redisson 分布式锁流程及原理(精简小白可看)
在分布式系统中,多个服务节点可能同时访问共享资源,为了避免并发操作导致的数据不一致问题,分布式锁成为保障数据安全的重要手段之一。Redis 凭借其高性能和简单的数据结构,被广泛用于实现分布式锁。本文将深入探讨如何使用 Redis 实现一个可重入、支持自动续期、具备重试机制的分布式锁,并结合 Redisson 的实现思想进行分析和优化。RedLock算法是为了解决分布式系统中,特别是在多个独立(主)节点的Redis环境里实现分布式锁时面临的问题。
2025-06-05 18:13:02
955
原创 快速入门Redisson分布式锁 及其实现原理(详细版)
你住在一个有大门的小区里,你家在3栋2单元501。刷卡进小区大门(相当于获取一次锁)刷卡开门进自己家(相当于再次获取同一个锁)
2025-06-04 17:49:20
1505
原创 如何使用Redis+Lua实现分布式互斥锁
在判断锁是否是当前线程的锁和释放锁过程中不是原子性的,如果出现线程A判断当前锁是自己加的锁 成功后 A线程发生了阻塞,锁的过期时间到了之后自动释放锁,B线程获取到锁时,A线程又苏醒了 释放掉B的锁,这个过程是线程不安全的。因为Redis是单线程的,所有命令都是原子性操作,执行过程中不会被其他命令打断,同一时刻只允许执行一条命令,组合操作可以依赖Lua脚本进行执行,因为Lua脚本被Redis 视为一个整体,这个整体的执行也具有原子性。
2025-06-03 18:51:08
293
原创 Redis 自定义序列化器,自动将Json转为Java对象
自定义序列化器可以将我们想要存储的Key 和 Value 设置为我们想要的类型,例如我们可以把key设置为String类型 把值设置为Json类型,这样我们使用RedisTemplate客户端就可以不使用显示将对象转为Json再存储,反之取出value也能够 直接使用强制转换类型将Json转为Java对象。
2025-06-02 17:52:41
436
原创 Java多线程(上)
进程我们可以理解为一个应用程序,比如我们启动了一个Java程序,那么这个程序就可以称为一个进程,系统中有若干个程序,这些都可以称为一个进程而每一个进程都可以包含多个线程,例如我们启动执行Main方法,会启动一个JVM进程,进程中包含两个线程 一个main线程 还有一个GC线程。
2025-06-01 16:43:53
318
原创 一篇文章带你深入理解Volatile
在Java中,volatile是一个关键字,用于修饰成员变量和静态成员变量,但不能用来修饰局部变量和方法参数。可以理解为简单版的Synchronized,可以解决多个线程中共享属性不可见的问题,且能够解决指令重排。关于什么是可见性和指令重排会在后面解释当我们一个共享资源没有使用Synchronizad 关键字修饰时 ,就不会有第1步Lock和第8步Unlock的过程,也就是这个共享资源会被多个线程读取到📌 场景说明例如:共享属性Flag=trueA线程将Flag读取并加载到自己的工作内存中。
2025-05-30 00:44:05
811
原创 ForkJoinPool用法及原理
ForkJoinPool是Java中一种特殊线程池,适用于"分治法"策略的任务。它能将大任务拆分为小任务并行处理,采用工作窃取算法提高资源利用率,特别适合CPU密集型任务如排序、求和等。与普通线程池不同,ForkJoinPool每个线程有自己的双端队列,任务从队列尾部获取,窃取时从头部获取。使用时需继承RecursiveTask(有返回值)或RecursiveAction(无返回值),任务完成后需要关闭线程池。其优势包括高效并行处理、减少上下文切换,但不适用于IO密集型业务。
2025-05-27 17:33:22
1009
原创 ThreadPool线程池(三大方法、7大参数、4大拒绝策略)池化技术讲解
ThreadPool线程池(三大方法、7大参数、4大拒绝策略)池化技术讲解
2025-05-25 17:32:15
708
原创 redis+lua脚本实现秒杀扣减优惠卷库存 & SpringBoot环境+SpringDataRedis客户端
我在CSDN中 翻了一圈 没有发现写使用RedisTaplate客户端来解决库存超卖的,大多数是使用Redison和各种分布式锁,那么由我来写一篇连小白都能使用的Redis+Lua脚本解决超卖的教程,欢迎大家白嫖。
2025-04-28 17:27:56
619
原创 Redis序列化
在我们不做任何配置的时候,使用SpringDataTemplate往redis中存储任何数据都是经过序列化的,序列化出来的数据易懂性不高且占用空间大,这个时候我们就需要对原有的序列化方式进行修改。我们存入一个Key为"name" value值为"李四"的值。<version></version>标签。从redis图形客户端里我们看到的是。这个时候我们就需要进行自定义序列化类。版本过高时Jackson依赖一定要写。如果运行出现异常则查看依赖。
2023-09-23 19:02:45
248
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅