自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 SQL 和 NoSQL 有什么区别?

SQL是最通用和最广泛使用的选项之一,使其成为安全的选择,尤其适用于复杂的查询。此外,还有很多独立咨询可以帮助您使用SQL数据库进行大规模部署,但对于某些NoSQL数据库,您仍然需要依赖社区支持,并且只有有限的外部专家可用于设置和部署大规模NoSQL部署。SQL数据库是基于表的,另一方面NoSQL数据库是键值对,基于文档的,图形数据库或宽列存储。SQL数据库遵循ACID属性(原子性,一致性,隔离性和持久性),而NoSQL数据库遵循Brewers CAP定理(一致性,可用性和分区容差)。

2024-02-20 16:24:03 1644 1

原创 NoSQL 数据库有哪些类型?

NoSQL 数据库主要可以分为下面四种类型:

2024-02-18 11:39:57 485

原创 Bean 的作用域有哪些?

Spring 中 Bean 的作用域通常有下面几种:getBean()

2024-01-29 20:32:45 121

原创 如何保证缓存与数据库双写时的数据一致性?

读取数据的时候,如果发现数据不在缓存中,并且此时队列里有更新库存的操作,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也将发送到同一个jvm内部的内存队列中。多个读库更新缓存的请求串在同一个队列中是没意义的,因此可以做过滤,如果发现队列中已经有了该数据的更新缓存的请求了,那么就不用再放进去了,直接等待前面的更新操作请求完成即可,待那个队列对应的工作线程完成了上一个操作(数据库的修改)之后,才会去执行下一个操作(读库更新缓存),此时会从数据库中读取最新的值,然后写入缓存中。

2024-01-24 10:11:17 1397

原创 什么是缓存雪崩?

如果缓在某一个时刻出现大规模的key失效,那么就会导致大量的请求打在了数据库上面,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。均匀过期:设置不同的过期时间,让缓存失效的时间尽量均匀,避免相同的过期时间导致缓存雪崩,造成大量数据库的访问。如把每个Key的失效时间都加个随机值,造成缓存雪崩的关键在于同一时间的大规模的key失效,主要有两种可能:第一种是Redis宕机,第二种可能就是采用了相同的过期时间。分级缓存:第一级缓存失效的基础上,访问二级缓存,每一级缓存的失效时间都不同。

2024-01-20 12:12:02 405

原创 Redis的常用场景有哪些?

在很多互联网公司中都使用了分布式技术,分布式技术带来的技术挑战是对同一个资源的并发访问,如全局ID、减库存、秒杀等场景,并发量不大的场景可以使用数据库的悲观锁、乐观锁来实现,但在并发量高的场合中,利用数据库锁来控制资源的并发访问是不太理想的,大大影响了数据库的性能。集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。

2024-01-16 18:28:11 593

原创 Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

特性 ActiveMQ RabbitMQ RocketMQ Kafka 开发语言 java erlang java scala 单机吞吐量 万级,比 RocketMQ、Kafka 低一个数量级 同 ActiveMQ 10 万级,支撑高吞吐 10 万级,高吞吐,一般配合大数据类的系统来进行实时数据计算、日志采集等场景 topic 数量对吞吐量的影响 topic 可以达到几百/几千的级别,吞吐量会有较小幅度

2024-01-14 13:21:04 551

原创 Spring 如何解决循环依赖问题

此时进行初始化的第二步,发现自己依赖对象B,此时就尝试去get(B),发现B还没有被create,所以走create流程,B在初始化第一步的时候发现自己依赖了对象A,于是尝试get(A),尝试一级缓存singletonObjects(肯定没有,因为A还没初始化完全),尝试二级缓存earlySingletonObjects(也没有),尝试三级缓存singletonFactories,由于A通过ObjectFactory将自己提前曝光了,所以B能够通过。也就是构造器循环依赖和field循环依赖。

2024-01-10 17:36:06 489

原创 #{}和${}的区别?

