自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 JUC多线程常见面试题汇总

如果工作队列满了,则判断线程池里的线程是否都处于工作状态,如果没有,则创建一个新的工作线程来执行任务。在上锁的过程中,如果有其他线程也来抢锁,则进入EntryList 进行阻塞,当获得锁的线程执行完了,释放了锁,就会唤醒EntryList 中等待的线程竞争锁,竞争的时候是非公平的。偏向锁:一段很长的时间内都只被一个线程使用锁,可以使用了偏向锁,在第一次获得锁时,会有一个CAS操作,之后该线程再获取锁,只需要判断mark word中是否是自己的线程id就可以,一旦锁发生了竞争,都会升级为重量级锁。

2024-07-23 12:23:52 1328

原创 MySQL常见面试题汇总

但是如果项目中没有这种运维的监控系统,其实在MySQL中也提供了慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了。覆盖索引是指select查询语句使用了索引,在返回的列,必须在索引中全部能够找到,如果我们使用id查询,它会直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。

2024-07-23 12:21:13 427

原创 Redis常见面试题汇总

在一个线程删除缓存以后,可以设置一个时间间隔,让这个线程再删除一次缓存,只要其他的线程的写缓存操作是在这个线程两次删缓存操作之间执行的,这个线程就可以在第二次删除缓存时把其他线程写的脏数据给删除掉。这个是不能的,比如,当线程1加锁成功后,master节点数据会异步复制到slave节点,此时当前持有Redis锁的master节点宕机,slave节点被提升为新的master节点,假如现在来了一个线程2,再次加锁,会在新的master节点上加锁成功,这个时候就会出现两个节点同时持有一把锁的问题。

2024-07-23 12:19:11 8107

原创 Kafka常见面试题

Consumer端会从分配的Partition里面去消费消息,如果consumer在默认的五分钟没办法处理完这一批消息,就会触发Kafka的rebalance机制,从而导致Offset自动提交失败,而在重新rebalance后,consumer还是会从之前没提交的offset位置开始消费,也会导致消息重复消费的问题。Kafka消费消息都是按照offset进行标记消费的,消费者默认是自动按期提交已经消费的偏移量,默认是每隔5s提交一次,如果出现重平衡的情况,可能会重复消费或者丢失数据。

2024-07-18 00:06:40 727

原创 Mybatis常见面试题

使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法,比如调用a.getB().getName(),拦截器invoke()方法发现a.getB(),是null值,那么就会单独发送事先保存好的查询关联B对象的Sql,把B查询上来,然后调用a.setB(b),于是a的对象b属性就有值了,接着完成a.getB().getName()方法的调用。,在同一个SQLSession中,执行相同的SQL查询时,第一次会去查数据库,并写在缓存中,第二次直接从缓存中取。,association指的是。

2024-07-17 23:27:17 357

原创 Spring常见面试题

aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低合,一般比如可以做为公共日志保存,事务处理等。

2024-07-17 23:25:21 917

原创 Java集合常见面试题

在java中提供了大量的集合框架,主要分为两类:第一个是Collection 属于单列集合,第二个是Map 属于双列集合。ArrayList类又称动态数组,同时实现了Collection和List接口,是List的主要实现类,底层使⽤ Object数组存储,适⽤于频繁的查找⼯作,线程不安全。Arraylist 底层使⽤的是 Object 数组,由于采⽤数组存储,所以插⼊和删除元素的时间复杂度受元素位置的影响,因为执行插入删除操作需要移动后面元素的位置。ArrayList底层数据结构是用动态的数组实现的。

2024-07-17 19:36:26 521 1

原创 JVM常见面试题汇总(强推!!!)

它又叫做堆外内存,线程共享的区域,在Java8之前有个永久代的概念,实际上指的是 HotSpot 虚拟机上的永久代,它用永久代实现了JVM 规范定义的方法区功能,主要存储类的信息,常量,静态变量,即时编译器编译后代码等,这部分由于是在堆中实现的,受GC的管理,不过由于永久代有-XX:MaxPermSize的上限,所以如果大量动态生成类(将类信息放入永久代),很容易造成00M,有人说可以把永久代设置得足够大,但很难确定一个合适的大小,受类数量,常量数量的多少影响很大。当一个引用被删除时,引用计数器减1。

