问题回顾:在给项目引入了阿里的百炼大模型sdk后,然后运行Springboot,出现如下的报错信息,根据提示可以知道是有两个slf4j包,发生了冲突
参考的解决方案:[已解决] SLF4J: Class path contains multiple SLF4J bindings
开始解决该问题:既然是冲突,那可能就是项目中依赖了多个不同版本的slf4j类库,那如何分析到底是哪几个类库依赖了slf4j呢?我们可以使用dependency:tree命令:
1mvn dependency:tree
定位到发生冲突的包
方法1:知道了具体的依赖和子包我们就可以找到dashcope中引入的API依赖出现冲突,将其去掉即可了。
方法2:简单粗暴,直接删掉冲突的文件
1rm -f /app/aimian-backend-0.0.1-SNAPSHOT.jar/BOOT-INF/lib/slf4j-simple-1.7.36.jar
问题描述:当我们的项目上线后,使用IP地址可以正常对网页进行访问和登录,所有功能正常。
那么问题来了,给网站备案好之后,网站主页能够正常访问,但是登录时,发现返回的session被释放掉了
并且ip访问时cookie里有维持session,而域名访问时却没有,在尝试试了很多种方法,包括在后端设置cookieSerializer,都无法解决
解决思路:经过查阅资料之后,终于发现了问题所在:
前端现在是域名+端口
但是调用后端是ip+端口
违背同源策略了
跨域问题的原因 跨域问题是由浏览器的 同源策略(Same-Origin Policy) 引起的。同源策略要求: 协议、域名、端口都必须一致。 如果前端和后端运行在不同的域名、IP 或端口上,例如: 前端地址为 http://126.4.3.3 后端地址为 http://126.4.3.3:8080 浏览器会认为它们是不同源,因此会阻止请求,这是跨域问题的本质。
解决方法:在我们前端的转发路径中将原本的IP改为我们的子域名
通过 Nginx 的反向代理机制,将前端通过 /api 路径发起的请求转发到后端(即 http: ...
MySQL 中的日志类型MySQL 提供多种日志类型,用于记录数据库运行中的各种信息,下面是常见的日志类型:
日志类型
功能
常见日志名称
适用场景
错误日志
记录服务器启动、关闭、运行中的错误和警告信息。
error.log
诊断服务器问题,例如启动失败、崩溃等。
查询日志
记录所有客户端请求(连接、查询、断开连接等)。
general_log
调试 SQL 查询语句,分析客户端行为。
慢查询日志
记录执行时间超过阈值的 SQL 语句。
slow.log
定位慢查询,优化查询性能和索引。
事务日志
记录事务执行相关信息,保证事务的 ACID 特性。
redo log / undo log
保证事务回滚、数据恢复、并发控制。
二进制日志
记录所有更改数据的操作,支持数据恢复和主从复制。
binlog
数据恢复、主从复制同步。
中继日志
从库存储主库的二进制日志,用于主从复制。
relay-log
从库重放主库的更改操作。
审计日志
记录用户的访问行为和操作,用于安全审计和合规性需求。
audit.log
数据安全监控与合规需求。
性能日 ...
InnoDB中聚簇索引和非聚簇索引的区别InnoDB的底层是用B+树实现的,所以聚簇索引和非聚簇索引在默认情况下也是使用B+树实现,但是存在一定的差别,如下表所示:
区别
聚簇索引
非聚簇索引
叶子节点存储内容
完整数据
主键、索引列
在表中是否唯一
是
否
适用场景
范围查询、排序操作
快速查找数据
因为B+树的叶子节点之间是通过双向链表连接的,所以对于存储了数据行的聚簇索引来说在特定范围内进行数据查询和对数据进行排序操作不用修改数据的结构,IO次数减少查询速度快。
而对于非聚簇索引,因为存储的是主键和索引列,想要通过非聚簇索引来查找完整的数据内容会增加回表的次数,造成IO次数的开销,因此查找完整的数据比较慢,但是用于快速查找特定数据,根据主键和索引列匹配数据会比聚簇索引快。
扩展:Innodb数据存储结构从Mysql5.5版本开始,InnoDB是默认的表存储引擎。其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU。
innodb的存储格式从行,页,区,段,再到表空间,环环相扣。接下来就介绍存储格式
i ...
一直在使用的markdown编辑器:Typora
其内部图片默认是存储在本机C盘中的,在使用blog编辑文档时想节省服务器的存储空间,于是采用cos将图片放到云端存储。
方法将typora中的图片上传到腾讯云的COS中
注意:在较新版本的Typora中(在MacOS上为0.9.9.32或在Windows / Linux上为0.9.84),添加了“上传图像”功能,可通过第3个应用程序或脚本将图像上传到云图像存储。
1.在COS中创建bucket
2.配置PicGo1、下载链接
链接
安装后上传设置:
Secretld和SecretKey参考腾讯云cos配置文档
设置Server:
要想实现一键上传,必须要Typora和PicGo在同一端口上
同时记得把内置剪切板功能打开,否则上传图片会一直uploading!
3.打开Typora偏好设置
点击验证图片按钮:
验证成功即可
索引类型划分从数据结构角度划分为:B+树索引、Hash索引、倒排(全文/Full-Text)索引、R树索引。
从底层B+树角度划分为:聚簇索引、非聚簇索引。
从物理存储层级角度划分为:主键索引、二级索引。
从索引的性质角度划分为:主键索引、普通索引、前缀索引、唯一索引。
从字段个数角度划分为:联合索引、单排索引。
扩展:按照数据结构维度划分:
BTree 索引:MySQL 里默认和最常用的索引类型。只有叶子节点存储 value,非叶子节点只有指针和 key。存储引擎 MyISAM 和 InnoDB 实现 BTree 索引都是使用 B+Tree,但二者实现方式不一样(前面已经介绍了)。
哈希索引:类似键值对的形式,一次即可定位。
RTree 索引:一般不会使用,仅支持 geometry 数据类型,优势在于范围查找,效率较低,通常使用搜索引擎如 ElasticSearch 代替。
全文索引:对文本的内容进行分词,进行搜索。目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。一般不会使用,效率较低,通常使用搜索引擎如 ElasticSearch 代替。
按照底 ...
常见的存储引擎有MyISAM、InnoDB、Memory
在MySQL 5.5版本之前,默认的存储引擎是MyISAM
在MySQL 5.5版本之后,默认的存储引擎变为了InnoDB
而Memory是MySQL 3.23版本中引入的使用内存缓存数据,将索引存储在磁盘上的一种引擎。
在日常使用过程中我们主要用到前两种引擎,二者之间有很大差别,主要包括:
InnoDB支持事务,MyISAM不支持事务。
InnoDB最小的锁粒度为行级锁,MyISAM只支持表级锁。
InnoDB数据支持聚簇索引和非聚簇索引存储,MyISAM只支持非聚簇索引。
InnoDB支持外键关联,MyISAM不支持外键。
InnoDB支持MVCC多版本并发控制机制,MyISAM不支持MVCC。
(扩展)借助命令行查看当前使用的存储引擎查看 MySQL 版本信息1SHOW VARIABLES LIKE '%storage_engine%';
查看 MySQL支持的存储引擎(MySQL8.0.34)1SHOW ENGINES;
修改当前数据库的存储引擎将名为 users表的存储引擎从 MyISA ...
AQS与ReentrantLock什么是AQS?简单来说AQS就是起到了一个抽象、封装的作用,将一些排队、入队、加锁、中断等方法提供处出来,便于其他相关的JUC锁使用,具体加锁时机、入队时机等都需要实现类自己控制。
常见的实现类有ReentrantLock、CountDownLatch、Semaphore等等。
AQS的核心机制
状态(State):AQS通过一个volatile类型的整数state来表示同步状态。
子类通过 getState()、setState(int)和 compareAndSetState(int, int)方法来检查和修改该状态状态可以表示多种含义,例如在 ReentrantLock 中,状态表示锁的重入次数;在 Semaphore 中,状态表示可用的许可数。
队列(Queue):AQS维护了一个FIFO的等待队列,用于管理等待获取同步状态的线程。每个节点(Node)代表一个等待的线程,节点之间通过next和prev指针链接。
12345678910static final class Node { static final Nod ...
线程池原理线程池是一种池化技术,用于预先创建并管理一组线程,避免频繁创建和销毁线程的开销,提高性能和响应速度。
它的几个关键参数包括:
核心线程数
最大线程数
空闲存活时间
工作队列
拒绝策略
主要工作原理如下:
默认情况下线程不会预创建,任务提交之后才会创建线程(不过设置 prestartAllCoreThreads 可以预创建核心线程)。
当核心线程满了之后不会新建线程,而是把任务堆积到工作队列中。
如果工作队列放不下了,然后才会新增线程,直至达到最大线程数。
如果工作队列满了,然后也已经达到最大线程数了,这时候来任务会执行拒绝策略
如果线程空闲时间超过空闲存活时间,并且线程线程数是大于核心线程数的则会销毁线程,直到线程数等于核心线程数(设置allowCoreThreadTimeOut为true可以回收核心线程,默认为false)。
创建线程的方式一般来说,创建线程有很多种方式,例如继承Thread类、实现Runnable接口、使用线程池、使用completableFuture类等等。
不过,这些方式并没有真正创建出线程。准确来说,这些都属于是在Jav ...
Synchronized的实现原理synchronized实现原理依赖于JVM的Monitor(监视器锁)和对象头(Object Header)。
当synchronized修饰在方法或代码块上时,会对特定的对象或类加锁,从而确保同一时刻只有一个线程能执行加索的代码块。
synchronized修饰方法:方法的常量池会增加一个ACC_SYNCHRONIZED标志,当某个线程访问这个方法检查是否有ACC_SYNCHRONIZED标志,若有则需要获得监视器锁才可以执行方法,保证方法的同步。
synchronized修饰代码块:会在代码块的前后插入monitorenter和monitorexit字节码指令。可以把monitorenter理解为加锁,monitorexit理解为解锁。
synchronized关键字可以修饰代码块、实例方法和静态方法,本质上都是作用于对象。
对象头(Object Header)在JVM中,每个对象的内存布局主要有两部分组成:
Mark Word:用于存储对象的运行时数据,包括锁状态、哈希码、GC分代信息等。
KIass Pointer:指向对象的类型 ...