自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(385)
  • 收藏
  • 关注

原创 11.langchain4j + rag + tools +MCP

注意:不建议用java编写MCP server, java调用mcp server还可以。编写MCP Server使用python和node。如果即用mcp又要用tool 就需要手动指定,不然不生效,如果只用tool 就可以使用注解方式,不然只能用编程式。controller有变化。其他代码基本上没啥变化。

2025-12-12 22:56:57 45

原创 10.阿里云百联平台模型下的完整demo

2.下预约单需要用户提供考生姓名、考生性别、考生电话、考生预约沟通时间(日期+时间)、考生所在省份、考生预估分数,当用户表达出需要预约志愿指导服务的意愿后,你不能自己模拟这些数据下预约单,而是需要以委婉的方式引导用户提供考生姓名、考生性别、考生电话、考生预约沟通时间(日期+时间)、考生所在省份、考生预估分数,这些信息必须是用户全部提供,不能有模拟数据,否则不要下预约单。3.一旦预约成功,最后不要再跟上面第1条指定的话术,而是更改为:恭喜您,一对一志愿指导服务已经预约成功,我们会准时联系您,请注意接听电话!

2025-12-09 23:24:34 97

原创 9.Tools工具使用

工具调用是“引擎”,MCP是“整车设计规范”。工具调用 和 MCP不是同一个东西。

2025-12-06 11:11:10 20

原创 8.RAG知识库核心API

把磁盘和网络中的数据加载到程序。langchain4j提供的文档加载器:1.FileSystemDocumentLoader, 根据本地磁盘绝对路径加载。2.ClassPathDocumentLoader, 相对于类路径加载。3.UrlDocumentLoader,根据url路径加载。

2025-12-04 22:39:33 45

原创 7.RAG知识库

用户提交文本消息query,通过向量模型embedding model转化为向量query embedding,再将该向量与向量数据库embedding store中存在的向量进行比对计算他们之间的余弦相似度,将满足要求的向量筛选出来得到对应的文本片段relavant segments, 最后将用户的消息query + 对应的文本片段relevant segments 去调用大模型。一般大模型训练的数据都是通用的数据,一般专业领域的专业知识,大模型是不知道的。的方式增强大模型的生成能力。

2025-12-01 21:32:56 40

原创 idea2024版使用说明

2025-11-30 11:05:19 73

原创 markdown文件typora软件破解

将TyproaCrack.exe 和 license-gen.exe拷贝到安装目录。cmd到该目录,执行如下的命令,最终生成序列号。

2025-11-30 10:48:56 123

原创 6.会话功能-会话记忆

多轮对话1.定义会话记忆对象第一个问题的答案会跟第二个问题一起传给大模型。MessageWindowChatMemory 是ChatMemory接口的实现类2.配置会话记忆对象。

2025-11-29 23:05:31 14

原创 5.会话功能-消息注解

2.系统消息如果内容过多,还可以放到文件中去 resources/system.txt。"content" : "你是东哥的助手小美,人美心善又多金!1.添加注解@SystemMessage 设置系统消息。如果不使用固定参数{{it}}的方法,需要使用注解。"content" : "你是谁?{{it}} 是固定的,不能随意修改。@UserMessage注解用户消息。

2025-11-28 23:13:40 36

原创 4.会话功能流式调用

3.修改接口AiService接口声明。4.controller修改。--流式调用依赖-->

2025-11-27 22:41:26 48

原创 3.会话功能-AiServices工具类

- Ai Service相关的依赖 -->

2025-11-26 23:32:54 44

原创 2.LangChain4j+springboot+大模型整合

代码调用大模型的方式有两种:2.SpringAI引入maven依赖这个版本对应的jdk17+

2025-11-25 22:53:32 136

原创 1.大模型使用

1.自己部署云服务器部署优点:前期成本低,维护简单。缺点:数据不安全,长期使用成本高。本地部署优点:数据安全,长期成本低。缺点:初期成本高,维护困难。2.他人部署(API接口调用并使用)无需部署,直接使用,数据不安全,长期成本高。第三方平台已经部署好了,直接调用接口使用即可,按流量收费。

2025-11-24 22:35:32 715

原创 39.用户签到功能

BitMap数据在客户端工具中展示要注意版本,选择对应的数据类型,否则无法正确展示,可能是乱码。2021版本没有,2020版本有,2022版本有。u1 u表示无符号,1表示取一位,0表示从那个位置开始取。返回值为十进制的值。布隆过滤器就是用BitMap位图来实现的。采用BitMap位图数据结构。用1表示签到,0表示未签到。用户签到信息表结构设计。占用的内存空间特别小。

2025-11-19 22:49:49 175

原创 38.附近商户实现

score存的是店铺经纬度坐标。这里的值可以代表和转化为真正的经纬度。获取北京南到北京西的距离,默认单位为米,指定单位km为千米。key 存入店铺类型type id,将同类型的数据放到一起。geo数据结构geolocation,地理坐标。返回北京站坐标的hash值。value存入店铺的id.向redis中添加数据。根据经纬度检索数据。