#{}是占位符,预编译处理;${}是拼接符,字符串替换,没有预编译处理。 Mybatis在处理#{}时,#{}传入参数是以字符串传入,会将SQL中的#{}替换为?号,调用PreparedStatement的set方法来赋值。 Mybatis在处理时 , 是 原 值 传 入 , 就 是 把 {}时,是原值传入,就是把时,是原值传入,就是把{}替换成变量的值,相当于JDBC中的Statement编译 变量替换后,#{} 对应的变量自动加上单引号 ‘’;变量替换后,${} 对应的变量不会加上单引号 ‘’

2024-01-08 20:29:39 681

原创 Spring MVC 的核心组件

Bean组件是 Spring核心中的重点,Spring 就是面向Bean编程的(Bean Oriented Programming:BOP)就像Object 对OOP的意义一样,没有对象的概念就像没有面向对象的编程,在Spring中没有Bean也就没有Spring存在的意义。Bean组件在Spring的 org.springframework.beans 包下,在这个包下的所有类主要解决了3件事:Bean的定义、Bean的创建及对Bean的解析。Bean的解析过程非常复杂,功能被分的很细。

2024-01-06 15:49:51 1265

原创 AOP 有哪些实现方式?

实现 AOP 的技术,主要分为两大类:JDKCGLIBSpring AOPCGLIBCGLIBCGLIBfinalCGLIB。

2024-01-03 20:19:29 385

原创 throw 和 throws 的区别

Java 中的异常处理除了包括捕获异常和处理异常之外,还包括声明异常和拋出异常,可以通过 throws 关键字在方法上声明该方法要拋出的异常,或者在方法内部通过 throw 拋出异常对象。

2024-01-01 22:30:42 459

原创 MySQL 执行查询的过程

更新语句执行会复杂一点。需要检查表是否有排它锁,写 binlog,刷盘,是否执行 commit。

2023-12-29 18:22:22 358

原创 如何理解IoC和DI?(小知识)

这也是Spring的核心思想,通过面向接口编程的方式来是实现对业务组件的动态依赖。在实际应用中,Spring通过配置文件(xml或者properties)指定需要实例化的java类(类名的完整字符串),包括这些java类的一组初始化值,通过加载读取配置文件,用Spring提供的方法(getBean())就可以获取到我们想要的根据指定配置进行初始化的实例对象。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

2023-12-27 20:12:40 757

原创 Kafka怎么保证消息发送不丢失

这意味着当 Consumer 完成对一条消息的处理后,会向 Kafka 提交消息的偏移量(offset),告知 Kafka 这条消息已被成功处理。LEO 的大小相当于当前日志分区中最后一条消息的offset值加1.分区 ISR 集合中的每个副本都会维护自身的 LEO ,而 ISR 集合中最小的 LEO 即为分区的 HW,对消费者而言只能消费 HW 之前的消息。4. 设置适当的消费者参数:根据你的需求,你可以根据消息量、处理能力等因素来调整消费者的配置参数,以确保消费者的性能和可靠性。

2023-12-22 18:16:43 2356

原创 Kafka 如何保证高可用?

会继续提供读写服务,这就有达到了所谓的高可用性。节点去读取消息,但是只有当一个消息已经被所有。上的数据都会同步到其它机器,形成自己的多个。分散放在多个机器上的,每个机器就放一部分数据。分布在不同的机器上,这样才可以提高容错性。就无法提供读写服务,所以这个版本之前,出来,消息的生产者和消费者都跟这个。之后,就会返回写成功的消息给生产者。的时候,这个消息才会被消费者读到。写数据的时候,生产者只将数据写入。消费数据的时候,消费者只会从。上去,读的时候就直接读。同步好数据了,就会发送。所在节点宕机了,这个。

2023-12-20 11:11:30 681

原创 怎么查看MySQL语句有没有用到索引?

第一个select的id是1,第二个select的id是2。如const(主键索引或者唯一二级索引进行等值匹配的情况下),ref(普通的⼆级索引列与常量进⾏等值匹配),index(扫描全表索引的覆盖索引)。select_type:select关键字对应的那个查询的类型,如SIMPLE,PRIMARY,SUBQUERY,DEPENDENT,SNION。类型的查询虽然不是全表扫描, 但是它扫描了所有的索引, 因此比 ALL 类型的稍快.类型因为是全表扫描, 因此在相同的查询条件下, 它是速度最慢的. 而。

