当前位置: 首页 > news >正文

2025最新版Java面试八股文大全

一、Java并发面试题
1、 ThreadLocal

1.1 谈谈你对ThreadLocal的理解?
ThreadLocal的作用主要是做数据隔离,填充的数据只属于当前线程,变量的数据对别的线程而言是相对隔离的。它不是针对程序的全局变量,只是针对当前线程的全局变量。

1.2 ThreadLocal底层实现原理?
Threadlocal内部有一个非常关键的内部类ThreadlocalMap,里面定义了一个由key - value组成的Entry数组,key存放的就是当前的线程,value为我们所需的数据。 而key是弱引用会被gc清除,value是强引用不会被清除,所以会造成内存泄漏。如果我们在线程池中使用了Threadlocal,一定要记得调用remove()方法,避免ThreadLocal 保存的数据被泄漏或污染!!!

 public void set(T value) {//进行set方法时,先获取当前线程对象,根据当前线程获取ThreadLocalMap,//然后以当前Threadlocal为key进行存储Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}
2、synchronized相关问题

2.1 synchronized与Reentrantlock的区别

  • synchronized是一个关键字,属于JVM层面的,Reentrantlock是一个类,是API层面的;
  • synchronized是自动加锁、释放锁,Reentrantlock则需要手动加锁和释放;
  • synchronized底层有一个锁升级的过程(偏向锁—轻量级锁----重量级锁)

当一个线程获取一个琐时,此时该锁为偏向锁,当第二个线程尝试获取锁时,该锁会升级为轻量级锁,底层通过自旋来实现(不会造成线程阻塞),当自旋次数过多,会升级为重量级锁,会造成线程阻塞。

2.2 volatile关键字如何保证可见性和有序性

  • 可见性:对加了volatile的成员变量进行修改时,会直接将cpu高级缓存区的数据放到主内存中,对这个数据的读取,会直接从主内存中取。
  • 有序性:对加了volatile的成员变量进行读写时,会插入内存屏障,防止指令重排,保障了有序性。

volatile只有写操作是原子性的,也就是数据操作完成后会立刻刷新到主内存中。但是被volatile修饰的变量在读的时候可能会被多个线程读,所以它不能保证原子性。

2.3 Java如何避免死锁

  • 注意加锁的顺序,保证每个线程按顺序进行加锁;
  • 加锁时限,可以设置一个超时时间;
  • 注意死锁检查,这是一种预防机制,可以确保发生死锁的第一时间进行处理。
3、 多线程(线程池)

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

对这份笔记感兴趣的小伙伴可以点击文末名片免费获取

3.1 线程有哪些状态(生命周期)
新建、就绪、运行、阻塞、死亡
在这里插入图片描述
3.2 如何获取多线程的返回值?
深坑!如果问多线程的创建方式,你一定知道是继承Thread类,实现runnable,callable接口。这里就是拐了个弯,变相的了解有返回值的callable接口。通过中间媒介FutureTask,将实现callable接口的类对象传递进去,调用FutureTask里面的get()方法,即可获取多线程的返回值。

3.3 为什么使用线程池,几个参数?
降低资源消耗(创建、销毁耗资源),提高响应速度(任务来了,可以有线程直接使用);

  • 核心线程数、 最大线程数量、最大空闲时间、 空闲时间单位、任务队列、 线程工厂、拒绝策略;
4、并发相关问题

4.1、 并行、串行、并发?

  • 并行: 同一时刻,多个任务互不干扰的同时进行;
  • 串行:任务排队,一个一个执行;
  • 并发:同一时刻,只有一个任务,多个任务交替执行;

4.2、 谈谈对AQS的理解,AQS如何实现可重入锁?

  • AQS是一个Java线程同步的框架,是JDK很多锁的核心实现框架。
  • 在AQS中,维护了一个信号量state和一个由线程组成的双向链表队列。其中,这个线程队列就是给线程排队的,而state就像是红绿灯,用来控制线程排队或者放行的。不同场景下,有不同的意义。
  • 在可重入锁(锁了还可以再锁)场景下,state表示加锁次数,0表示无锁,每加一次锁,state就加1,释放锁state就减1。点击阅读并发编程小结;
三、mysql相关问题

笔者总结了一篇Mysql高级,涉及内容较深些,也是常问的面试题,点击链接查阅

Mysql高级篇

1、Mysql索引

1.1 索引的类型可以是String类型吗?
聚簇索引----数据和索引放一块,像主键索引,具有唯一性(Innodb就是)
数据库第一范式:必须要有id,这个id是自带索引的。

一般用自增id,字符串可以做id,但是不好,像uuid做的id是随机的,都没有排序!!!不像自增id维护索引的成本会很低

在这里插入图片描述

1.2 什么是索引?什么情况下用索引?什么时候不用?

1)就是一种数据结构,目的就是为了快速查找数据。
2)对查询频率高(索引就是为了提高查询效率),像where后的字段
数据量特别大, 索引不是越多越好,会影响增删的效率,典型的用空间换时间。
分组字段可以建立索引,因为分组的前提是排序(覆盖索引)
3)频繁更新的字段、查询少的、参与计算的不适合建索引。

1.3 索引失效?

在MySQL中,查询不走索引可能有以下几种情况:

  1. 数据量太小:如果表中的数据量比较小,MySQL会选择进行全表扫描而不使用索引,因为全表扫描的开销可能比使用索引更小。

  2. 对索引列进行了函数操作:如果在查询语句中对索引列进行了函数操作或表达式运算,MySQL无法使用索引进行优化,因此可能不走索引。

  3. 范围查询:如果查询语句中包含范围查询(例如大于、小于、区间查询等),MySQL可能无法使用索引进行优化,导致不走索引(模糊查询like,%前置不会走,后置会走)。

  4. 数据分布不均匀:如果索引列的数据分布不均匀,索引的选择性较低,MySQL可能选择进行全表扫描而不使用索引。

在进行MySQL索引优化时,需要考虑以上情况,并通过分析查询语句、优化索引设计、适时更新统计信息等方法,提高MySQL查询性能,尽可能减少不走索引的情况。

1.4 查看索引使用和查看索引信息?
索引使用: explain 结果 (只要数字大于1)1 row in set 即生效了
查看索引信息: show indexs from 表名

