自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 执行一条 select 语句,期间发生了什么?

执行一条 SQL 查询语句,期间发生了什么?连接器:建立连接,管理连接、校验用户身份;查询缓存:查询语句如果命中查询缓存则直接返回,否则继续往下执行。MySQL 8.0 已删除该模块;解析 SQL,通过解析器对 SQL 查询语句进行词法分析、语法分析,然后构建语法树,方便后续模块读取表名、字段、语句类型;执行 SQL:执行 SQL 共有三个阶段:(1)预处理阶段:检查表或字段是否存在;将 select * 中的 * 符号扩展为表上的所有列。

2024-05-22 14:02:45 797

原创 Java并发常见面试题总结(中)

悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中和等独占锁就是悲观锁思想的实现。// 需要同步的操作try {// 需要同步的操作高并发的场景下,激烈的锁竞争会造成线程阻塞,大量阻塞线程会导致系统的上下文切换,增加系统的性能开销。

2024-05-09 11:52:19 851

原创 Java并发常见面试题总结(上)

何为进程? 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。 在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。 如下图所示,在 Windows 中通过查看任务管理器的方式,我们就可以清楚看到 Windows 当前运行的进程( 文件的运行)。 线程与进程相似,但线程是一个比进程更小

2024-04-30 16:32:16 241

原创 分布式和微服务

其实微服务架构本身就是一种分布式架构,它强调的是对部署在各个计算机上的应用服务的粒度。(如图)它的核心思想是,针对拆分的服务节点做更进一步的解耦。对于一些大型的互联网项目来说,微服务能够在不影响用户使用的情况下非常方便的实现产品功能的创新和上线。也就是说,针对 SOA 服务化架构下的单个业务服务,以更加细粒度的方式进一步拆分。是硬件的提升本身也是有瓶颈的,所以当企业对于计算要求越来越高的时候,集中式架构已经无。分布式系统的设计理念,其实是来自于小型机或者大型机的计算能力的瓶颈和成本的。

2023-10-19 11:16:14 1107

原创 Integer 使用不当导致生产的事故

某系统是做理财这块业务的,每天会收到一个基金公司的收益文件, 然后需要把这个文件解析并且保存每个用户的收益数据到数据库。在解析文件的时候,需要对数据的条数做校验,于是用到了Integer 这个对象并且使用==来判断。测试环境都没问题,但是到了生产环境上出现用户收益没有到账的问题,造成了大规模的投诉。最后定位才发现是收益文件验证失败导致没有被解析入库。所以这里就出现一个问题:“为什么两个 Integer 的对象不能用==号来判断?为什么测试环境没有把这问题测试出来”。

2023-10-19 11:08:50 343

原创 一致性 Hash 算法

一致性 hash,是一种比较特殊的 hash 算法,它的核心思想是解决在分布式环境下, hash 表中可能存在的动态扩容和缩容的问题。

2023-09-28 17:15:43 188

原创 Spring IoC 的工作流程

IOC 是什么Bean 的声明方式IOC 的工作流程IOC 是什么IOC 的全称是 Inversion Of Control, 也就是控制反转,它的核心思想是把对象的管理权限交给容器。应用程序如果需要使用到某个对象实例,直接从 IOC 容器中去获取就行,这样设计的好处是降低了程序里面对象与对象之间的耦合性。,使得程序的整个体系结构变得更加灵活。

2023-09-05 15:31:32 314

原创 Synchronized 锁升级的原理

总的来说, Synchronized 的锁升级的设计思想,本质上是一种性能和安全性的平衡,也就是如何在不加锁的情况下能够保证线程安全性。这种思想在编程领域比较常见,比如 Mysql 里面的 MVCC 使用版本链的方式来解决多个并行事务的竞争问题。

2023-09-01 13:58:50 152

原创 Mybatis 里面的缓存机制