2023-12-18 10:21:12 121

原创 什么是Aop?

它与 OOP( Object-Oriented Programming, 面向对象编程) 相辅相成, 提供了与 OOP 不同的抽象软件结构的视角. 在 OOP 中, 我们以类(class)作为我们的基本单元, 而 AOP 中的基本单元是。动态代理:通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。静态代理 - 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类,因此也称为编译时增强;是通过继承的方式做的动态代理,因此如果某个类被标记为。来动态代理目标类。

2023-12-15 09:42:48 70

原创 Spring 事务中的事务传播行为

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。创建一个新的事务,如果当前存在事务,则把当前事务挂起。修饰的内部方法会新开启自己的事务,且开启的事务相互独立,互不干扰。使用的最多的一个事务传播行为,我们平时经常使用的。

2023-12-13 18:28:47 102

原创 什么是 spring 的内部 bean?

只有将 bean 用作另一个 bean 的属性时,才能将 bean 声明为内部 bean。为了定义 bean,Spring 的基于 XML 的配置元数据在。例如,假设我们有一个 Student 类,其中引用了 Person 类。这里我们将只创建一个 Person 类实例并在 Student 中使用它。内部 bean 总是匿名的,它们总是作为原型。

2023-12-10 18:58:01 110

原创 Spring 中的 bean 生命周期?

创建过程:首先实例化Bean,并设置Bean的属性,根据其实现的Aware接口(主要是BeanFactoryAware接口,BeanFactoryAware,ApplicationContextAware)设置依赖信息, 接下来调用BeanPostProcess的postProcessBeforeInitialization方法,完成initial前的自定义逻辑;销毁过程:如果实现了DisposableBean的destroy方法,则调用它,如果实现了自定义的销毁方法,则调用之。主要在创建和销毁两个时期。

2023-12-07 22:05:55 54

原创 将一个类声明为Spring的 bean 的注解有哪些?

我们一般使用 @Autowired 注解自动装配 bean,要想把类标识成可用于 @Autowired 注解自动装配的 bean 的类,采用以下注解可实现:

2023-12-06 23:06:49 83

原创 Spring的配置方式