1.5 复合索引?最左匹配原则?
最核心的是等值比较
复合索引就是多个字段放一块(企业最常用的是符合索引!!!唯一索引,普通索引我们也用)
mysql会一直向右查询,直到遇到范围查询(> < like),比如用 a b c d四个字段创建了一个复合索引, a=3 b=5 c>7 d=9 只会用到前三个,因为b c d 是根据a 的后面进行规则的排序,即a是有序的,后面的bcd是无序的。 (hash索引用的不多,因为无序,但是定位快,了解即可)

1.6 Btree和B+tree?为什么mysql用的是B+ tree?**
B+tree是Btree的升级版。
Btree:多路平衡树,当增删数据时,会自动的将数据进行这个平衡(旋转)
为什么从Btree转到B+tree 因为:索引也是一个文件,存档在磁盘,在使用时读入到内存。内存是有限的,如果索引文件过大,无法一次性全部加载,需要分批加载。在有限磁盘的限制下,B+tree可以减少磁盘的I/O。

对于B+tree,所有的数据都存在叶子节点,根和非叶子节点只是存储的指针,指向下一个数据的地址,由叶子节点再去查找到关联的数据信息。对于查询的数据,都要从root节点走到叶子节点,所以查询相比于Btree更加稳定。

在这里插入图片描述
对于mysql,是在B+tree的基础上,在相邻节点间增加了一个链表指针,形成了带有顺序的B+tree,提高了区间的访问性能。
在这里插入图片描述
1.7 覆盖索引与回表
如果只需要在一棵索引树上就可以获取Sql所需要的所有列,就不需要回表查询,这样查询速度会更快。而实现覆盖索引最快的方式就是将所需要的字段放在一起建一个联合索引。

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

对这份笔记感兴趣的小伙伴可以点击文末名片免费获取
1.8 Mysql的锁有哪些?什么是间隙锁?
从锁的粒度来分
1、行锁:加锁粒度小,但是加锁的资源开销比较大。Innodb支持。
1)共享锁:多个事务可以共享一把锁,但是只能读不能修改
2)排他锁:只有一个事务可以获得排他锁,其他事务不能获取该行的锁。Innodb会自行对增删改操作添加排他锁。
2、表锁:加锁粒度大,加锁的资源消耗小,Mysalm和Innodb都支持。
3、全局锁:加锁后全库都处于只读状态,用于全库数据备份。

1.9 海量数据下,如何快速找到一条数据
1)使用布隆过滤器,快速过滤不存在的数据;
2)red is中建立数据缓存
3)查询优化

2、数据库分库分表

2.1 数据库的分库分表?什么时候分?怎么分?
当单表数据超过1000W时,很多操作的性能会下降,所以需要切分,以减少数据库的压力,缩短查询时间。
垂直切分:将关系联系不紧密的表进行分库,将一张表中不常用的字段进行抽取新建一张表。优点类似于微服务。
水平切分:当一个应用难以再细粒度的垂直切分,根据数据间的逻辑进行划分,比如客户、存款、支付;
2.2 数据库的优化
1)sql优化以及索引的优化,索引建立要合理,过多会影响增删性能
2)数据可设计要满足他的三大范式、五大约束
3)硬件优化

2.3 表设计的时候注意哪些,字段?

在设计数据库表时,需要注意以下几点,特别是在定义字段的时候:

  1. 数据类型选择:选择最适合的数据类型可以减小数据库表的存储空间,提高检索效率。对于整数、浮点数、字符串等不同类型的数据,选择合适的数据类型是设计表结构时的关键之一。

  2. 索引设计:根据实际查询需求设计合适的索引,可以提高查询效率。通常在主键、外键、经常用于查询的字段上创建索引。

  3. 主键设计:选择一个唯一、稳定、易于理解的字段作为主键,以确保每条记录都有唯一标识,便于数据访问和管理。

  4. 字段命名规范:字段命名应具有描述性,易于理解和记忆,建议使用下划线分隔(如:first_name),避免使用含糊不清或缩写的字段名。

  5. 字段约束:定义字段的约束条件,如NOT NULL、UNIQUE、DEFAULT值等,可以保证数据的完整性和一致性。

  6. 数据冗余:避免数据冗余,尽可能将重复的数据抽取成单独的表,以减小数据存储量,同时避免数据更新异常。

  7. 参照完整性:在设计外键关系时,保证参照完整性,确保相关数据的一致性,避免数据关联异常。

  8. 考虑数据增长:预估数据表的增长情况,选择适当的存储引擎和分区方案,以支持未来数据量的增长。

综上所述,在设计数据库表结构时,字段的数据类型、索引设计、主键选择、命名规范、约束条件、数据冗余、参照完整性、数据增长等方面都需要认真考虑,以保证数据库表的稳健性、性能和灵活性。

3、数据库事务

spring里面的事务和mysql里面的事务是一个概念,如果mysql不支持事务,加上@transation也是无效的。但是spring里面的@transation不能用于分布式环境下,分布式多线程下用的是senta+@globalTransation注解。
3.1 @transation用于类和方法有什么区别?
@transation只能修饰public方法。
类上:相当于在所有的public方法上加上了@transation注解
方法:会覆盖类上的配置。

3.2 事务的4个条件ACID
原子性:所有的操作是一个整体,要么全部成功,要么全部失败(回滚)
一致性:事务开始前后,数据库的完整性没有被破坏,也就是写入的资料完全符合我们的预设。
隔离性:允许多个并发事务对数据进行读写操作,它可以有效的防止多个事务并发执行时由于交叉执行而导致数据的不一致。(隔离性里面有4个隔离级别:读未提交、读以提交、可重复读、串行化)
持久性:事务完成,对数据的操作就是永久的,即使系统故障也不会丢失。

3.3 mysql事物隔离级别?