一级缓存,是 SqlSession 级别的缓存,也叫本地缓存,因为每个用户在执行查询的时 候都需要使用 SqlSession 来执行, 为了避免每次都去查数据库,Mybatis 把查询出来的数据保存到 SqlSession 的本地缓 存中,后续的 SQL 如果命中缓存,就可以直接从本地缓存读取了。(如图)二级缓存的具体实现原理是: 使用 CachingExecutor 装饰了 Executor,所以在进入一级缓存的查询流程之前,会先通过 CachingExecutor 进行二级缓存的查询。

2023-08-31 13:52:10 110

原创 什么是负载均衡

除此之外,DNS 还可以根据不同的地域分配就近机房的 IP,比如长沙的小伙伴,可能会得到在湖南范围内最近的一个机房的 IP,在这个模式下可以实现「就近原则」实现请求处理,缩短了通信距离从而提升网站访问效率。由于 DNS 多级缓存的特性,当我们修改 DNS 配置之后,会因为缓存导致 IP 变更不及 时,从而影响负载均衡的效果。是让客户端的请求合理均匀的分发到多台目标服务器,由于请求被多个节点分发,使得服务端的性能得到有效的提升。为了解决这两个问题,引入了负载均衡的设计,简单来说,负载均衡机制的。

2023-08-31 13:49:08 421

原创 布隆过滤器

但是如果我们有几千万甚至上亿的数据的时候},虽然可以通过不同的数据结构来优化数据检索的时间复杂度,但是整体的效率依然很慢, 而且会占用非常多的内存空间,这个问题该怎么解决呢?检索的时候,使用同样的方式去映射,只要看到每个映射的位置的值是不是 1,就可以大概知道该元素是否存在集合中了。BitMap 的基本原理就是用一个 bit 位来存储当前数据是否存在的状态值,也就是把一个数据通过。这种方式适用于大规模数据,但数据状态又不是很多的情况,通常是用来判断某个数据存不存在的。

2023-08-22 14:56:30 61

原创 RPC和HTTP协议

基于这样的特点,在 RPC 协议底层的数据传输,即可以直接使用 TCP 协议,也可以使用 http 协议。而 Http 协议是为 Web 浏览器与 Web 服务器之间的通信而设计的远程通信协议,它 定义了通信协议的报文规范(如图),我们可以使用 http 协议来实现跨网络节点的数据传输。它的核心目标是,让开发人员在进行远程方法调用的时候,就像调用本地方法一样,不需要额外为了完成这个交互做过的编码。所以,通过这样一个模型,就实现了 RPC 的目标,让开发者在没有任何感知的情况下实现了远程方法的调用。

2023-08-22 14:42:54 906

原创 什么是负载均衡

关于负载均衡,我会从四个方面去说1. 负载均衡产生的背景2. 负载均衡的实现技术3. 负载均衡的作用范围4. 负载均衡的常用算法。

2023-08-22 14:18:12 1288

原创 什么是Netty

平时大家在网络编程过程中可能会遇到这样一种现象:客户端发送了一长串消息,服务端接受的消息揉在一起或者被拆分了,这样就会造成消息难以被正确理解。比如说有一天你特别想喝奶茶,看了一下外卖,某某奶茶看着不错,于是你在群里发了一条消息,想找几个人拼奶茶:奶茶有人喝吗?结果群里同事回了一句:现在不是已经三点了吗?你觉得莫名其妙,看了一眼同事的手机,他收到的消息是这样的两行:一点点奶茶有人喝吗?用专业的术语来说这种现象就是「拆包」了。

2023-08-11 17:11:32 256

原创 关于索引的底层实现,为什么选择 B+Tree 而不是红黑树?

一个红黑树的最小高度是 5,树的高度基本决定了磁盘的 IO 次数 ,所以使用 B+Tree 性能要高很多。,每个节点只需要一次 IO 就能完全载入,相当于一次 IO 载入了多个相邻的关键字和分支,而红黑树不具有这个特性,红黑树中大小相邻的数据,在物理结构上可能距离相差很大。因此基于局部性原理,以及 B+Tree 存储结构物理上的特性,所以 B+Tree 的索引性能比红黑树要好很多。2、B+Tree 有个特点是相邻的数据在物理上也是相邻的,因为 B+Tree 的 node 的大小设为一个页,而。