2025-11-13 22:34:10 171

原创 37.关注推送

注意:当socre值一样的时候,第二页查询的偏移量不能是1了,而应该是上一页中socre的最小值的个数。比如上一页的score的最小值为6,score在第一页查询集合中有两个,那么偏移量就为2。max:分数的最大值,第一次给一个特别大的值,比score的最大值大即可。所以数据会经常更新变化,就是用滚动查询,那么就需要用到sortedset 结构,可以根据score排序,然后从score的最小值开始滚动查询。2.推模式,写的压力比较大。对于普通粉丝,采用拉的方式,通过读取用户的收件箱,读的压力就比较大。

2025-11-09 21:21:42 293

原创 36.共同关注

利用redis中set集合的sinter命令取两个集合的交集。求指定用户与当前登录用户共同关注的用户,求交集。

2025-11-04 23:05:23 164

原创 35.好友关注功能

2.判断是否关注的接口。

2025-11-01 22:33:19 153

原创 34.点赞排行榜SortedSet

选择SortedSet集合,保证元素唯一,又能满足排序需求。zrange命令 用来查一个范围内的数据,默认是排序的。zscore命令可以获取到元素的分数值。zadd命令添加元素和元素对应的分数。

2025-11-01 21:31:19 208

原创 33.点赞功能

需求:1.同一个用户只能点赞一次,再次点赞则取消点赞。2.如果当前用户已经点赞,则点赞按钮高亮显示(前端实现,只需要根据Blog类中的isLike属性表示是否点赞过了)

2025-10-31 23:44:07 223

原创 32.图片上传功能

mybatis中使用query()方法分页查询的写法。mybatis中update()方法使用。注意lambda简写。

2025-10-31 22:45:55 160

原创 31.stream数据类型应用

2.将之前秒杀业务中lua脚本调整,在判断抢购资格后,直接向stream.orders中添加消息,内容包括voucherId、userId、orderId。1.创建一个stream类型的消息队列,名为streams.orders。通过命令创建,因为队列一开始就创建好,后续也不会再去重复创建了。3.项目启动时,开启一个线程任务,尝试获取stream.orders队列中的消息,完成下单。streams.orders为队列名称。streams.orders队列名称。block 2000 阻塞等待2s。

2025-10-23 22:35:46 177

原创 30.redis消息队列

消息队列message queue,就是存放消息的队列。:存储和管理消息,也叫做消息代理Message Broker:发送消息到消息队列。:从消息队列中获取消息并处理消息。redis消息队列是在jvm以外的一个服务,就不受jvm内存的限制,存入消息队列的消息会做持久化,这样服务无论是宕机还是重启消息都不会丢失,而且消息投递给消费者以后,要求消费者做消息的确认,如果没有确认,那么消息依然会存在于消息队列中。下一次会再次投递给消费者,确保了消息至少被消费一次。:基于list结构模拟消息队列。

2025-10-22 22:50:28 693

原创 29.优化秒杀业务

如果让两个人来干活,效率就提升了,一个负责判断秒杀库存是否充足和检验一人一单两个操作,另一个人负责耗时较久的减库存和创建订单两个操作。减轻了数据库的压力。1.阻塞队列使用的是jvm的内存,如果不加以限制在高并发的情况下,可能就有无数的订单对象放入到阻塞队列,可能会导致内存溢出。3.阻塞队列中的任务正常被取出了,另一个线程执行的时候发生了异常,那这个任务已经从阻塞队列中取出,但是这个任务并没有正确消费。从流程图可以看出,每步操作都是串行执行的,而且很多操作都是要操作数据库的,操作数据库本身就比较耗时。

2025-10-19 21:49:34 333

原创 28.redisson源码分析分布式锁

waitTime表示获取锁的最大等待时长,在第一次获取锁失败后不会立即返回,而是在等待时间内不断的去尝试获取锁。如果超过最大等待时长都没有成功获取到锁就会返回false。所以传入waitTime的值就变成了一个可重试的锁了。leaseTime表示锁自动失效,释放锁的一个时间。不传值,默认值为-1。unit是时间单位。

2025-10-18 17:10:44 998

原创 27.Redisson基本使用和可重入性

1.锁不可重入同一个线程无法多次获取同一把锁。2.不可重试上一篇中实现的分布式锁是非阻塞式的,如果获取锁失败就立刻返回获取锁失败,不会重试获取锁。没有重试机制。3.锁超时释放虽然锁超时释放可以避免死锁,但如果是业务本身执行耗时较长,也会导致锁释放,存在安全隐患。4.主从一致如果redis是主从集群的,主从同步存在延迟,当主宕机时还没来得及方锁数据同步给从节点,那么其他线程就获取到了锁,造成线程安全问题。

2025-10-16 22:26:30 364

原创 1.jemeter使用