2024-07-17 15:23:49 615

原创 MySQL分库分表

2024-07-16 20:32:47 209

原创 MySQL主从同步

MySQL主从复制的核心就是二进制日志,二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但不包括数据查询(SELECT、SHOW)语句。(3)大部分系统,访问模型几乎都是读多写少的情况,可以部署一主多从的数据库架构,主库处理写请求,从库处理读请求。(2)从库读取主库的二进制日志文件 Binlog,写入到从库的中继日志 Relay Log。(1)可以提高MySQL的高可用性,当主库出现问题,可以快速切换到从库来提供服务。

2024-07-16 20:30:49 160

原创 MVCC实现原理

回滚日志,在insert、update、delete的时候产生的便于数据回滚的日志。当insert的时候,产生的undo log日志只在回滚时需要,在事务提交后,可被立即删除。而update、delete的时候,产生的undo log日志不仅在回滚时需要,mvcc版本访问也需要,不会立即被删除。不同事务或相同事务对同一条记录进行修改,会导致该记录的undolog生成一条记录版本链表,链表的头部是最新的旧记录,链表尾部是最早的旧记录。

2024-07-16 20:29:53 236

原创 事务中的隔离性如何保证?(解释一下MVCC)

事务的隔离性是由锁和mvcc实现的。其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要是分为了三个部分,第一个是。

2024-07-16 20:26:55 283

原创 MySQL中的事务

当一个事务对数据进行修改时,数据库会生成 undo log 条目,记录被修改数据的原始状态。事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。一个事务读取了几行数据,之后另一个事务插入了一些数据,这使得前一个事务再次读取时会发现有新的“幻影”行。在一个事务内多次读取同一条记录,每次读取结果不同,因为其他事务在此期间修改了这条记录。保证了事务的原子性和一致性,redo log保证了事务的持久性。

2024-07-16 20:24:39 542

原创 SQL优化

SQL优化在项目中很常见,主要从五个方面考虑:建表的时候、使用索引、sql语句的编写、主从复制,读写分离,还有一个是如果量比较大的话,可以考虑分库分表。如果数据库的使用场景读的操作比较多的时候,为了避免写的操作所造成的性能影响 可以采用读写分离的架构。读写分离解决的是:数据库的写入,影响了查询的效率。

2024-07-16 20:21:00 175

原创 MySQL索引重要知识点

索引在项目中是比较常见的,它是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的I0成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以,因为查询id的时候,走的覆盖索引,一次索引扫描,直接返回数据,所以效率可以提升很多。来创建,一条sql的返回值,尽量使用覆盖索引,如果字段的区分度不高的话,我们也会把它放在组合索引后面的字段。

2024-07-16 16:46:55 1095

原创 MySQL存储引擎有哪些?有什么区别?

存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表的,而不是基于库的,所以存储引擎也可被称为表类型。InnoDB存储引擎的特点。

2024-07-16 14:04:17 287

原创 如果一个SQL语句执行很慢,如何分析?

如果一条sql执行很慢的话,通常会使用mysql自动的执行计划explain去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描,第三个可以通过extra建议来判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复。,如果出现了,可以尝试添加索引或修改返回字段来修复。

2024-07-16 14:02:33 310

原创 MySQL中,如何定位慢查询

如果,项目中没有这种运维的监控系统,其实在MySOL中也提供了慢日志查询的功能,可以在MySOL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SOL了。配置完毕之后,通过以下指令重新启动MySQL服务器进行测试,查看慢日志文件中记录的信息 /var/lib/mysql/localhost-slow.log。

2024-07-16 14:00:29 265

原创 设计模式-行为型模式之责任链模式

