- 博客(31)
- 收藏
- 关注
原创 大模型springai,Rag,redis-stack向量数据库存储
启动时会从github上拉取这个文件,直接下载到本地,就不用拉取了。文本读取器TextReader读取划分为Documents对象。resource是springai提供的一个读取文件的内容的。采用自定义的文本分割器按自己定义的划分流程来划分文档。1.利用docker搭建redis-stack。redisVectorStore来存入数据库。4.自定义文档解析器,自定义如何解析文档。5.controller仅为参考。配置redis连接。
2025-12-04 23:45:08
347
原创 SSE服务搭建
SSE(Server-Sent Events,服务器发送事件)是一种基于 HTTP 的服务器向客户端单向推送实时数据的技术,它允许服务器主动向客户端发送事件流,适用于实时通知、数据更新等场景。定义枚举类型,代表SSE返回的消息类型。首先了解什么SSE服务?
2025-12-04 11:43:44
198
原创 Juc-自旋优化
重量级锁竞争的时候,还可以使用自旋锁来进行优化,如果当前线程自旋成功(即这时候持锁线程已经退出了同步块,释放了锁),这时当前线程就可以避免阻塞。
2025-10-20 17:32:41
114
原创 Juc-轻量级锁
Lock Record对象中记录的,Object reference中指向锁对象,并尝试用cas替换Object的Mark Word,将Mark Word的值存入锁记录,当进入synchronized的代码块的时候,会创建锁记录对象LockRecord,每个线程的栈帧都会包含一个锁记录的结构,内部可以存储锁定对象的Mark Word。里面记录的是null,从锁记录的个数表示对这个对象加了几次锁,解锁的时候也用的到。这次交换肯定失败了, 对象中锁记录的地址指向的是栈帧中的之前的,cas失败的两种情况。
2025-10-20 16:55:10
339
原创 synchronized底层-Monitor概念
其他线程进来会查看对象有没有关联一个monitor呢,有monitor对象中只有一个主人,该线程也会和该monitor对象关联,会和monitor中的EntryList,这个阻塞队列关联,进入了一种BLOCKED阻塞状态。线程执行了synchronized代码块会找一个monitor与对象关联,找到之后会把Mark Word中的01改为10,并且前面的东西也不要了,变成了一个指向monitor对象的指针,占用30位,加上10还是32位。对象是如何知道是哪个类型的呢 KlassWord代表类对象。
2025-10-20 15:36:59
182
原创 JUC-线程运行的原理
当运行一个java程序的时候,会把该类的字节码文件加载到内存中,放到方法区,java虚拟机会开启一个main主线程,并且给主线程分配一块线程栈内存,线程交给任务调度器调度执行,主线程的入口是main方法,会给main方法分配栈帧内存,每一个栈帧内存中都有局部变量表,参数,返回地址,锁记录,操作数栈,方法带参数,会把栈内存的参数,虚拟机创建一个对象放入堆中,把引用给了方法参数。其实就是线程,每个线程启动后,虚拟机就会为其分配一块栈内存。每个线程都会有线程栈内存,都会有一个程序计数器,会记录代码执行到了哪里。
2025-10-13 18:18:31
156
原创 天机学堂day11aop实现分布式锁添加获取锁失败逻辑
我们可以定义一个枚举类记录五种方式,在枚举类中定义一个抽象方法,五种方式分别实现对应的方法,代码如下。在自定义的tryLock注解中加入枚举类,通过注解参数明白到底用哪个策略。因为异常已经在策略中抛出了,最终返回的都是快速结束的直接结束就可以了。通过以上图片总结出了一共有五种分布式锁失败的策略。还有一个优化EnumMap的使用,效率高。
2025-10-07 22:32:21
183
原创 天机学堂day11aop方式实现分布式锁的代码优化
我们可以用一个map集合来,key作为枚举类型,value为一个函数,只要为他传入一个参数name就可以直接调用返回锁。在之前的代码中,我们只能获取可重入锁,但是在其他业务中我们还需要其他类型的锁。所以我们优化的一点就是在注解中加一个枚举类,来记录到底使用哪种锁。我们的增强代码也需要改造。
2025-10-03 21:10:24
170
原创 天机学堂day11基于aop实现分布式锁的获取与删除
注解的执行顺序是我们要考虑的,我们要防止事务失效,先获取锁在开启事务,所以要实现ordered接口,然后实现getOrder()方法,值越小越先执行就可以啦、获取锁在业务前面,释放锁在业务后面,我们可以想到用aop环绕增强来实现。切入点是带有mylock注解的方法,增强方法参数中获取注解中传入的参数。每次都得写锁的获取与释放,我们看下面业务逻辑。在其他业务也可能用到分布式锁。来自黑马程序员的天机学堂。
2025-10-03 20:12:56
142
原创 天机学堂day10高并发,超卖,一人多买,锁失效,事务失效 -part2
乐观锁显然不合适了,所以我们选用悲观锁,假如把synchronized加到方法上,其实我们锁的粒度太大了,锁的是全部用户,其实只要限制一个用户就行,所以我们可以用代码块,把用户的id作为锁,不同用户也锁不住。一个用户如果使用多个线程来并发访问,先查出一个人买了多少,如果多个线程查出了相同值,就会导致多买。用乐观锁,在更新的时候加一个条件判断数据库此时的库存是否等于之前查出来的库存。我们此时遇到的是非事务方法调用本类中的事务方法。先查后改,就会导致超卖问题。首先导入aspectj依赖。
2025-10-03 14:37:34
248
原创 天机学堂day10领取优惠劵-part1
4.查到之后,我们在后面封装vo的时候是对每一个优惠卷进行封装返回,所以我们可以通过stream流的方式,得到一个map集合,以优惠劵id作为key,用户与优惠劵的信息作为值,就是以优惠劵id作为分组,这样拿到的就是每一张该用户已领取的优惠劵,对应的该用户领取的信息,具体领取了几张呢,就放到一个集合中,我们要得到的是用户到底有没有超过领取限制,所以我们可以使用counting来统计每一个优惠劵用户领取了几张,也就得到了每一个优惠卷,对应每一个用户领取的数量。首先我们要从优惠劵表中查询已经发放的优惠劵。
2025-10-02 15:30:41
137
原创 天机学堂day8排行榜
但是我们考虑到我们的服务以后部署是集群模式的,定时任务会导致频繁执行,因为此定时任务是每个服务内部的,所以我们要选用xxljob在外部管理定时任务。首先考虑垂直分表,看看能不能将频繁写的字段分开,避免影响,如果不行考虑搭建主从集群,读写分离。用户id,分数,用户id,在redis利用zset存储的,所以id就是从大到小有序的。如果单个库的压力太大,再考虑分库,水平分库结合分表,实现数据分片。随着用户量的增加,数据库的存储压力变大,考虑到分区。1.如何在插入的时候,指定修改的表。数据库的读写压力大怎么办。
2025-09-28 17:07:01
240
原创 day06天机学堂点赞系统优化
这是以前的方案对于点赞业务,写的操作太多了,对数据库压力比较大每次点赞的数量变更,都要通过mq发消息,更改回答业务的点赞数量优化方案1.可以把点赞的具体业务id和用户id缓存到redis,采用redis的set数据结构,可以检验记录是否存在,不存在则增加,或者取消点赞则删除记录。2.如果新增或者删除成功,意味着点赞数量变化了,因为之前要频繁修改数据库,我们也可以缓存到redis中。3.最终要实现数据落库,我们可以用一个定时任务,定期处理redis中的点赞数量,因为是不同业务,我们可以配置热更新,把业务的类型
2025-09-24 15:38:01
237
原创 天机学堂处理高并发业务,day4保姆级
如果在第一次学完的时候把数据库的finished字段改为true,但是redis中的字段还是false,会导致,下一次重复小节数量加1,所以也要更新缓存,但是如果是更新缓存,在有错误的时候,触发了回滚,finished本来改为了true,回滚为false,但是redis中回滚不了,又会导致数据不一致,所以要清理redis缓存,即使回滚redis数据也被删除了,不会导致数据不一致性。如果使用第一种,可以保证数据一致性,那么我们的业务仅仅是简单的更新学习记录的时间不涉及到复杂的业务,所以我们选择第二种方式。
2025-09-19 12:32:06
734
原创 StringBuilder类
字符串缓冲区,可以提高字符串的操作效率(看成一个长度可以变化的字符串)StringBuilder在内存中始终是一个数组,占用空间少,效率高。字符串的底层是一个被final修饰的数组,不能改变,是一个常量。"ab"+"c" "abc"一个字符串。底层也是一个数组,但是没有被final修饰,可以改变长度。"a"+"b" "ab"一个字符串。进行字符串的相加,内存中就会有多个字符串,占用空间多,效率低下。String s "a","b","c"三个字符串。字符串是常量,他们否值在创建之后黁修改。
2025-02-14 17:27:46
203
原创 Object类(无需导包)
java.lang.Object类是java语言中的根类,既所有类的父类。他中描述的所有方法子类都可以使用。在对象实例化的时候,最终找的父类就是Object。比较两个对象是否相同但是加了一些判断。重写之前:打印的是包名类名@地址值。重写之后:打印的是对象中的属性值。重写后:比较的是对象中的属性值。该类提供了一些非常常用的方法。重写前:比较对象的地址值。1.equals()方法。1.object类介绍。作用:打印对象的信息。3.equals方法。二,Objects类。
2025-02-09 22:01:09
233
原创 String类和StringBuilder类的方法和区别
indexOf(),lastIndexOf() 如果String并不包含此参数,就返回-1,否则就返回参数在String中的起始索引。concat() 返回一个新的String对象,内容为原始String连接上参数string。equals(),equalsIgnoreCase() 比较两个String的内容是否相等。substring() 参数:起始索引+终点索引(不包括),返回一个新String。replace() 参数:要替换掉的字符,用来进行替换的新字符。String类的方法。
2025-01-19 22:00:43
882
原创 蓝桥杯分巧克力
例如一块 6×56×5 的巧克力可以切出 66 块 2×22×2 的巧克力或者 22 块 3×33×3 的巧克力。以下 N 行每行包含两个整数 Hi,WiHi,Wi (1≤Hi,Wi≤1051≤Hi,Wi≤105)。小明一共有 NN 块巧克力,其中第 ii 块是 Hi×WiHi×Wi 的方格组成的长方形。当然小朋友们都希望得到的巧克力尽可能大,你能帮小明计算出最大的边长是多少么?第一行包含两个整数 N,KN,K (1≤N,K≤1051≤N,K≤105)。输出切出的正方形巧克力最大可能的边长。
2025-01-18 21:41:28
359
原创 蓝桥杯k倍区间问题
给定一个长度为 N 的数列,A1,A2,⋯AN,如果其中一段连续的子序列 Ai,Ai+1,⋯AjAi, ( i≤j) 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。你能求出数列中总共有多少个 K 倍区间吗?
2025-01-17 19:57:14
574
原创 蓝桥杯回文字符串
小蓝最近迷上了回文字符串,他有一个只包含小写字母的字符串 S,小蓝可以往字符串 S 的开头处加入任意数目个指定字符: l、q、b(ASCIIASCII 码分别为: 108、113、98)。若遇到需要添加的,从最后开始找的时候必须是与l,q,d相等的字符才可以、若遇到不是l,q,d其中的并且也不等于left所指向的就返回一个false。输出 TT行,每行包含一个字符串,依次表示每组数据的答案。输入的第一行包含一个整数 T,表示每次输入包含 T 组数据。每组数据一行包含一个字符串 SS。
2025-01-16 14:45:32
410
原创 蓝桥杯“好数”题目
一个整数如果按从低位到高位的顺序,奇数位 (个位、百位、万位 ⋯⋯ ) 上的数字是奇数,偶数位 (十位、千位、十万位 ⋯⋯ ) 上的数字是偶数,我们就称之为 “好数”。算法核心:这个算法的核心是通过奇数位数和偶数位数的和是否等于总位数,如果等于总位数,那么这个数就是好数。给定一个正整数 N,请计算从 1 到 N 一共有多少个好数。N可以取1到10的7次。
2025-01-15 12:12:33
331
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