2023-08-11 16:23:04 122

原创 什么是MVCC

3、解决了一致性读的问题也就是事务启动时根据某个条件读取到的数据, 直到事 务结束时,再次执行相同条件,还是读到同一份数据,不会发生变化。这种情况下,可能会对数据库中的数据造成以下问题: a、 事物隔离性问题, b、出现脏读,幻读,不可重复读的问题。线程 A 与线程 B 同时进行写操作,这种情况下可能会存在数据更新丢失的问题。,乐观锁或者悲观锁解决写写冲突,从而最大程度的提高数据库并发性能。对于 MVCC 的理解,我觉得可以先从。的方式实现,降低了死锁的概率。

2023-08-11 10:13:10 137

原创 分布式事务的原理

1、强一致性,就是指通过第三方的事务管理器来协调多个节点的事务,保证每个节点的事务达到同时成功和同时失败,为了实现这样一个需求,我们会引入 Xopen/DTP 模型提供的 XA 协议,基于 2pc 或者 3pc 的方式来实现。但是,在如果全局事务管理器中的多个节点中,如果任意一个节点再进行事务提交确认时,由。弱一致性方案,就是针对强一致性方案所衍生出来性能和数据一致性平衡的一个方案,简单来说就是损失掉强一致性,数据在某一个时刻会存在不一致的状态,但是最终这些数据会达成一致。这样的好处是提升了系统的性能。

2023-08-11 10:04:27 109

原创 远程通信-RPC

有的小伙伴误以为,远程调用,是指跨域物理距离的远。实际上,远程调用是指跨进程的功能调用, 跨进程可以理解成一个计算机节点的多个进程, 或者多个计算机节点的多个进程。有的小伙伴误认为,远程就是距离远。其实,远程并不是指距离上的远程,而是指由于进程和进程之间彼跨越进程的。RPC 的概念与技术其实是比较早的,40 年前,也就是 1981 年由 Nelson 提出。1984 年,Birrell 和把它用于分布式系统间的通讯。Java 在 1.1 版本提供了 Java 版本的 RPC 框架(RMI)。

2023-08-10 13:47:20 1016

原创 Zookeeper与Redis 对比

使用分布式锁的目的,是为了保证同一时间只有一个 JVM 进程可以对共享资源进行操作。根据锁的用途可以细分为以下两类:1、 允许多个客户端操作共享资源,我们称为共享锁。这种锁的一般是对共享资源具有幂等性操作的场景,主要是为了避免重复操作共享 资源频繁加锁带来的性能开销。2、 只允许一个客户端操作共享资源,我们成为排他锁。

2023-08-10 08:27:02 1614

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

例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)

2023-08-08 17:14:44 596

原创 谈谈对Spring MVC的理解

SpringMVC 是一种基于 Java 语言开发,实现了 Web MVC 设计模式,请求驱动类型 的轻量级 Web 框架。SpringMVC采用了MVC 架构模式的思想,通过把 Model,View,Controller 分离,将 Web 层进行职责解耦,从而把复杂的 Web 应用分成逻辑清晰的几个组件,在 Spring MVC 中有9大重要的组件。对应的初始化方法是 initMultipartResolver(context),用于处理上传请求。

2023-08-08 13:52:39 742

原创 Spring Bean 生命周期的执行流程

Spring 生命周期全过程大致分为五个阶段:1、创建前准备阶段2、创建实例阶段3、依赖注入阶段4、 容器缓存阶段5、销毁实例阶段。

2023-08-08 09:27:00 463

原创 MySQL 优化

常见的 SQL 优化规则:1、SQL 的查询一定要基于索引来进行数据扫描2、避免索引列上使用函数或者运算,这样会导致索引失效3、where 字句中 like %号,尽量放置在右边4、使用索引扫描,联合索引中的列从左往右,命中越多越好。5、尽可能使用 SQL 语句用到的索引完成排序,避免使用文件排序的方式6、查询有效的列信息即可,少用 * 代替列信息7、永远用小结果集驱动大结果集。