责任链模式,又名职责链模式,为了避免请求发送者与多个请求处理者耦合在一起,将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。请假一天以下的假只需要小组长同意即可;请假1天到3天的假还需要部门经理同意;请求3天到7天还需要总经理同意才行。生活案列:我们在公司内部发起一个OA审批流程,组长审批->主管审批-> 经理审批->老板审批,每个角色的责任是不同。比较常见的springmvc中的拦截器,web开发中的flter过滤器。

2024-07-16 00:10:33 320

原创 设计模式-行为型模式之策略模式

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。针对不同的节日(春节、中秋节、圣诞节)推出不同的促销活动,由促销员将促销活动展示给客户。定义环境角色(Context):用于连接上下文,即把促销活动推销给客户,这里可以理解为销售员。定义具体策略角色(Concrete Strategy):每个节日具体的促销活动。

2024-07-16 00:08:22 370

原创 设计模式-结构型模式之代理模式

在JDK1.6、JDK1.7、JDK1.8逐步对JDK动态代理优化之后,在调用次数较少的情况下,JDK代理效率高于CGLib代理效率,只有当进行大量调用的时候,JDK1.6和JDK1.7比CGLib代理效率低一点,但是到JDK1.8的时候,JDK代理效率高于CGLib代理。使用动态代理实现上面案例。JDK提供的动态代理:Java中提供了一个动态代理类Proxy,Proxy并不是我们上述所说的代理对象的类,而是提供了一个创建代理对象的静态方法(newProxyInstance方法)来获取代理对象。

2024-07-16 00:06:28 553

原创 设计模式-创建型模式之工厂方法模式

用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂,定义一个用于创建对象的接口,让子类决定实例化哪个产品类对象。从以上的编写的代码可以看到,要增加产品类时也要相应地增加工厂类,不需要修改工厂接口的代码了,这样就解决了简单工厂模式的缺点。工厂方法模式是简单工厂模式的进一步抽象。每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。

2024-07-16 00:00:31 326

原创 设计模式-创建型模式之单例模式

不用加锁懒加载,线程安全,实现简单,效率较高。第一次加载Singleton类时不会去初始化INSTANCE,只有第一次调用getInstance,虚拟机加载Holder,并初始化INSTANCE,这样不仅能确保线程安全,也能保证 Singleton 类的唯一性。对于 `getInstance()` 方法来说,绝大部分的操作都是读操作,读操作是线程安全的,所以没必要每个线程必须持有锁才能调用该方法,我们需要调整加锁的时机。在没有加任何锁的情况下,保证了多线程下的安全,并且没有任何性能影响和空间的浪费。

2024-07-15 23:58:10 600

原创 设计模式总结(设计模式的原则及分类)

比如我们的程序员分为Java程序员、C#程序员、PHP程序员、前端程序员等,而他们要做的都是去打代码,具体如何打代码是根据不同语言的程序员来决定的,可以将程序员打代码这一个行为抽象成一个统一的接口或是抽象类,这样就满足了开闭原则的第一个要求:对扩展开放,不同的程序员可以自由地决定他们该如何进行编程。传统的设计中,高层模块直接依赖于低层模块,这会导致高层模块的代码与低层模块紧耦合,不利于系统的扩展和维护。依赖注入:通过构造函数注入、Setter方法注入或接口注入的方式,将具体的实现类注入到依赖抽象的类中。

2024-07-15 23:51:16 872

原创 Redis集群

当然,如果在rdb生成执行期间,依然有请求到了主节点,而主节点会以命令的方式记录到缓冲区,缓冲区是一个日志文件,最后把这个日志文件发送给从节点,这样就能保证主节点与从节点完全一致了,后期再同步数据的时候,都是依赖于这个日志文件,这个就是全量同步。增量同步指的是,当从节点服务重启之后,数据就不一致了,所以这个时候,从节点会请求主节点同步数据,主节点还是判断不是第一次请求,不是第一次就获取从节点的offset值,然后主节点从命令日志中获取offset值之后的数据,发送给从节点进行数据同步。取值的逻辑是一样的。

2024-07-12 23:32:41 602 1

