- 博客(55)
- 收藏
- 关注
原创 OpenAi库的基础使用
messages:提供给模型的消息,是一个list,list中的元素是字典,role代表角色,content是消息内容。可以通过response.choices[0].message.content拿到此次结果。assistant:表示ai的回答,可以人为设定,不是强制ai的回答,而是为其提供上下文。system:表示系统消息,一般用于设置ai的整体行为,人设和规则等,影响全局。首先引入open ai的包,然后创建OpenAi类的实例client,model :使用的ai模型。
2026-03-09 14:51:54
84
原创 Fast Api (二) 路径参数、查询参数、请求体
param: type|None = None ,此参数可传可不传。name的值将作为参数传递给test函数。声明请求体使用Pydantic。如果不传将设置为默认值。
2026-03-06 16:02:57
48
原创 Fast Api(一)Python类型介绍
声明长度为3的元组,第一个元素为int类型,第二个元素为str,第三个是bool。可以声明一个形参有多种类型,如下声明 i 可能为int,str或None。可以对函数形参进行类型声明。
2026-03-05 16:32:39
42
原创 遇到的死锁问题
把 bm_item_group 的查询条件收到子查询里,子查询作为派生表,派生表在 MySQL 中是快照读,不持有行锁,所以主语句只对 bm_item 加写锁,彻底断掉了和 bm_item_group 写锁互等的死锁链路。某事务正在 UPDATE bm_item_group SET shelflife=... WHERE group_no=?bm_item 如果有触发器/外键回写 bm_item_group,UPDATE bm_item 时反向锁 bm_item_group,与 JOIN 方向形成环。
2026-03-04 17:56:52
240
原创 安卓端如何获取在pc端界面自定义中添加的栏位?
由于仓管员这个栏位是在搜索条件中显示,所以需要获取对应的字段list以及适配器,判断list中是否有字段名为standardCol02的字段,有就通过SharePreferenceCommon.getUserInfo()获取当前登陆用户,将其name赋值给仓管员栏位,最后通知对应的适配器更新ui。所以我们可以在doBusiness()方法中,调用这个方法,用于界面初始化的时候给自定义字段的栏位赋值。如下:需要将自定义的仓管员栏位的值赋值为当前登陆用户。
2025-12-19 14:31:50
219
原创 Spring中的@Autowired和@Bean有什么区别?
Bean是用于注册bean的,@Component是用于注册我们自己定义的bean,将自定义的bean注册到spring容器中,而对于Maven导入的一些第三方jar包要注册到spring中就需要使用@Bean注解了,@Bean注解用于方法上,在这个方法中我们产生对象,这个对象就会注册到容器中。在方法上使用是setter注入;在构造器上使用是构造注入。@Autowired按照类型注入bean,如果spring容器中不存在此类型的bean,会报错,可以搭配@Qulifier来按照name注入bean。
2025-08-12 15:13:49
546
原创 Java工厂模式
工厂模式用于创建对象,将对象的创建和使用分开,创建对象的时候不再去new,而是使用工厂来创建对象,提高了代码的可维护性,可扩展性和灵活性。工厂模式分为简单工厂模式、工厂方法模式和抽象工厂模式。
2025-08-12 11:23:32
256
原创 JVM、JRE、JDK的区别
JVM全称Java虚拟机(Java Virtual Machine, JVM),它是运行java字节码的虚拟机,JVM针对不同的系统有不同的实现,目的运行相同的字节码有同样的结果,JVM是“一次编译,到处运行”实现的关键。如下不同的编程语言编译生成字节码文件,通过JVM在不同的操作系统上运行。
2025-05-09 10:21:49
535
原创 SpringBoot的自动装配原理
继续进入@EnableAutoConfiguration,发现有个@Import注解,它引入了一个核心类,可以去将META/INF/spring.factories文件中所有的全路径类名的类加载到spring容器中。进入@AutoConfigurationPackage注解,里面也是引入了一个核心类,可以将spirngboot启动类目录及其子目录下的所有bean加载到spring容器中。进入这个注解,里面有@EnableAutoConfiguration,这个注解表示开启springboot自动装配。
2025-03-29 16:52:49
409
原创 Mysql中各种连接的区别
left join会返回左表的数据,以及右表匹配的数据,不匹配的数据会显示为null。内连接:通过inner join连接两个表,返回两个表中的匹配的数据,不匹配的不显示。right join右表的所有数据,以及左边匹配的数据,不匹配的数据显示为null。外连接:主要分为左连接(left join)和右连接(right join)。
2025-03-24 18:32:08
332
原创 Mysql的锁
表级锁:锁住一整张表,针对非索引字段加的锁,sql没有用到索引就会使用全局锁,性能较低。行级锁:针对索引字段加的锁,会锁住一行记录,并发性能高。全局锁:锁住一整个库,让数据库处于只读状态,一般在数据备份时用到。当update、delete的时候没有命中唯一索引或者索引失效,会走全表扫描加上表锁,性能很低。
2025-03-23 11:16:55
348
原创 Spring事务的传播行为
Nested,如果存在外层事务则嵌套外层事务,不存在则新建一个事务。嵌套事务的意思是如果外层事务提交,嵌套事务也会提交;外层事务回滚,嵌套事务就会回滚;这种场景适用于允许部分失败的业务,比如一个订单中有多个商品,其中有个商品库存不足了,只需要回滚那个商品就行了,其余商品可以下单成功。Required是spring事务默认的传播行为,如果存在外层事务就会融入外层事务,如果没有则新建一个事务。spring的事务传播行为指在一个开启了事务的方法内,去调用了另一个方法,那么事务会怎么传播呢?
2025-03-21 11:24:40
388
原创 索引的设计原则
3.对于区分度越高的列,建立索引的效果越好。对于唯一的列,索引效果最佳;如果有多个重复值的列,索引效果不好。1.where、order by、group by后的字段,还有join时的连表条件的字段适合建立索引。4.区分度最高的列放在联合索引的最左侧,更频繁使用的列放在联合索引的左侧。2.不要给每个列单独建立索引,尽量使用联合索引。5.对于较长的索引列,可以使用前缀索引。6.单表的索引数最好不要超过5个。
2025-03-21 10:31:40
171
原创 受检异常和非受检异常
非受检异常指在编译时不强制我们去捕获或者抛出的异常,所有的RuntimeException都是非受检异常,比如NullPointerExcetion、IndexOutOfBoundsException。受检异常指在编译时需要我们强制去捕获或者抛出的异常,比如IOException、SQLExcetion。受检异常的好处就是在发生这些异常的时候,我们能及时去做一些相应的处理,比如发生SQLException的时候我们可以去通过try-catch去捕获,然后及时的关闭数据库连接池对象。
2025-03-20 14:14:02
575
原创 为什么重写了equals必须要重写hashCode?
hashcode方法用于获取对象的哈希码,一般用于快速找到对象在容器中的索引位置以及快速判断对象是否相等。比如说set集合,它其中的元素是唯一的,我们往set集合里put元素的时候,它会先去判断set中有没有元素和加入的元素的hashcode相等,如果没有就直接加入set,否则就用equals判断是否相等,不相等就加入set,否则就不加入。因为hashcode可能会发生哈希冲突,所以如果两个对象的hashcode相等,它们的equals不一定相等。
2025-03-19 20:54:44
209
原创 ==和equals的区别?
比如String类就重写了equals方法,它会先用==判断两个对象的内存地址是否相同,相同直接返回true,不相同再去判断字符串的内容是否相等,相等返回true,否则返回false。如果没有重写equals方法,会去调用Object类的equals,其实就是去用了==比较两个对象。equals是Object类的方法,所以所有的类都有equals方法。如果重写了equals方法,会按照重写的逻辑来判断对象是否相等。对于引用数据类型,比较的是它们的内存地址。对于基础数据类型,比较的是值是否相等。
2025-03-19 20:36:22
285
原创 String、StringBuffer、StringBuilder的区别
String是不可变的,这是因为String内部用于存储数据的char[]数组用了final关键字修饰,而且是private的,并且没有对外提供修改数组的方法。StringBuffer和StringBuilder是可变的,它们内部的char数组没有用final关键字修饰。StringBuffer中的方法都用了Synchronized修饰,也是线程安全的。String不可变,每次操作String都会生成新的对象,它的性能最低。由于String是不可变的,所以它是线程安全的。String适合操作少量的数据。
2025-03-19 20:28:48
271
原创 引用拷贝、浅拷贝和深拷贝
浅拷贝去拷贝对象时,会在堆上新建对象,对于基本数据类型的属性,会直接拷贝其值;而对于引用类型的属性,会拷贝它的引用地址。引用拷贝会去拷贝对象的引用,也就是对象的内存地址,不会在堆上新建对象。深拷贝会完整的拷贝对象,包括它的引用类型的属性。
2025-03-19 20:10:22
248
原创 线程池的核心参数
线程池帮助我们管理监控线程,通过重复利用线程,来防止频率创建和销毁线程带来的性能消耗。可以使用ThreadPoolExecutor或者Executors来创建线程。
2025-03-19 14:50:25
988
原创 一文了解ThreadLocal
ThreadLocal是每个线程私有的,线程可以把自己的私有数据放到ThreadLocal里面,不用担心其他线程访问到自己ThreadLocal。通过set()方法将值存入ThreadLocal或者修改值,get()方法取出值,remove()方法移除值。
2025-03-19 11:10:46
560
原创 ConcurrentHashMap实现原理
ConcurrentHashMap是线程安全的HashMap,他在jdk1.7和1.8中有不同的实现。
2025-03-16 16:34:18
338
原创 ReentrantLock的实现原理
AQS全称抽象队列同步器,是java中的一个抽象类,它提供了一个通用框架用于实现同步器。AQS中有一个state属性,默认为0,如果被某个线程修改为1了,那么这个线程就拿到了锁,可以去访问资源。多线程来抢锁的时候,使用CAS操作来修改state的值,没有修改成功的线程会加入AQS内部的一个双向队列中阻塞等待,当锁释放时,队头线程会被唤醒,尝试自旋抢锁,没抢到就阻塞。
2025-03-16 15:27:25
234
原创 一文了解CAS
CAS全程:Compare And Swap(比较并交换),是乐观锁思想的一种体现,能在无锁的情况下保证线程安全。Java中的CAS是由native方法实现的,底层通过硬件层面保证了CAS操作的原子性。CAS是如何保证线程安全的?如下:CAS操作会去比较工作内存中的旧值和内存中的预期值是否相等,相等才会将其改成新值。如下线程A来修改a,a旧值是100,去和主内存中的a比较,发现相等了,于是在工作内存进行a++操作并同步到主内存。
2025-03-15 20:25:44
461
原创 Java中的volatile关键字
volatile是一种轻量级的同步机制,它相比于synchronized这种重量级锁更轻量,因为它不会造成线程上下文的切换,但是同步性更差,volatile关键字可以保证变量的可见性以及禁止指令重排序。
2025-03-15 19:49:56
379
原创 一文了解JVM的垃圾回收
当进行垃圾回收的时候,会暂停所有线程去完成垃圾回收。Minor GC :发生在新生代的垃圾回收,当eden区满了会触发,暂停时间较短。Full GC:对新生代和老年代进行完整的垃圾回收,当老年代内存不足时会触发,暂停时间长,要尽量避免。
2025-03-13 21:04:32
2988
原创 Spring Aop的实现方式
aop是一种面向切面编程的思想,主要就是为了降低代码的耦合度,比如我们有很多方法都需要去记录日志,如果这些方法中都去写记录日志的代码,太冗余了,于是可以用面向切面编程的思想,去定义一个切面,去横向切入到需要记录日志的地方。
2025-03-11 19:27:00
227
原创 Spring Bean的生命周期
首先Spring会去扫描xml、注解,把所有的BeanDifinition对象注册到容器中,BeanDifinition对象主要包含了类的一些信息(类名、方法、构造器、属性等)。然后筛选出单例的BeanDifinition,通过反射去实例化bean,对于原型bean是当去使用它的时候再实例化。然后再调用bean的后置处理器的after方法,Spring Aop就是在这里实现的。spring bean的生命周期主要分为四个阶段:实例化、属性填充、初始化、使用和销毁。最后使用完bean并销毁。
2025-03-10 16:58:31
232
原创 线程的生命周期
等待:调用wait方法,进入等待状态,当调用notify方法时会唤醒线程,重新进入就绪状态。阻塞:线程抢锁失败,会阻塞,当获得锁会进入就绪状态,抢到cpu时间片进入运行状态。超时等待:调用sleep方法进入休眠,休眠多久可以设置,时间到了进入就绪状态。新建:当我们去new Thread的时候,线程就处于新建状态。运行:线程抢到了cpu时间片,执行run方法。就绪:调用了start方法,线程准备运行。终止:线程执行完run方法,终止变成垃圾。
2025-03-09 16:03:18
226
原创 创建线程的四种方式
在我们需要线程执行完任务有返回值的时候,可以去实现runnale接口,需要重写call方法,在call方法内线程去执行任务,执行完成后会有返回值。需要注意的是new Thread()不能传Callable的实现类,没有这个构造方法,需要用FutureTask包装一下,然后传FutureTask进去。
2025-03-09 15:29:56
269
原创 Redisson分布式锁原理
redisson分布式锁是可重入、可重试、以及可以自动续期的。它是基于set nx互斥命令实现的,获取锁i就是去set nx,只有第一次set能成功,之后都会返回失败,释放锁其实就是去删除key。那么它是如何实现可重入、可重试、以及自动续期的呢?
2025-03-09 11:26:30
582
原创 Redis主从同步原理
从节点像主节点请求数据同步,主节点先判断从节点是不是第一次进行同步,如果是第一次的话,主节点会调用bgsave,frok一个主进程,生成RDB文件发送给从节点,从节点收到后清空本地数据,加载RDB文件。如果主节点在生成RDB的过程中,有写操作来修改数据怎么办?Redis会把这些写操作记录到repl_baklog日志中,然后发送给从节点,从节点执行命令同步数据。
2025-03-09 10:41:58
374
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