- 博客(39)
- 收藏
- 关注
原创 分布式锁的实现
要求REDIS要部署多个主节点,但是只需要半数以上加锁成功就行了,当某个线程加锁半数以上的节点成功了,那么其他线程就不可能再做到半数以上,加锁成功了,这就满足了互斥项。分布式锁就是在单体锁的基础上考虑了分布式环境的问题。2、分布式的数据一致性问题:联锁机制 联锁机制的问题:受网络波动较大,也有问题。阻塞:CAS自旋抢锁(或者利用redis的发布订阅机制,但是阻塞是一样的)互斥性:用redis的原子性就可以实现,setnx(哈希结构同理)1、锁的释放和续期:看门狗机制(守护线程机制)
2025-07-29 17:45:10
811
原创 JVM易混淆名称
符号引用就是一个类中(当然不仅是类,还包括类的其他部分,比如方法,字段等)引入了其他的类,可是JVM并不知道引入的其他类在哪里,所以就用唯一符号来代替,等到类加载器去解析的时候,就通过符号引用找到那个引用类的地址(如果找不到说明引用类还没加载,那就直接把引用类也加载了),这个地址也就是直接引用。每个class文件独有一份,常量池中有字面量(数量值、字符串值)和符号引用(类符号引用、字段符号引用、方法符号引用),虚拟机指令根据这张常量表找到要执行的类名、方法名、参数类型、字面量等类型。final修饰的变量。
2025-07-29 17:43:51
212
原创 MYSQL难面试
物理日志,先修改哪个后修改哪个无所谓),中间有生成的日志可以写到 redo log buffer 中。一个事务的 binlog 必须连续写(主从同步要求,不然可能会出错),因此要整个事务完成后,再一起写到文件里。而数据页是16KB,如果你只写成功了前8KB,系统崩了,磁盘上这个页就坏了,RedoLog也救不了你。如果数据库崩溃,只要Double Write 区没坏,就能从这里恢复出完整的页,避免页损坏。如果崩溃刚好发生在写数据页的过程中,只写了一半,可能导致磁盘上的数据页损坏,恢复时无法读取。
2025-07-29 17:40:42
548
原创 设计模式---单例
单例模式确保一个类只有一个实例,而且自行实例化并向整个系统提供这个实例正确的双重检查锁定模式需要需要使用volatile。volatile主要包含两个功能。由于volatile 禁止对象创建时指令之间重排序,所以其他线程不会访问到一个未初始化的对象,从而保证安全性。
2025-07-29 17:38:58
274
原创 Java中的5个执行过程
概念核心关注点是否面试常问Bean 生命周期容器如何管理、初始化和销毁 Bean⭐⭐⭐⭐MyBatis 流程配置 → SQL 执行 → 映射⭐⭐⭐⭐SQL 执行流程⭐⭐⭐⭐类加载过程加载 → 验证 → 初始化 → 使用⭐⭐⭐对象创建过程new 时做了哪些事,类加载是否触发⭐⭐⭐⭐。
2025-07-29 17:38:22
714
原创 高频面试题
一般可以把任务持久化到数据库/消息队列记录日志并触发警告索引时数据库在存储引擎中,帮助存储引擎高效获取数据的一种数据结构。。例如书中的目录,如果没有索引要找内容就需要全书查找,有了目录(也就输索引)就可以提高查找效率。
2025-07-29 17:36:46
1356
原创 消息队列---面试题
例如,像 RabbitMQ 可以通过配置将消息持久化到磁盘,通过将队列和消息都设置为持久化的方式(设置durable = true),这样在服务器重启后,消息依然可以被重新读取和处理。例如,在第一次处理失败后,等待一段时间(如 5 秒)后进行第二次重试,如果重试多次(如 3 次)后仍然失败,可以将消息发送到死信队列,以便后续人工排查或者采取其他特殊处理。:消息队列生产者为每条消息生成唯一的消息 ID,消费者在处理消息前,先检查该消息 ID 是否已经处理过,如果已经处理过则丢弃该消息。
2025-07-29 17:33:09
879
原创 八股问---集合(2)
如果把上面的执行用一句话归纳的话,就相当于是ConcurrentHashMap通过对头结点加锁来保证线程安全的,锁的粒度相比 Segment 来说更小了,发生冲突和加锁的频率降低了,并发操作的性能就提高了。而且JDK1.8 使用的是红黑树优化了之前的固定链表,那么当数据量比较大的时候,查询性能也得到了很大的提升,从之前的 O(n) 优化到了 O(logn)的时间复杂度。当触发扩容时,HashMap 会创建一个新的数组,其大小是原来的 2 倍,并将原数组中的元素重新映射到新数组中,这个过程叫 rehash。
2025-05-26 17:40:12
1314
原创 八股文---集合(1)
双列集合一次需要存一对数据,分别为键和值键不能重复,值可以重复键和值是一一对应的,每一个键只能找到自己对应的值键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象。
2025-05-26 17:37:01
1120
原创 AOP的代理模式
对于这一点,jdk代理是采用反射,你看,我都反射了,我还拿不到你的原始方法?直接获取到Method类,再放入特定的上下文环境,也就是AOP通知,调用invoke方法即可。而cglib代理是怎么获得原始方法的呢,它的代理类是继承目标类的,那都直接继承目标类了,那不就可以直接通过super.的形式调用目标类的原始方法。
2025-05-23 19:58:10
553
原创 八股--SSM(2)
1.直接在Select语句中增加数据库提供的分页关键字,然后在应用程序中传递当前页和每页展示页数2.Mybatis中提供的RowBounds对象,实现内存级别分页3.基于Mybatis里面的Interceptor拦截器,在Select语句执行之前动态拼接关键字Mybatis 在处理 #{} 时,会创建预编译的 SQL 语句,将 SQL 中的 #{} 替换为 ? 号,在执行 SQL 时会为预编译 SQL 中的占位符(?)赋值,调用 PreparedStatement 的 set 方法来赋值,预编译的 SQL
2025-05-23 19:55:44
1186
原创 八股文--JVM(2)
3.当Eden(伊甸园区)需要垃圾回收时,挑出一个空闲区域作为S(幸存区)区,用复制算法复制存活对象,这时候处于STW(线程暂停)5.将Eden(伊甸园区)以及之前幸存区中的存活对象,采用复制算法,复制到新的S(幸存区),其中较老的对象晋身老年代。,在垃圾回收时,将正在使用的对象复制到另一个内存空间中,然后将该内存空间清空,交换两个内存的角色,完成垃圾的回收。回收的,是一款以获取最短回收停顿时间为目标的收集器,停顿时间短,用户体验就好。,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于"
2025-05-20 21:18:40
1251
原创 天机学堂项目面试回答
我这个项目是基于微服务架构的生产级在线教育项目,面向成年人的非学历职业技能培训平台。分为两部分,学生端:其核心业务主体就是学员,所有业务围绕着学员的展开。管理端:其核心业务主体包括老师、管理员、其他员工,核心业务围绕着老师展开。在领取优惠卷的时候因为我们领取的整个业务外面加了事务,而加锁的是其中的限领数量校验的部分。因此业务结束时,会先释放锁,然后等整个业务结束,才会提交事务。这就导致我们测试的时候还有出现超领。为了解决这个问题,我们将事务的范围缩小,保证了事务先提交,再释放锁,最终线程安全问题不再发生了。
2025-05-20 21:14:30
1148
原创 深入理解Java中的Minor GC、Major GC和Full GC
Minor GC、Major GC和Full GC在Java垃圾回收机制中扮演着不同的角色,它们各自有着明确的作用范围、触发条件和特点。理解它们之间的区别和联系,对于优化Java应用程序的内存管理、提高应用程序的性能至关重要。在实际开发中,我们可以根据应用程序的特点和需求,合理选择垃圾回收器,并通过调整相关参数,来尽量减少Full GC的发生,降低垃圾回收对应用程序性能的影响。希望通过这篇博客,大家能对Java中的这三种GC有更深入的理解,在处理Java内存相关问题时能够更加得心应手。
2025-05-18 13:46:15
1461
原创 项目复习(2)
1.直接把需要的字段用.select(InteractionQuestion::getId.......)可以先把问题表的属性赋值了,最后一块修改数据库,不要多次查询修改。基于Redis数据结构模拟JDK的DelayQueue实现。例如RabbitMQ的死信队列。JDK自带延迟队列,基于阻塞队列实现。和上面的分页一模一样。
2025-05-17 19:47:17
865
原创 八股文--JVM(1)
直接内存:并不属于JVM的内存结构,不由JVM进行管理,是虚拟机的系统内存,常见与NIO操作时,用于数据缓冲区,他分配回收成本较高,但读写性能高。
2025-05-16 16:31:22
1263
原创 八股文--JUC(2)
ReentrantLock翻译过来是可重入锁,相对于synchronized它具备以下特点:可中断(可以主动放弃)可以设置超时时间可以设置公平锁支持多个条件变量与synchronized一样,都支持重入。
2025-05-16 16:29:46
1253
原创 八股文---消息队列
例如,像 RabbitMQ 可以通过配置将消息持久化到磁盘,通过将队列和消息都设置为持久化的方式(设置durable = true),这样在服务器重启后,消息依然可以被重新读取和处理。例如,在第一次处理失败后,等待一段时间(如 5 秒)后进行第二次重试,如果重试多次(如 3 次)后仍然失败,可以将消息发送到死信队列,以便后续人工排查或者采取其他特殊处理。:消息队列生产者为每条消息生成唯一的消息 ID,消费者在处理消息前,先检查该消息 ID 是否已经处理过,如果已经处理过则丢弃该消息。
2025-05-15 09:43:05
747
原创 八股文---JUC(1)
这个是在偏向锁开启之后的锁的状态,如果还没有一个线程拿到这个锁的话,这个状态叫做匿名偏向,当一个线程拿到偏向锁的时候,下次想要竞争锁只需要拿线程ID跟MarkWord当中存储的线程ID进行比较,如果线程ID相同则直接获取锁(相当于锁偏向于这个线程),不需要进行CAS操作和将线程挂起的操作。:这是没有开启偏向锁的时候的状态,在JDK1.6之后偏向锁的默认开启的,但是有一个偏向延迟,需要在JVM启动之后的多少秒之后才能开启,这个可以通过JVM参数进行设置,同时是否开启偏向锁也可以通过JVM参数设置。
2025-05-15 09:41:09
1040
原创 八股文---框架SSM(1)
AOP称为面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取并封装为一个可重用的模块,这个模块被命名为“切面”(Aspect),减少系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。记录操作日志缓存处理Spring中内置的事务处理回答面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合。
2025-04-22 18:22:29
722
原创 八股文---Redis(2)
回答:单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。一般都是一主多从,主节点负责写数据,从节点负责读数据3.1.2.能说一下,主从同步数据的流程回答1.从节点请求主节点同步数据(replication id、 offset )2.主节点判断是否是第一次请求,是第一次就与从节点同步版本信息(replication id和offset)3.主节点执行bgsave,生成rdb文件后,发送给从节点去执行。
2025-04-21 19:17:57
1195
原创 SpringAi与大模型在项目中的应用(1)
这是因为⼤模型是没有记忆的,因此我们调⽤API接⼝与⼤模型对话时,每⼀次对话信息都不会保留, 多次对话之间都是独⽴的,没有关联的。例如,有的模型可以根据⾳频⽣成⽂本,或者根据⽂本⽣成⾳频,还有的模型则可以根据⽂字⽣成图⽚,⽐如Dall-E、MidJourney。⾸先,我们需要下载⼀个Ollama的客⼾端,在官⽹提供了各种不同版本的Ollama,⼤家可以根据⾃⼰的需要下载。因此,不同的⼤模型由于System设定不。根据前⽂推测出接下来的⼀个词语后,把这个词语加⼊前⽂,再次交给⼤模型处理,推测下⼀个字,
2025-04-13 21:56:39
1355
原创 BitMap的使用(1)
当我们做项目的时候肯定遇到过签到功能吧,如果用平常数据库,假如一个用户1年签到100次,而网站有100万用户,就会产生1亿条记录。随着用户量增多、时间的推移,这张表中的数据只会越来越多,占用的空间也会越来越大。有没有什么办法能够减少签到的数据记录,减少空间占用呢?大家回忆一下,小时候上补习班时的签到卡:在这张小小的卡片上面,就记录了从一个月的第一天到最后一天的所有的签到情况。诶,你今天来上课了那就勾一下,没来就空着。这样呢,通过一个小小的卡片就能够记录一个同学这一个月的签到的情况了。
2025-04-07 16:09:37
1210
原创 Redis分布式锁(2)
小总结:利用set nx ex获取锁,并设置过期时间,保存线程标示释放锁时先判断线程标示是否与自己一致,一致则删除锁特性:利用set nx满足互斥性利用set ex保证故障时锁依然能释放,避免死锁,提高安全性利用Redis集群保证高可用和高并发特性我们一路走来,利用添加过期时间,防止死锁问题的发生,但是有了过期时间之后,可能出现误删别人锁的问题,这个问题我们开始是利用删之前 通过拿锁,比锁,删锁这个逻辑来解决的,也就是删之前判断一下当前这把锁是否是属于自己的,但是现在还有原子性问题。
2025-03-28 21:12:59
1091
原创 Redis分布式锁(1)
我们利用redis 的setNx 方法,当有多个线程进入时,我们就利用该方法,第一个线程进入时,redis 中就有这个key 了,返回了1,如果结果是1,则表示他抢到了锁,那么他去执行业务,然后再删除锁,退出锁逻辑,没有抢到锁的哥们,等待一定时间后重试即可。Mysql:mysql本身就带有锁机制,但是由于mysql性能本身一般,所以采用分布式锁的情况下,其实使用mysql作为分布式锁比较少见。只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行执行,这就是分布式锁的核心思路。
2025-03-28 20:53:58
286
原创 Redis中缓存更新,缓存穿透,缓存雪崩,缓存击穿
假设现在线程1过来访问,他查询缓存没有命中,但是此时他获得到了锁的资源,那么线程1就会一个人去执行逻辑,假设现在线程2过来,线程2在执行过程中,并没有获得到锁,那么线程2就可以进行到休眠,直到线程1把锁释放后,线程2获得到锁,然后再来执行逻辑,此时就能够从缓存中拿到数据了。,直到新开的线程完成这个逻辑后,才释放锁, 而线程1直接进行返回,假设现在线程3过来访问,由于线程线程2持有着锁,所以线程3无法获得锁,线程3也直接返回数据,只有等到新开的线程2把重建数据构建完后,其他线程才能走返回正确的数据。
2025-03-27 14:43:52
1295
原创 推荐的几个软件/插件
你肯定有这样的烦恼,设计好数据库还得设计DTO,PO,VO,实体类吧,还有什么controller,mapper,service等包名吧。这似乎很麻烦,而且不需要什么技术含量。
2025-03-20 19:04:14
513
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人