原创 Redis分布式锁

将线程ID传入scheduleExpirationRenewal,然后在renewExpiration中创建定时任务,当线程持有锁的时间到了超时时间的1/3,就会通过定时任务中的renewExpirationAsync方法会通过Lua脚本为锁重新设置超时时间。(5)添加锁成功,则添加缓存然后再释放锁,最后返回数据。业务加锁后启动一个看门狗,每隔一段时间检查一下,如果业务还持有锁key,那么就会不断的延长锁key的生存时间。锁的释放也是通过 Lua 脚本来保证原子性,确保只有持有锁的客户端才能释放锁。

2024-07-12 22:03:20 588

原创 Redis数据淘汰策略(Redis缓存内存占满了怎么办?)

当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。主要看数据淘汰策略是什么?如果是其它策略,按照以上对应的策略对key进行淘汰。【1】:数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据?使用allkeys-lru(挑选最近最少使用的数据淘汰)淘汰策略,留下来的都是经常访问的热点数据。【2】Redis的内存用完了会发生什么?

2024-07-12 21:57:47 401

原创 Redis过期删除策略

Redis对数据设置数据的有效时间,数据过期以后,就需要将数据从内存中删除掉。可以按照不同的规则进行删除,这种删除规则就被称之为数据的删除策略(数据过期策略)。设置该key过期时间后,我们不去管它,当需要该key时,从缓存中取出该key,然后再检查其是否过期,如果过期,我们就删掉它,反之返回该key。每隔一段时间,我们就对一些key进行检查,从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key。Redis的过期删除策略一般使用。两种策略进行配合使用。

2024-07-12 21:54:27 147

原创 Redis数据持久化

以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件。AOF采用文件追加方式,文件会越来越大,为避免出现此种情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。在指定的时间间隔内将内存中的数据集快照写入磁盘(Snapshot),它恢复时是将快照文件直接读到内存里。为了能够重用Redis数据,或者防止系统故障,我们需要将Redis中的数据写入到磁盘空间中,即持久化。

2024-07-12 21:50:27 370

原创 Redis作为缓存,如何保证MySQL数据库与Redis缓存一致性(双写一致性)?

(2)利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binlog数据更新缓存。当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。(2)排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作。(1)共享锁:读锁readLock,加锁之后,其他线程可以共享读操作。(1)使用MQ中间中间件,更新数据之后,通知缓存删除。

2024-07-12 21:47:04 649 4

原创 缓存三兄弟之缓存雪崩

缓存雪崩意思是设置缓存时大量的key采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多key,击穿是某一个key缓存。

2024-07-12 00:32:00 192

原创 缓存三兄弟之缓存击穿

缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。当缓存失效时,不立即去加载 db,先使用Redis的setnx(Set if not exit)去设置一个互斥锁,当操作成功返回时再进行加载db的操作并回设缓存,否则重试get缓存的方法。的方案,性能上可能没那么高,锁需要等待,也有可能产生死锁的问题。

2024-07-12 00:30:46 263

原创 缓存三兄弟之缓存穿透

判断一个元素是否存在于集合时,同样使用多个哈希函数计算出对应的哈希值,然后检查位数组中对应的位置是否都为1,如果有任意一个位置为0,则说明该元素不存在于集合中;(1)哈希碰撞:不同的元素经过哈希函数计算可能映射到相同的二进制位,导致不同元素在布隆过滤器中产生了冲突,从而可能被误判为存在于集合中。(2)容量限制:布隆过滤器使用有限的二进制位数组来表示集合,当集合中元素数量较多时,可能会导致位的重复使用,从而增加误判的概率。虽然查询元素是否存在有误判率,但是如果查询元素是否不存在,则没有误判率。

2024-07-12 00:27:38 371

原创 ViT与transformer的区别