MySQL 提供了四种隔离级别,用于控制事务之间的隔离程度,以确保事务操作的一致性和并发性。这四种隔离级别分别是:

  1. 读未提交(Read Uncommitted):最低的隔离级别,允许一个事务读取另一个事务未提交的数据。可能会出现脏读(Dirty Read)问题。

  2. 读提交(Read Committed):其他事务提交后才能读取数据,避免脏读问题。但可能会出现不可重复读(指的是在同一个事务中,某个查询操作在不同时间点内多次执行,但由于其他事务的并发操作,在多次执行过程中返回的数据结果不一致的情况)问题。

  3. 可重复读(Repeatable Read):保证在同一个事务中多次读取同一行数据时,结果始终一致。避免了脏读和不可重复读问题。但依然可能存在幻读(在相同的查询条件下,不同的事务在不同时间点执行查询操作时,可能会看到不同数量的行,从而产生"幻像"的错觉)问题。

  4. 串行化(Serializable):最高的隔离级别,通过确保事务串行执行来避免脏读、不可重复读和幻读问题。确保所有事务的并发执行不会导致数据不一致。

在 MySQL 中,可以通过设置事务的隔离级别来控制事务的隔离程度,从而灵活地平衡并发性能和数据的一致性。开发者可以根据实际需求选择合适的隔离级别来确保数据操作的正确性和安全性。

4、Mysql其他问题

4.1 mysql中的null和空值有什么不一样?
1)空值是不占空间的,null值占用空间。两者就像:空值是真空状态的杯子,而null值是装满空气的杯子。
2)查寻上:null 值是用is null/is not null来查询,而空值( ’ ’ )则可以用 = > !=等。 在使用聚合函数count时,会过滤掉null,而不会过滤掉 ( ’ ’ )值。
在实际开发中,没有特定需求,可以直接使用空值!!!

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题
对这份笔记感兴趣的小伙伴可以点击文末名片免费获取

4.2 mysql主从数据库延时的原因?

MySQL主从数据库延时可能有多种原因,以下是一些常见的原因:

  1. 网络延迟:主从数据库之间的网络连接如果不稳定或者网络质量差,会导致数据同步的延迟。

  2. 主从数据库负载:主数据库的负载过高,或者从数据库的性能不足,都可能导致数据同步延迟。

  3. 数据量过大:如果要同步的数据量过大,或者有大量的写操作,都会增加同步的时间。

  4. 复制方式设置不当:MySQL复制方式(如异步复制、半同步复制等)的配置不合理也会导致延时。

  5. 主从数据库版本不兼容:如果主从数据库的版本不一致或不兼容,也可能导致数据同步延迟。

在排查MySQL主从数据库延时问题时,可以逐一检查上述可能的原因,逐步定位并解决问题。

4.3 mysql主从复制的过程?

MySQL主从复制是一种常见的数据库复制技术,用于将主数据库中的数据实时同步复制到从数据库。以下是MySQL主从复制的基本过程:

  1. 配置主数据库:首先需要在主数据库上开启二进制日志(Binary Log),并配置主机的唯一标识(Server ID)。

  2. 配置从数据库:在从数据库上配置连接主数据库的信息,包括主数据库的IP地址、端口号、用户名密码等。同时设置从数据库的唯一标识(Server ID)。

  3. 启动主从复制过程:在从数据库上执行CHANGE MASTER TO命令,指定主数据库的连接信息,并启动从数据库与主数据库的连接。

  4. 数据传输与同步:当主从数据库连接成功后,主数据库会将变更写入二进制日志,并通过主从复制线程将这些变更传输给从数据库,从数据库接收到变更后应用于自身数据库,实现数据同步。

  5. 监控与维护:定期检查主从数据库的状态,确保主从复制正常运行。如果发现延迟或同步失败,需要及时排查并解决问题。

总的来说,MySQL主从复制的过程包括配置主从数据库、启动复制、数据传输与同步以及监控与维护等步骤。通过主从复制,可以实现数据的备份、负载均衡以及容灾等功能。

四、JVM虚拟机

笔者此前在其他博客上整理过,不在重复,链接如下:

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

对这份笔记感兴趣的小伙伴可以点击文末名片免费获取

五、Redis面试题
1 、缓存雪崩、缓存穿透、缓存击穿
  • _缓存雪崩:_缓存同一时间大面积失效,大量请求打到数据库上,数据库承受不住崩掉;
    解决方案:过期时间设置成随机、缓存预热(系统出初启动,先存数据到缓存里)
  • _缓存穿透:_数据库和redis中都没有数据,导致大量数据查询数据库,导致数据库崩掉;
  • 可以将不存在的请求key的value 设置成一个字符串返回,这样就避免了黑君攻击到数据库。
    解决方案: 接口层进行校验(id<0的直接拒绝)、采用布隆过滤器
  • _缓存击穿:_redis的一个key失效,请求全部打到数据库(缓存没有数据库有);
    解决方案: 热点数据永不过期,设置成空字符串返回
2、 如何保证数据库和Redis的数据一致性

当我们遇到这个问题时,要考虑是先删缓存,还是先写数据库。
延时双删: 先删redis缓存数据,再更新数据库,然后再删redis缓存,这样就避免了删除redis和更新数据库这期间,其他的线程读不到redis里的值,去读数据库里的旧数据。

将操作可串行化(先写在读就可以了)
1)先删缓存,将更新数据库操作放到一个有序队列中
2)从缓存中查不到的查询操作,都进入有序队列(MQ)
问题:大量读请求积压--------> 将队列水平拆分

3、Redis的数据结构及使用场景

String :字符串 ----------原子计数器
List :列表 ---------微博、微信等消息流数据
Set :无序集合 ---------好友推荐
Zset :有序集合 -----------排行榜
Hash :哈希表 ----------适合存储对象

----------------------------------前五种为常见,后四种为面试加分项-------------------------------------------
bitmap:布隆过滤器
GeoHash:坐标,(存储坐标的)基于Zset的score进行排序就可以得到坐标附近的值
HyperLoglog: 统计不重复数据,用于大数据基础使用
Streams:内存版的Kafka,消息的订阅发布

4、Redis持久化机制有哪些

基于内存,宕机数据会消失,所以需要持久化。有两种方式

  • RDB:Redis DateBase
    在指定的时间间隔内将内存中的数据以快照的形式写入磁盘,实际是fork(分支)一个子进程,先将数据复制写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储。