2023-08-08 09:00:06 277

原创 死锁的发生原因和怎么避免

例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)

2023-08-04 16:55:48 84

原创 Spring Boot 中自动装配机制的原理

其实,自动装配的思想,在 SpringFramework3.x 版本里面的@Enable 注解,就有了 实现的雏形。@Enable 注解是模块驱动的意思,我们只需要增加某个@Enable 注解, 就自动打开某个功能,而不需要针对这个功能去做 Bean 的配置,@Enable 底层也是 帮我们去自动完成这个模块相关 Bean 的注入。在我看来,SpringBoot 是约定优于配置这一理念下的产物,所以在很多的地方,都会 看到这类的思想。接口,实现对这些配置类的动态加载。想,把这个配置类的全路径放在。

2023-08-04 16:14:58 495

原创 Redis 和 Mysql 如何保证数据一致性

一般情况下,Redis 用来实现应用和数据库之间读操作的缓存层,主要目的是减少数据库 IO,还可以提升数据的 IO 性能。如下图所示,这是它的整体架构。当应用程序需要去读取某个数据的时候,首先会先尝试去 Redis 里面加载,如果命中就直接返回。如果没有命中,就从数据库查询,查询到数据后再把这个数据缓存到 Redis 里面。

2023-08-04 11:56:31 579

原创 什么是服务网格?

(如图)于是,在第二代微服务架构下,引入了服务注册中心来实现服务之间的寻址, 并且服务之间的容错机制、负载均衡也逐步形成了独立的服务框架,比如主流的 Spring Cloud、或者 Spring Cloud Alibaba。之所以我们称 Service Mesh 为服务网格,是因为在大规模微服务架构中,每个服务的通信都是由 SideCar 来代理的,各个服务之间的通信拓扑图,看起来就像一个网格形状 (如图)。实际上,“微服务中所有的这些服务注册、容错、重试、安全等工作,都是为了保证服务之间通信的可靠性”。

2023-08-02 09:14:09 484

原创 网络四元组

此时建立的四元组就是(10.23.15.3,59461 , 192.168.8.135,8080) 其中,源端口号是每次建立连接的时候系统自动分配的。所以基于这两个原因,就引入了四元组的设计,也就是说,当一个客户端和服务端建立 一个 TCP 连接的时候,通过源 IP 地址、目标 IP 地址、源端口号、目标端口号来确定一 个。并且(如图),TCP 是全双工协议,也就是说数据允许在连接的两个方向上同时传输, 因此这里的客户端,如果是反向通信,它又变成了服务端。2、目标 IP 地址。唯一的 TCP 连接。

2023-08-02 08:50:36 433

原创 CAS 机制

例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)

2023-08-01 16:38:34 184

原创 b 树和 b+树的理解

图灵奖获得者(Niklaus Wirth )说过: 程序 = 数据结构 + 算法, 也就说我们无时无刻 都在和数据结构打交道。只是作为 Java 开发,由于技术体系的成熟度较高,使得大部分人认为:程序应该等于 框 架 + SQL?

2023-08-01 16:18:27 593

原创 ConcurrentHashMap底层具体实现以及实现原理

从以上看到,ConcurrentHashMap 里面有很多设计思想值得学习和借鉴。比如锁粒度控制、分段锁的设计等,它们都可以应用在实际业务场景中。当有足够的积累之后,会发现从这些技术底层的设计思想中能够获得很多设计思路。

2023-08-01 15:30:20 141

原创 什么叫做阻塞队列的有界和无界

什么叫做阻塞队列的有界和无界。

2023-08-01 15:29:24 307

原创 HashMap 是怎么解决哈希冲突的