总的来说,ViT是一种将Transformer应用于图像领域的模型,它通过对图像块进行编码和注意力机制的处理,实现了对图像的表示和分类。而Transformer更广泛地应用于自然语言处理任务,它通过对序列数据的编码和注意力机制的处理,实现了对文本的建模和处理。而ViT通过将图像划分为一系列的图像块,并将每个图像块展平为向量,然后通过位置编码和嵌入向量来表示图像块的位置信息和特征信息。1. 输入数据结构:Transformer主要应用于自然语言处理领域,输入是一串序列数据,如单词序列。

2023-06-28 12:27:15 3723 1

原创 transformer编码器如何捕获脑电(EEG)信号的远程依赖关系?

自注意力机制是Transformer模型的核心组成部分之一,它能够对输入序列中的每个元素进行注意力权重计算,并将注意力权重应用于序列中其他位置的元素。具体来说,自注意力机制计算了每个时间点与其他时间点之间的注意力权重,将这些权重应用于对应的信号上,以捕获不同时间点之间的依赖关系。在脑电信号的处理中,输入序列通常是时间序列数据,每个元素对应于特定时间点上的脑电信号采样。由于脑电信号具有时间相关性,不同时间点上的信号可能存在远程依赖关系,即当前时间点的信号可能受到之前或之后时间点的信号影响。

2023-06-23 13:26:11 856

原创 Bi-Branch Vision Transformer Network for EEG Emotion Recognition论文翻译

ABSTRACT Electroencephalogram (EEG) signals have emerged as an important tool for emotion research due to their objective reflection of real emotional states. Deep learning-based EEG emotion classification algorithms have made encouraging progress, but exi

2023-06-20 21:09:25 864

原创 脑电(EEG)情绪识别的一般流程

特征提取:从预处理的脑电信号中提取与情绪相关的特征。常用的特征包括时域特征(如均值、方差等)、频域特征(如功率谱密度、频带能量等)和时频域特征(如小波变换系数、时频图等)。特征选择/降维:对提取的特征进行选择或降维,以减少冗余信息和避免过拟合。常用的方法包括主成分分析(PCA)、线性判别分析(LDA)和特征选择算法(如相关性分析、信息增益等)。数据预处理:对采集到的原始脑电信号进行预处理,以提取出有用的特征。数据采集:使用脑电设备(如脑电图仪)对被试者进行脑电信号的采集。

2023-06-02 10:21:32 1460

原创 EEG信号提取中常用到的神经网络模型

综上所述,CNN适用于时空特征提取,RNN和LSTM适用于时序建模和长期依赖,BiLSTM可以同时考虑过去和未来的上下文信息,Transformer则适用于自注意力机制下的序列建模。例如,可以使用CNN进行初始的特征提取,然后将提取的特征序列输入RNN或LSTM进行时序建模和长期依赖关系捕捉。在EEG信号提取中,常用的神经网络模型包括CNN(卷积神经网络)、RNN(循环神经网络)、LSTM(长短期记忆网络)、BiLSTM(双向长短期记忆网络)和Transformer。

2023-06-02 09:57:36 1412

原创 CNN、RNN、LSTM、BiLSTM、Transformer的在EEG信号处理中的作用

需要注意的是,CNN和RNN并不是相互排斥的,它们可以结合使用,例如在图像字幕生成任务中,可以使用CNN提取图像特征,然后将这些特征输入到RNN中生成描述文字。总之,CNN主要适用于提取EEG信号的时空特征和多通道处理,而RNN主要适用于捕捉EEG信号中的时间依赖关系和序列建模。在实际应用中,CNN和RNN可以结合使用,以充分利用它们各自的优势。CNN(卷积神经网络)和RNN(循环神经网络)是深度学习中常用的两种神经网络结构,它们在处理不同类型的数据和解决不同类型的问题时具有不同的优势。

2023-06-02 09:34:55 5781 3

原创 AMDET: Attention based Multiple Dimensions EEG Transformer for Emotion 论文精读

Abstract—Affective computing is an important subfield of artificial intelligence, and with the rapid development of braincomputer interface technology, emotion recognition based on EEG signals has received broad attention. It is still a great chall

2023-05-28 15:11:43 1416 1

空空如也

空空如也

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

TA关注的人

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