优点:

  • 整个redis数据库将只有一个dump.rdb文件,方便持久化;
  • 容灾性好,方便备份;
  • 性能最大化,fork子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。使用单独子进程来进行持久化,主进程不进行任何的IO操作,保证了Redis的高性能;
  • 相对于数据集大时,比AOF的启动效率更高;

缺点:

  • 数据安全性低。持久化期间Redis发生故障,会有数据丢失;

AOF: Append Only File
以日志的形式记录服务器的每一个写、删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到详细的操作记录

优点:

  • 数据安全,每次修改都会被记录到磁盘中;
  • 通过append模式写文件,即使Redis宕机,也不会破坏已经存在的内容,可以通过redis-check-aof工具解决数据一致性问题;

缺点:

  • 效率没有RDB高;
  • AOF文件比RDB大,且恢复速度慢;
5、Redis其他常见问题

5.1 Redis线程模型,单线程为什么快?

单线程快的原因有以下几点:

  • 纯内存操作
  • 核心是基于非阻塞的IO多路复用机制(单个线程可以同时处理多个请求)
  • 单线程避免了多线程来回切换的上下文环境切换问题

5.2 Redis分布式锁的实现原理
set(key,value,setnx,setpx)
setnx----------->加锁的命令
setpx----------->锁的过期时间
setnx+setp在高版本中已经整合为一个原子命令。
当任务超时,锁自动释放怎么办?可以使用redission的看门狗,会自动续期。

  1. 获取锁

    • 客户端使用SET命令尝试在Redis中设置一个特定的键作为锁,可以设置一个固定的值作为锁持有者的标识,同时设置一个过期时间(防止锁无法释放导致死锁)。
    • 设置键时使用NX参数(即只在键不存在时才能设置成功),这样可以确保只有一个客户端能够成功设置该键,获得了锁。
  2. 释放锁

    • 当客户端要释放锁时,可以通过DEL命令来删除这个键,确保该锁被释放。
  3. 防止死锁

    • 设置锁时可以为键设置一个合理的过期时间,以防止锁无法释放导致死锁。即使持有锁的客户端在处理任务时发生异常退出,保证锁在一定时间后会自动释放。
  4. 避免误删除

    • 尽量不要使用DEL命令直接删除锁,因为可能会误删其他客户端的锁。可以使用Lua脚本来确保原子性操作,只有持有锁的客户端才能成功释放锁。

总的来说,Redis分布式锁的实现原理基于对Redis的SET命令设置NX参数进行加锁和DEL命令释放锁,配合合理设置过期时间来保证分布式锁的正确性和稳定性。通过合理设计和管理分布式锁,可以帮助多个客户端在分布式环境中协调访问共享资源,避免竞争条件和数据不一致问题。

5.3 Redis主从复制的原理
简述好下面的流程图即可(基本使用哨兵模式,基于主从复制的基础上,可以保证高可用,哪个节点挂了就重新选举)
在这里插入图片描述

5.4、Redis 到底是单线程还是多线程?
Redis6.0 版本之前的单线程指的是网络 I/O 和键值对读写是由一个命令完成的;
Reds6.0 版本之前只有网络请求模块和数据操作模块是单线程的,而其他的特久化,集群数
据同步,其实是由额外的线程完成的
Redis6.0 版本之后的多线程指的是网络请求过程采用了多线程,而键值对的读写命令依然是单线程处理,所以Redis 是线程安全的。命令的执行排队执行
5.5、 单线程为什么快?
内存操作、单线程操作没有线程切换开销、全局 hash表 〈一维数细:链表〉查找快
5.6、Redis 底层数据如何用跳表来存储的?
跳表:将有序链表改造为支持近似“折半查找”算法,可以快速的插入、删除、查找操作。
5.7、Redis 的Key过期了,为什么没有释放?
有两种删除策略:
惰性删除:当读到一个过期的key时触发删除
定时删除:惰性删除无法及时删除,所以 Redis默认每 100ms 主动删除一批己过期的 key,导致可能出现部分 key 过期但没被清理的情况,导致内存并没有被释放。
小坑:如果使用set命令修改某个key 的valve 值,没有加过期时间参数,这个key会被设定为永久有效。
5.8、 Redis 没设置过期期间,为什么被 Redis 主动删除了?
当Redis 已用内存超过最大内存时,会触发主动清理策略(8种),对过期key所有 key设置了处理。可能触发了对所有key 的筛选删除(LRU:最近最少使用,LFU:最少频率使用)。
5.9、删除key 的命令,会阻塞 Redis吗?
删除 String 类型,时间复杂度 o(1),删除单个列表、集合或 hash 类型的key时间复杂度为 o(M);
5.10、一次线上事故,Redis 主从切换导致了缓存雪崩
(要保证主从库机器时钟一致)我们假设,slave 的时钟比master 的时钟快很多。我们在master 里设置了过期的key, slave的角度看,可能会有很多在master里没有过期的数据己经过期了。如果此时操作主从切换,把 slave提升为新的master,就会开始清理大量的key;会导致以下结果:
① Master大量清理 key,主线程阻塞,无法及时处理客户端请求;
② Redis 大量数据过期,引发缓存雪崩。

5.11、线上Redis 持久化策略一般如何设置?
默认 RDB, 如果对性能要求较高,在master最好不要做持久化,可以在某个 slave 开启 AOF
备份数据,策略设置为每秒同步一次即可。
5.12、一次线上事故,Redis 主节点宕机导致数据全部丢失
如果 Redis 采用以下模式部署,就会发生数据丢失问题:
master-slave+哨兵部署实例 +master 没有开启持久化功能 +Redis 进程使用supervisor管理,并配罟宕机重启。
这样在master言机,哨兵还未发起切换,supervisor 会将 master 立马拉起,但因为 master
没有设置持久化,就相当于是空实例,其他的 slave为了会master 保持数据同生,也会变成一个个空实例,也就发生了数据丟失。
避免:不要给 Redis 主节点设置宕机立马重启,而应该等哨兵把某个 slave选为 master之后,在重启原来宕机的主节点,让其变成 slave。
5.13、Redis主从复制风暴是怎么回事?
Redis 主节点有多个从节点,在某一时刻主节点挂了,重启后从节点重新连上主节点后,进行全量复制,数据量大,加重网络和服务器的页载。避免方法:使用哨兵或集群模式。