Hash 表又叫做“散列表”,它是通过 key 直接访问在内存存储位置的数据结构,在具体实现上,我们通过 hash 函数把 key 映射到表中的某个位置,来获取这个位置的数据,从而加快查找速度。ii. 链式寻址法,这是一种非常常见的方法,简单理解就是把存在 hash 冲突 的 key,以单向链表的方式来存储,比如 HashMap 就是采用链式寻址法 来实现的。iv. 建立公共溢出区, 就是把 hash 表分为基本表和溢出表两个部分,凡事存 在冲突的元素,一律放入到溢出表中。

2023-08-01 15:28:20 249

原创 如何判断一个线程是否执行完

从两个方面思考。1. 在线程池内部,当我们把一个任务丢给线程池去执行,线程池会调度工作线程来执行这个任务的 run 方法,run 方法正常结束,也就意味着任务完成了。所以线程池中的工作线程是通过同步调用任务的 run()方法并且等待 run 方法返回后, 再去统计任务的完成数量。2. 如果想在线程池外部去获得线程池内部任务的执行状态,有几种方法可以实现。线程池提供了一个 isTerminated()方法,可以判断线程池的运行状态,我们可以循环判断 isTerminated()方法的

2023-08-01 15:22:34 730

原创 lock 和 synchronized 区别

c. Lock 比 Synchronized 的灵活性更高,Lock 可以自主决定什么时候加锁,什么时候释放锁,只需要调用 lock()和 unlock()这两个方法就行,同时 Lock 还 提供了非阻塞的竞争锁方法 tryLock()方法,这个方法通过返回 true/false 来 告诉当前线程是否已经有其他线程正在使用锁。d. Lock 提供了公平锁和非公平锁的机制,公平锁是指线程竞争锁资源时,如果 已经有其他线程正在排队等待锁释放,那么当前竞争锁资源的线程无法插队。

2023-07-25 08:12:47 45

原创 CPU 飙高系统反应慢怎么排查?

这两个过程需要 CPU 执行内核相关指令实现状态保存,如果较多的上下文切换会占据 大量 CPU 资源,从而使得 cpu 无法去执行用户进程中的指令,导致响应速度下降。既然是这两个问题导致的 CPU 利用率较高,于是我们可以通过 top 命令,找到 CPU 利用率较高的进程,在通过 Shift+H 找到进程中 CPU 消耗过高的线程,这里有两 种情况。最后有可能定位的结果是程序正常,只是在CPU 飙高的那一刻,用户访问量较大, 导致系统资源不够。导致 CPU 飙高的原因有几个方面。

2023-07-25 08:04:28 91

原创 innoDB如何解决幻读

next-key Lock 相当于间隙锁和记录锁的合集,记录锁锁定存在的记录行,间隙锁锁住 记录行之间的间隙,而 next-key Lock 锁住的是两者之和。间隙锁和 next-key Lock 的区别在于加锁的范围,间隙锁只锁定两个索引之间的引用间 隙,而 next-key Lock 会锁定多个索引区间,它包含记录锁和间隙锁。注意,这里强调的是范围查询, 也就是说,InnoDB 引擎要解决幻读问题,必须要保证一个点,就是如果一个事务通过 这样一条语句(如图)进行锁定时。

2023-07-21 08:48:14 610 1

原创 关于Spring Boot 的约定优于配置说明

2、Spring Boot 就是约定优于配置这一理念下的产物,它类似于 Spring 框架下的一 个脚手架,通过 Spring Boot,我们可以快速开发基于 Spring 生态下的应用程序。1、 首先, 约定优于配置是一种软件设计的范式,它的核心思想是减少软件开发人员 对于配置项的维护,从而让开发人员更加聚焦在业务逻辑上。总的来说,约定优于配置是一个比较常见的软件设计思想,它的核心本质都是为了更高效以及更便捷的实现软件系统的开发和维护。4、Spring Boot 约定优于配置的体现有很多,比如。

2023-07-21 08:26:56 477

原创 谈谈Seata

谈谈Seata

2023-07-19 08:36:19 32

原创 git上传代码

步骤如下:$ git init$ git push。

2023-03-15 15:24:27 46

空空如也

空空如也

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

TA关注的人

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