、方法的注解(@Bean))注解,将 bean 配置为组件类本身,而不是使用 XML 来描述 bean 装配。您可以通过在相关的类,方法或字段声明上使用(例如:类的注解(@Controller、@Service、@Repository)、属性的注解(@Configuration 类允许通过简单地调用同一个类中的其他 @Bean 方法来定义 bean 间依赖关系。Spring 的 Java 配置是通过使用 @Bean 和 @Configuration 来实现。@Bean 注解扮演与。

2023-12-03 19:44:43 36

原创 Spring MVC 的核心组件

Spring MVC 对各个组件的职责划分的比较清晰。负责协调,其他组件则各自做分内之事,互不干扰。那么接下来就简单介绍一下。

2023-12-01 21:49:02 46

原创 Spring 框架中用到了哪些设计模式?

我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。:Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配。等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。Spring 事件驱动模型就是观察者模式很经典的一个应用。: Spring 中的 Bean 默认都是单例的。: Spring AOP 功能的实现。: Spring 中。

2023-11-30 19:50:12 39

原创 AOP 有哪些实现方式?

实现 AOP 的技术,主要分为两大类:JDKCGLIBSpring AOPCGLIBCGLIBCGLIBfinalCGLIB。

2023-11-28 19:38:17 83

原创 序列化和反序列化

如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。对于 Java 这种面向对象编程语言来说,我们序列化的都是对象(Object)也就是实例化后的类(Class),但是在 C++这种半面向对象的语言中,struct(结构体)定义的是数据结构类型,而 class 对应的是对象类型。

2023-11-24 17:48:35 35

原创 Java多线程:线程6种状态

等待状态,表示线程进⼊等待状态,进⼊该状态表 示当前线程需要其他线程通知(notify或者 notifyAll)Java 线程在运⾏的⽣命周期中的指定时刻只可能处于下⾯ 6 种不同状态的其中⼀个状态。运⾏状态,Java线程将操作系统中的就绪和运⾏两 种状态统称为"运⾏中"初始状态,线程被构建,但是还没有调⽤start()⽅法。查看Thread类中定义了⼀个State枚举类型。超时等待状态,可以指定等待时间⾃⼰返回。终⽌状态,表示当前线程已经执⾏完毕。阻塞状态,表示线程阻塞于锁。

2023-11-23 19:53:05 28

原创 Exception 和 Error 有什么区别?

例如,系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复。又可以分为运行时异常(RuntimeException, 又叫非受检查异常)和非运行时异常(又叫受检查异常)。来进行捕获,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。二者都是 Java 异常处理的重要子类,各自都包含大量子类。Java 中,所有的异常都有一个共同的祖先。属于程序无法处理的错误 ,我们没办法通过。:程序本身可以处理的异常,可以通过。

2023-11-22 21:03:30 32

原创 为什么要有 hashCode?

所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关(所谓哈希碰撞也就是指的是不同的对象得到相同的。如果不同的话,就会重新散列到其他位置。之后,判断元素是否在对应容器中的效率会更高(参考添加元素进。值来判断对象加入的位置,同时也会与其他已经加入的对象的。的介绍之后,下面这个问题已经难不倒你们了。相等的对象是否真的相同。的次数,相应就大大提高了执行速度。来判断是否真的相同。值相等并不代表两个对象就相等。值的对象,这时会调用。在对比的时候,同样的。

2023-11-21 15:18:03 45

原创 Java多线程:Thread.sleep(0)有意义吗?

让出CPU执行权,这个方法的底层是调用了操作系统的sleep或者nanosleep系统调用的。操作系统会把当前线程挂起,让出CPU执行权给到其他线程或者进程。Thread.sleep(0) 是Java中用于暂停线程的方法,是当前被暂停线程进入阻塞(有限时长等待)状态。然后操作系统的调度器,会再次根据优先级来选择一个线程来执行。,那么这个线程就会得到执行。如果没有,那么就会立即再次选择刚刚进入就绪状态的这个线程来执行。同时操作系统会设置一个定时器,当定时器是时间到了之后,操作系统会再次唤醒这一个线程。

2023-11-19 13:14:58 135

原创 Java多线程:synchronized的用法有哪些?作用呢?

①如果一个线程A调用一个实例对象的非静态 synchronized 方法,而线程B需要调用这个实例对象所属类的静态 synchronized 方法,是允许的,不会发生互斥现象,因为访问静态 synchronized 方法占用的锁是当前类的锁。②尽量不要使用 synchronized(String s) ,因为JVM中,字符串常量池具有缓冲功能。

2023-11-18 23:11:35 51

原创 Java多线程:synchronized 和 ReentrantLock 区别是什么?

可重入锁:重入锁,也叫做递归锁,可重入锁指的是在一个线程中可以多次获取同一把锁,比如: 一个线程在执行一个带锁的方法,该方法中又调用了另一个需要相同锁的方法,则该线程可以直接执行调用的方法,而无需重新获得锁, 两者都是同一个线程每进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。相比synchronized,ReentrantLock增加了一些高级功能。主要来说主要有三点:①等待可中断;③可实现选择性通知(锁可以绑定多个条件)

2023-11-16 19:23:51 56

原创 lock 和 synchronized 区别?

d. Lock 提供了公平锁和非公平锁的机制,公平锁是指线程竞争锁资源时,如果 已经有其他线程正在排队等待锁释放,那么当前竞争锁资源的线程无法插队。3. 从性能方面来看,Synchronized 和 Lock 在性能方面相差不大,在实现上会有一 些区别,Synchronized 引入了偏向锁、轻量级锁、重量级锁以及锁升级的方式来优化加锁的性能,而 Lock 中则用到了自旋锁的方式来实现性能优化。加锁对象的声明周期来控 制锁的作用范围,比如锁对象是静态对象或者类对象,那么这个锁就是全局锁。

2023-11-15 19:57:43 50

原创 ArrayList自动扩容机制是什么?

随着在程序里面不断的往 ArrayList 中添加数据,当添加的数据达到 10 个的时候, ArrayList 就没有多余容量可以存储后续的数据。扩容的具体流程很简单,然后使用 Arrays.copyOf 方法把老数组里面的数据拷贝到新的数组里面。扩容完成后再把当前要添加的元素加入到新的数组里面,从而完成动态扩容的过程。ArrayList 是一个数组结构的存储容器,默认情况下,数组的长度是 10.首先,创建一个新的数组,这个新数组的长度是原来数组长度的 1.5 倍。

2023-11-13 20:41:25 49

原创 SpringBoot解决跨域问题

常见的解决跨域问题的方法有两种,一种是 jsonp,另一种是 CORS。如果一个网站需要访问另一个网站的资源,浏览器会先发送一个 OPTIONS 请求, 根据服务器返回的 Access-Control-Allow-Origin 头信息,决定是否允许跨域访问。所以,我们只需要在服务器端配置 Access-Control-Allow-Origin 属性,并配置允许 哪些域名支持跨域请求即可。只能访问同源(协议、域名、端口号均相同)的资源,而不能访问其他源(协议、域名、 端口号任意一个不同)的资源。

2023-11-12 20:04:02 45

原创 Java有哪些数据类型?

Java虚拟机规范讲到:在JVM中并没有提供boolean专用的字节码指令,而boolean类型数据在经过编译后在JVM中会通过int类型来表示,此时boolean数据4字节32位,而boolean数组将会被编码成Java虚拟机的byte数组,此时每个boolean数据1字节占8bit。2.引用数据类型建立在基本数据类型的基础上,包括数组、类和接口。另外,Java 语言中不支持 C++中的指针类型、结构类型、联合类型和枚举类型。对于 boolean,官方文档未明确定义,它依赖于 JVM 厂商的具体实现。

2023-11-10 19:55:50 58

原创 @Component和@Bean注解区别

的类,将这些类的实例化对象注入到Spring的ioc容器中,而bean注解是修饰在方法层面上,它是在配置类中手动声明和配置Bean的定义然后将方法的返回值对象注入到Spring的ioc容器中。通过这个注解,Spring会自动去创建这个注解标识的类的实例对象注入到Spring的ioc容器中。)中声明一个Bean的,通常用在配置类中的方法上,将方法的返回值对象注入到Spring的ioc容器中。通过bean注解,我们可以创建和配置Bean的初始化过程,包括Bean的名称、作用域、依赖关系等。

2023-11-09 19:39:11 527

原创 为什么有些公司禁止使用@Transactional 声明式事务?

如果方法存在嵌套调用,而被嵌套调用的方法也声明了@Transaction 事务,就会 出现事务的嵌套调用行为,容易引起事务的混乱造成程序运行结果出现异常。@Transaction 声明式事务是将事务控制逻辑放在注解中,如果项目的复杂度增加, 事务的控制可能会变得更加复杂,导致代码可读性和维护性下降。所以,为了避免这类问题,有些公司会推荐使用编程式事务,这样可以更加灵活地控制 事务的范围,减少事务的锁定时间,提高系统的性能。会带来锁的竞争影响性能,同时也会导致数据库 连接池被耗尽,影响程序的正常执行。

2023-11-09 19:34:37 487 1

原创 SpringBoot:请求限流

1. 使用Guava的RateLimiter:Guava是Google提供的一套Java库,其中包含了RateLimiter类,可以用于限制请求的速率。你可以将RateLimiter作为一个Bean注入到Spring Boot的配置类中,并在需要进行限流的方法上使用该RateLimiter。通过调整RateLimiter的参数,如请求的速率和令牌桶的容量,可以控制请求的频率。这样,当同一个IP在指定的时间间隔内超过了最大请求次数,就会抛出异常,限制其请求次数。最后,在需要进行请求次数限制的方法上添加。

2023-11-07 20:47:40 644

空空如也

空空如也

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

TA关注的人

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