red is集群是通过分片技术,hash到不同的节点上

六、SSM和SpringBoot
1、Spring相关问题

Spring必问ioc和aop,基本程序员都知道,但如果想要获得好的印象,拉开差距,就要回答出更深的理解,阅读过源码是最好的,总结过一些spring的细节问题,点击链接阅读spring杂记

1.1 Spring是什么?谈谈IOC和AOP的理解
Spring是一个企业级的应用框架,减化了配置,简化了项目部署环境。

IOC: 容器概念、控制反转、依赖注入

  • ioc容器:
    实质就是一个map(key,value)里面存放了各种对象(xml里的bean节点,@Service 、@Conroller、@Compent等),在项目启动时,会读取配置文件里的bean节点,根据全限定类名使用反射创建对象,存入到map中。这个时候map里就有我们需要的各种对象了,当我们需要使用时,通过DI(@Autowired、@Resource等注解,xml里的ref标签)注入的方式去取。

  • 控制反转:
    没有引入ioc容器前,我们A对象依赖于B对象,需要自己手动的去new,引入ioc后,需要B对象的时候ioc自己主动去创建一个B对象到A需要的地方。A对象获取B对象的过程,从主动变成了被动,这个就是控制反转的由来。

  • 依赖注入:
    依赖注入是实现IOC的方法,就是在IOC运行期间,主动的将某种依赖关系注入到对象中;

AOP:将程序中的交叉业务逻辑(日志、异常、安全)封装成一个切面,对符合其要求的对象进行一个增强,比如一个方法的增强,在方法执行前或执行后做一些额外的事(通过beanPostProcessor实现)。

1.2 说一下Spring的事务机制

Spring的事务机制是基于数据库事务和AOP。
对于加了@Transation的注解,会创建一个代理对象作为bean,当调用代理对象方法时,会判断该方法上是否加了@Transation的注解,如果加了,就利用事务管理器创建一个数据库连接,将autocommit改为false,禁止自动提交,事务结束没有异常就提交,反之回滚。

什么时候@Transation会失效?方法加了private私有时会失效。非代理对象调用也会失效

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记************【点击此处即可】****************免费获取

1.3 Spring 的bean生命周期
Spring的bean生命周期里面涉及的内容很多,这里只是说一个大致流程,面试非大厂足够了