Ramp0up period:0 表示JMeter会瞬间同时创建并启动这100个线程。这就像100个人在同一秒内冲向一扇小门,会对服务器造成一个瞬间的、巨大的冲击。这种“暴力”测试虽然能测试出系统的极限,但可能不符合真实的用户场景。每个线程执行一次测试计划后退出。JMeter将在100秒内启动这10个线程。表示开启了200个线程。

2025-10-12 09:15:25 174

原创 56.Redis哨兵机制

slave节点宕机后恢复,可以从master节点同步数据。master节点宕机了,这个时候支持读操作,不支持写操作。那么集群的可用性就下降了。如下:监控集群中节点的状态,当发现master节点宕机那一刻,立即选一个新的slave节点作为master。宕机的master将来恢复后,让它当slave节点。

2025-08-25 22:27:16 40

原创 55.Redis搭建主从架构

单节点redis的并发能力是有上限的。要进一步提高redis的并发能力,就需要搭建主从集群,实现读写分离。redis业务当中大多数都是读多写少的场景。所以更多的是应对读的压力。1.现将redis开启RDB,关闭AOF。2.将redis-6.4.2/redis.conf文件拷贝到三个目录中3.将三个配置文件中的端口号分别改成7001,7002,7003 目录改成/tem/7001/, /tem/7002/,/tem/7003/

2025-08-23 20:53:21 90

原创 54.Redis持久化-AOF

RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。同时启用RDB和AOF同时开启,AOF优先级更高。因为AOF数据更完整,RDB起到一个备份的作用。因为是记录命令,AOF文件会比RDB文件大的多,而AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。Redis处理的每一个写命令都会记录在AOF文件文件中。AOF默认是关闭的,需要修改配置文件redis.conf来开启。命令,可以让AOF文件执行重写功能,用最少得命令达到相同效果。

2025-08-23 17:47:56 57

原创 53.Redis持久化-RDB

Redis是基于内存存储。Redis基于内存,单节点并发能力不错,但是还是无法满足618这种高并发场景。Redis单节点一旦宕机,则服务不可用,需要一种自动的故障恢复手段。Redis是基于内存存储,存储能力有限的,肯定不如磁盘存储的数据多。

2025-08-23 17:03:22 61

原创 52.Seata-Saga模式

Saga模式是Seata提供的长事务解决方案,分为两个阶段:1.一阶段直接提交事务。2.二阶段,成功则什么都不做,失败则通过编写补偿业务来回滚。

2025-08-23 10:59:40 81

原创 51.Seata-TCC模式

前面两种XA模式和TA模式,都是用了加锁。TCC模式则不会加锁,性能更好。TCC模式跟,一阶段都是独立的事务,操作完直接提交,无需加锁。TCC通过人工编码来实现数据恢复。

2025-08-22 23:48:38 397

原创 50.Seata-AT模式

AT模式同样是分阶段提交的事务模型。优势是。没有代码入侵,框架自动完成快照生成、回滚和提交。实现非常简单。两阶段之间属于软状态,属于最终一致。

2025-08-20 23:43:06 362

原创 49.Seata-XA模式

为准备阶段,进行操作,告知事务协调者执行是否执行成功,事务不提交。

2025-08-20 20:08:44 917

原创 48.Seata认识、部署TC服务、微服务集成

有对应的文档和博客。

2025-08-17 22:53:39 154

原创 46.Sentinel规则持久化

微服务一般都是要做集群的,一个微服务将配置刚更新到数据库,其他微服务没有及时的去读取已经更新过后的配置,因为是定时读取。③修改sentinel-dashboard源码的pom文件,nacos的依赖默认scope是test,只能在测试时候使用,这里要去除。控制台将配置规则推送的sentinel客户端,而客户端会将配置规则保存在本地文件或者数据库中。1.原始模式:Sentinel的默认模式,将规则保存在内存,重启微服务会丢失。4.在Sentinel控制台会多出带-NACOS的菜单,进行各种规则配置。

2025-08-15 22:42:29 759

原创 47.分布式事务理论

所有的事务都必须满足:事务中的所有操作,要么全部成功,要么全部失败。:要保证数据库内部完整性约束、声明性约束。:对数据库做的一切修改将永久保存,不管是否出现故障。:对同一资源操作的事务不能同时发生。

2025-08-15 22:40:01 83

原创 45.sentinel自定义异常

默认情况下,发生限流、降级、授权拦截时,都会抛出异常到调用方。上文提到Blocked by Sentinel(flow limits) 限流异常,这样返给用户就不太友好,所以需要自定义异常。

2025-07-21 22:56:40 166

原创 44.sentinel授权规则

但是如果具体某个微服务的访问地址直接透露给了外部,不是经过网关访问过来的。给允许访问的服务添加头信息,从而允许访问。- name: JwtHeaderFilter # 自定义过滤器(添加请求头,将X-Auth-Token赋值给Authorization)- AddRequestHeader=origin,gateway # 添加名为origin的请求头,值为gateway。# 服务路由,负载均衡,分发用户请求到微服务,一个微服务可以有多个实例,所以需要负载均衡。# 网关过滤器,对所有的路由请求都生效。

2025-07-20 23:17:02 247

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除