有一个类 UserService.class-------->推断构造方法(默认无参构造)--------->实例化(普通对象)---------->依赖注入(属性赋值,加了@Autowire -------> 初始化前(@PostConstruct) -------->初始化(initializingBean)--------> 初始化后(AOP)---------> 代理对象 ------>bean

读取配置信息获取到beandefinition(BeanDefinition 是定义 Bean 的配置元信息接口),存入到map中,推断bean的构造方法,进行实例化,然后进行属性赋值,在初始化后会进行aop的切面,如果创建的bean是单例的,会将单例bean放入到单例池中。之后进行bean的使用,使用完后会调用
destroy()方法进行销毁;

2、SpringMVC执行流程

1、具体执行流程如下,面试前背下来即可(截图可放大)!

在这里插入图片描述
2、父子容器

springmvc创建了一个自己的容器,并且继承了spring的容器?
是,在 Spring MVC 中,DispatcherServlet会创建一个自己的 ApplicationContext 容器,这个容器是继承自 Spring 应用程序的根 ApplicationContext 容器的。
具体过程如下:

  1. 启动 Spring 应用程序时,会创建一个根 ApplicationContext 容器。这个容器包含了应用程序中所有的bean,如 Service 层和 Repository 层的 bean。

  2. 当 DispatcherServlet 被初始化时,它会创建自己的 ApplicationContext 容器。这个容器是根ApplicationContext 容器的子容器。

  3. DispatcherServlet 容器会继承根 ApplicationContext 容器中的所有 bean,因此可以访问这些bean。但根 ApplicationContext 容器无法访问 DispatcherServlet 容器中特有的 bean,如Controller 等。

这种父子容器的关系提供了以下优点:

  • 关注点分离: Web 层的 bean 和业务层的 bean 被分隔在不同的容器中,提高了代码的可维护性。

  • 资源隔离: Web 层的资源不会影响到业务层,提高了应用程序的健壮性和安全性。

  • 依赖管理: DispatcherServlet 容器可以访问根容器中的所有 bean,无需重复定义。

总之,Spring MVC 通过创建自己的 ApplicationContext 容器并将其设置为根容器的子容器,实现了父子容器的架构设计,提高了应用程序的模块化和可扩展性。

在这里插入图片描述

3、Springboot自动装配原理

Springboot有一个引导类叫SpringBootApplation,在这个类里面有很多注解,@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
与我们自动装配有关的是@EnableAutoConfiguration这个注解,这个注解里面有个@import注解,里面导入了AutoConfigurationImportSelector这样一个类,在这个类里面有个getCandidateConfigurations方法,这个方法就会找到Meta文件下的spring.factories,在spring.factories里面有很多全路径类名,通过反射加载到ioc容器中

问:spring.factories里面的类都会全部加载吗?不是的,符合条件的才会进行加载!

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份好像面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

对这份笔记感兴趣的小伙伴可以点击文末名片免费获取

在这里插入图片描述
在这里插入图片描述

相关文章:

2025最新版Java面试八股文大全

一、Java并发面试题 1、 ThreadLocal 1.1 谈谈你对ThreadLocal的理解&#xff1f; ThreadLocal的作用主要是做数据隔离&#xff0c;填充的数据只属于当前线程&#xff0c;变量的数据对别的线程而言是相对隔离的。它不是针对程序的全局变量&#xff0c;只是针对当前线程的全局…...

从零开始学AI,完成AI 企业知识库的AI问答搭建

1&#xff1a;本地安装一个ollama玩下&#xff0c;ollama下载模型默认路径为C盘&#xff0c;但该盘空间不足。 解决方案&#xff1a;添加系统环境变量OLLAMA_MODELS&#xff0c;设置其值为新的路径。 2&#xff1a;安装完成后&#xff0c;访问http://127.0.0.1:11434/ 查看服务…...

路过石岩浪心古村

周末常去的七彩城堡儿童乐园附近经常有老房子&#xff0c;没想到老房子最多的地方还是浪心古村。而且越看越有历史。 见到一座写着《序西书室》的房子&#xff0c;我最开始以为是一个古代的学校。但是查了百度更加不知道什么意思了哈。‌“序西书室”‌是指《文心雕龙》中的一个…...

【Leecode】Leecode刷题之路第93天之复原IP地址

题目出处 93-复原IP地址-题目描述 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 93-复原IP地址-官方解法 方法1&#xff1a;回溯 思路&#xff1a; 代码示例&#xff1a;&#xff08;Java&…...

121. 买卖股票的最佳时机

题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/?envTypestudy-plan-v2&envIdtop-100-liked 算法思路&#xff1a; 虽然已经提示我们使用贪心算法了&#xff0c;但是我最开始的时候却不知道怎么使用&#xff0c;因为如果…...

Python Polars快速入门指南:LazyFrames

前文已经介绍了Polars的Dataframe, Contexts 和 Expressions&#xff0c;本文继续介绍Polars的惰性API。惰性API是该库最强大的功能之一&#xff0c;使用惰性API可以设定一系列操作&#xff0c;而无需立即运行它们。相反&#xff0c;这些操作被保存为计算图&#xff0c;只在必要…...

OpenCV-Python实战(10)——形态学

1、腐蚀 cv2.erode() 可以删除图像中的噪音点。 可以删除毛边。 分割图像&#xff08;当图像连接的不够紧密时&#xff09; 。 img cv2.erode(src*,kernel*,anchor*,iterations*,borderType*,borderValue*)img&#xff1a;目标图像。 src&#xff1a;原始图像。 kernel&…...

在Windows上读写Linux磁盘镜像的一种方法

背景 嵌入式开发中&#xff0c;经常会把系统的Linux磁盘镜像保存到Windows上&#xff0c;以便上传到网盘备份或发送给工厂&#xff0c;但是如果想读取/修改镜像中的某个文件&#xff0c;一般有2种方案&#xff1a; 直接访问 就是用虚拟磁盘软件将镜像文件挂载成磁盘&#xf…...

基于STM32F103控制L298N驱动两相四线步进电机

文章目录 前言一、模块参数二、接口说明三、准备工作四、直流电机驱动引脚接线效果展示 五、两相四线步进电机驱动步进电机相关概念拍数驱动时序引脚接线效果展示 六、参考示例 前言 L298N 是一种常见的双 H 桥电机驱动模块&#xff0c;广泛用于驱动直流电机和步进电机。它基于…...

Blazor开发中注册功能设计研究

Blazor开发中注册功能设计是为了用户可以高效、安全地完成注册并登录系统。以高效和用户友好为目标,结合校验、注册和登录功能,为用户提供一个完整的账户管理流程,同时保障系统安全性和稳定性。注册页面应该结构清晰、布局合理,既满足基本注册功能,又通过响应式设计与视觉…...

Docker安装体验kuboard-k8s多集群管理工具

文章目录 1.kuboard是什么&#xff1f;2.docker安装命令2.1 Linux上docker环境安装命令2.2 Windows上docker环境安装命令 3.登录访问3.1首页访问地址3.2 默认账号密码3.3 登录页3.4 首页 4总结 1.kuboard是什么&#xff1f; 参看官网: https://kuboard.cn/gitHub项目地址&…...

组建基于IPV6的网络

现在很多单位使用IPV6的网络&#xff0c;地址资源紧张的状况得到了缓解&#xff0c;很多单位目前采用双栈运行&#xff0c;就是网络设备上同时跑IPV4和IPV6。 IPV6的网络与IPV4网络的配置与IPV4基本相同&#xff0c;注意地址规则与格式的不同。 长度&#xff1a;     IPv6地…...

浙江肿瘤医院病理库存储及NAS共享存储(磁盘阵列)方案-Infortrend普安科技

Infortrend金牌代理-燊通智联信息科技发展&#xff08;上海&#xff09;有限公司与院方多轮沟通&#xff0c;详细讨论性能与容量要求&#xff0c;最终决定采用GSe统一存储设备&#xff0c;与现有病理系统服务器无缝对接&#xff0c;每台设备配1.92T SSD作缓存加速原数据读写&am…...

UE5在蓝图中使用VarestX插件访问API

在Fab中安装好VarestX免费插件 这个插件可以用来远程请求http和api等&#xff0c;返回json等格式内容 插件网址 https://www.fab.com/zh-cn/listings/d283e40c-4ee5-4e73-8110-cc7253cbeaab 虚幻里开启插件 然后网上随便搜个免费api测试一下&#xff0c;这里我找了个微博热搜…...

QML学习(五) 做出第一个简单的应用程序

通过前面四篇对QML已经有了基本的了解&#xff0c;今天先尝试做出第一个单页面的桌面应用程序。 1.首先打开Qt,创建项目&#xff0c;选择“QtQuick Application - Empty” 空工程。 2.设置项目名称和项目代码存储路径 3.这里要注意选择你的编译器类型&#xff0c;以及输出的程…...

Java日志框架:log4j、log4j2、logback

文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…...

tcp 的重传,流量控制,拥塞控制

tcp 的重传解决了什么问题tcp的几种重传机制分别解决什么问题?方案 1: 超时重传方案2: 快速重传选择性确认(sack)d-sack(重复接收) 滑动窗口:累计应答 流量控制解决什么问题?如何做的?问题1: 那如果第一次发送的数据都大于缓冲区的大小怎么办?问题2: 如果剩余大小为0会发生…...

【多时段】含sop的配电网重构【含分布式电源】【已更新视频讲解】

1 主要内容 之前分享了很多配电网重构的程序&#xff0c;每个程序针对场景限定性比较大&#xff0c;程序初学者修改起来难度较大&#xff0c;本次分享一个基础程序&#xff0c;针对含sop的配电网重构模型&#xff0c;含风电和光伏&#xff0c;优化了33节点网络电压合理性&…...

angular管道传多个参数

比如有个时间管道 time.pipe.ts import { Pipe, PipeTransform } from angular/core;Pipe({ name: time }) export class TimePipe implements PipeTransform {transform(value: any,type: any,isTime: boolean,): string {// 具体逻辑不写了} }使用的时候对时间字段的处理只需…...

STM32高级 以太网通讯案例1:网络搭建(register代码)

需求描述 驱动W5500芯片&#xff0c;设置好IP&#xff0c;测试网络是否连通。 思考&#xff1a; 驱动W5500芯片是通过spi协议&#xff0c;所以和spi相关的有四个引脚&#xff0c;MOSI&#xff08;主出从入&#xff09;MISO&#xff08;主入从出&#xff09;SCK&#xff08;时…...

strncpy函数和使用案例

strncpy 是 C 语言标准库函数之一&#xff0c;用于字符串操作。它的功能是将源字符串&#xff08;source&#xff09;中的字符复制到目标字符串&#xff08;destination&#xff09;中&#xff0c;但最多复制 n 个字符。如果源字符串的长度小于 n&#xff0c;则目标字符串剩余的…...

Python调用Elasticsearch更新数据库

文章目录 Elasticsearch介绍Python调用Elasticsearch更新数据库 Elasticsearch介绍 Elasticsearch是一个基于Lucene的搜索引擎&#xff0c;它提供了一个分布式、多租户能力的全文搜索引擎&#xff0c;具有HTTP web接口和无模式的JSON文档。Elasticsearch是用Java开发的&#x…...

阿里云-将旧服务器数据与配置完全迁移至新服务器

文章目录 一&#xff1a;创建镜像二&#xff1a;将创建好的镜像复制到新服务器所在的目标地域&#xff08;如果新服务器与镜像在同一地域就不用进行这一操作&#xff09;三&#xff1a;将镜像配置到新服务器上四&#xff1a;导出安全组&#xff08;如果新服务器与旧服务器使用同…...

redis cluster实验详解

华子目录 实验环境准备部署redis cluster添加节点删除节点redis cluster集群维护 实验 环境准备 再开3台主机 先把之前3台源码编译的redis删除 [rootredis-node1 ~]# cd /usr/local/redis/ [rootredis-node1 redis]# make uninstall[rootredis-node2 ~]# cd /usr/local/redi…...

网络技术-QoS策略以及如何定义 流分类,流行为,流策略

一&#xff1a;QoS策略简介 QoS策略由如下部分组成&#xff1a; 类&#xff0c;定义了对报文进行识别的规则。 流行为&#xff0c;定义了一组针对类识别后的报文所做的QoS动作。 通过将类和流行为关联起来&#xff0c;QoS策略可对符合分类规则的报文执行流行为中定义的…...

【小程序】自定义组件的data、methods、properties

目录 自定义组件 - 数据、方法和属性 1. data 数据 2. methods 方法 3. properties 属性 4. data 和 properties 的区别 5. 使用 setData 修改 properties 的值 自定义组件 - 数据、方法和属性 1. data 数据 在小程序组件中&#xff0c;用于组件模板渲染的私有数据&…...

实验五 时序逻辑电路部件实验

一、实验目的 熟悉常用的时序逻辑电路功能部件&#xff0c;掌握计数器、了解寄存器的功能。 二、实验所用器件和仪表 1、双 D触发器 74LS74 2片 2、74LS162 1片 3、74194 1片 4、LH-D4实验仪 1台 1.双…...

时序论文34|AdaWaveNet:用于时间序列分析的自适应小波网络

论文标题&#xff1a;AdaWaveNet: Adaptive Wavelet Network for Time Series Analysis 论文链接&#xff1a;https://arxiv.org/abs/2405.11124 论文代码&#xff1a;https://github.com/comp-well-org/AdaWaveNet/ 前言 这篇文章面向非平稳时间序列进行分析与建模&#x…...

Maven怎么会出现一个dependency-reduced-pom.xml的文件

问题 今天打包时突然发现&#xff0c;多出了一个名为dependency-reduced-pom.xml的文件 解决方法 由于使用了maven-shade-plugin插件导致的&#xff0c;在 <plugin> 标签下添加 <configuration><createDependencyReducedPom>false</createDependencyR…...

Vue.js组件(6):echarts组件

1 前言 本章主要对常用的echars图表展示进行基本的组件封装。使用该组件前需要在项目中引入echarts。官网&#xff1a;Apache ECharts npm install echarts --save 2 图表组件 2.1 折线图组件 组件属性&#xff1a;chartId&#xff0c;指定图表挂载div的id&#xff0c;注意不…...

在低版本 CUDA 环境下安装高 CUDA 版本的 PyTorch 及 DGL

项目中&#xff0c;代码环境需要 PyTorch 1.12.0 以上版本&#xff0c;但服务器上的 CUDA 版本仅为 10.1&#xff0c;官方支持的 PyTorch 最高版本为 1.7.0。导致无法直接使用所需的 PyTorch 版本。而且&#xff0c;DGL 也需要 0.9.1 版本&#xff0c;而 CUDA 10.1 不支持该版本…...

【SpringMVC】REST 风格

REST&#xff08;Representational State Transfer&#xff0c;表现形式状态转换&#xff09;是一种访问网络资源的格式。传统的资源描述方式通常如下&#xff1a; http://localhost/user/getById?id1http://localhost/user/saveUser 而 REST 风格的描述则更简洁&#xff1a…...

windows C#-使用对象初始值设定项初始化对象

可以使用对象初始值设定项以声明方式初始化类型对象&#xff0c;而无需显式调用类型的构造函数。 以下示例演示如何将对象初始值设定项用于命名对象。 编译器通过首先访问无参数实例构造函数&#xff0c;然后处理成员初始化来处理对象初始值设定项。 因此&#xff0c;如果无参…...

【Sentinel】流控效果与热点参数限流

目录 1.流控效果 1.1.warm up 2.2.排队等待 1.3.总结 2.热点参数限流 2.1.全局参数限流 2.2.热点参数限流 2.3.案例 1.流控效果 在流控的高级选项中&#xff0c;还有一个流控效果选项&#xff1a; 流控效果是指请求达到流控阈值时应该采取的措施&#xff0c;包括三种&…...

安装与配置

《PHP Libxml》是一个在PHP中处理XML和HTML文档的重要库。它提供了丰富的API&#xff0c;支持DOM、SimpleXML和XMLReader等多种解析方式&#xff0c;广泛应用于各种编程语言和项目中。 安装与配置 安装: 在PHP中&#xff0c;libxml扩展通常是默认启用的。如果你需要手动安装&…...

optuna和 lightgbm

文章目录 optuna使用1.导入相关包2.定义模型可选参数3.定义训练代码和评估代码4.定义目标函数5.运行程序6.可视化7.超参数的重要性8.查看相关信息9.可视化的一个完整示例10.lightgbm实验 optuna使用 1.导入相关包 import torch import torch.nn as nn import torch.nn.functi…...

SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持

可以看到springai对多模态的支持. 同样去创建一个项目 也是跟之前的项目一样,修改版本1.0.0 这里 然后修改仓库地址,为springai的地址 然后开始写代码...

ONLYOFFICE 协作空间 3.0 新功能详解

ONLYOFFICE 协作空间 3.0 新功能详解 书接上文&#xff1a; ONLYOFFICE 协作空间 3.0 发布: 新增虚拟数据房间、用户类型、OAuth 2.0 等更新 简单的介绍了一下 ONLYOFFICE 协作空间 3.0 的新功能&#xff0c;今天我们详细介绍一下这些新功能。 关于 ONLYOFFICE 协作空间 O…...

湖南引力:低代码助力实现智慧养老管理系统

“低代码开发宛如一座神奇的桥梁&#xff0c;它以简洁高效的方式连接起创意与应用&#xff0c;降低了开发门槛&#xff0c;为企业和开发者带来前所未有的便捷与可能&#xff0c;开启了快速实现软件梦想的新征程。” ——王港&#xff0c;湖南引力科技有限公司 湖南引力科技有…...

React里使用lodash工具库

安装 使用命令 npm install lodash 页面引入 常见的引入方式 引入整个lodash对象&#xff1a; import _ from lodash按名称引入特定的函数&#xff1a; import { orderBy } from "lodash"; tips: 这两种引入方式都会引入整个lodash库&#xff0c; 体积大&#x…...

机器人C++开源库The Robotics Library (RL)使用手册(二)

由于RL库采用跨平台CMake源码,可以轻松在win、ubantu等平台部署、编译,win通常用VS编译器,为了便于使用、阅读,需要将CMake编译成VS工程。 1、准备三个工具:CMake、VS、QT 为了在Windows上编译RL和依赖项,您需要安装一个编译器(例如。,Visual Studio 2017)和跨平台构…...

Excel无法插入新单元格怎么办?有解决方法吗?

在使用Excel时&#xff0c;有时会遇到无法插入新单元格的困扰。这可能是由于多种原因导致的&#xff0c;比如单元格被保护、冻结窗格、合并单元格等。本文将详细介绍3种可能的解决方案&#xff0c;帮助你顺利插入新单元格。 一、消冻结窗格 冻结窗格功能有助于在滚动工作表时保…...

2024年-全球使用Delphi统计

Delphi是一款集成开发环境&#xff08;IDE&#xff09;&#xff0c;旨在支持开发者高效地构建桌面、移动、Web 以及控制台应用程序&#xff0c;特别适合追求速度与效率的快速应用开发&#xff08;RAD&#xff09;流程。 根据 theirstack.com 网站的数据&#xff0c;我们大致描…...

行为树详解(5)——事件驱动

【分析】 如果行为树的节点很多&#xff0c;那么会存在要经过很多节点才会走到动作节点的情况。显然&#xff0c;性能上不如状态机。 每帧都需要重新遍历一系列节点才会走到动作节点&#xff0c;而实际上很多条件节点在数帧内不会有变化&#xff0c;这是造成性能问题的重要原…...

为什么深度学习和神经网络要使用 GPU?

为什么深度学习和神经网络要使用 GPU&#xff1f; 本篇文章的目标是帮助初学者了解 CUDA 是什么&#xff0c;以及它如何与 PyTorch 配合使用&#xff0c;更重要的是&#xff0c;我们为何在神经网络编程中使用 GPU。 图形处理单元 (GPU) 要了解 CUDA&#xff0c;我们需要对图…...

Kinova在开源家庭服务机器人TidyBot++研究里大展身手

在科技日新月异的今天&#xff0c;机器人技术在家庭场景中的应用逐渐成为现实&#xff0c;改变着我们的生活方式。今天&#xff0c;我们将深入探讨一篇关于家用机器人研究的论文&#xff0c;剖析其中的创新成果&#xff0c; 论文引用链接&#xff1a;http://tidybot2.github.i…...

Elasticsearch检索之三:官方推荐方案search_after检索实现(golang)

Elasticsearch8.17.0在mac上的安装 Kibana8.17.0在mac上的安装 Elasticsearch检索方案之一&#xff1a;使用fromsize实现分页 快速掌握Elasticsearch检索之二&#xff1a;滚动查询(scrool)获取全量数据(golang) 1、search_after检索 在前面的文章介绍了fromsize的普通分页…...

Day1 微服务 单体架构、微服务架构、微服务拆分、服务远程调用、服务注册和发现Nacos、OpenFeign

目录 1.导入单体架构项目 1.1 安装mysql 1.2 后端 1.3 前端 2.微服务 2.1 单体架构 2.2 微服务 2.3 SpringCloud 3.微服务拆分 3.1 服务拆分原则 3.1.1 什么时候拆 3.1.2 怎么拆 3.2 拆分购物车、商品服务 3.2.1 商品服务 3.2.2 购物车服务 3.3 服务调用 3.3.1 RestTemplate 3.…...

shell编程7

声明 学习视频来自B站UP主 泷羽sec for循环与while循环 for 循环 例子 代码如下: for i in seq 1 100 do echo $i done或者 for i in $(seq 1 100) do echo $i done 反引号的作用 在 shell 脚本中&#xff0c;反引号用于命令替换。它会将反引号中的命令执行&#xff0c;…...

Spring Boot中幂等性的应用

在 Spring Boot 中&#xff0c;幂等性是实现分布式系统设计和接口调用的一个重要概念&#xff0c;尤其在高并发、分布式环境下&#xff0c;确保接口重复调用不会引发系统数据异常至关重要。 幂等性概念 幂等性&#xff08;Idempotence&#xff09;是指一次请求和重复多次请求…...