自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 彻底理解数据库的DDL DML DQL DCL

DDL(数据定义语言):定义数据库和数据库对象结构(如表、视图、索引)。DML(数据操作语言):操作表中的数据(如查询、插入、更新、删除)。DQL(数据查询语言):查询数据库中的数据,实际上是 DML 的一个子集,主要涉及SELECT语句。DCL(数据控制语言):控制数据库的访问权限。

2024-12-18 08:53:35 528

原创 彻底理解数据库何时需要分表问题

所以说2000W只是一个参考值,比如阿里巴巴的500W,可能要是考虑到服务器的性能,以前的磁盘都是机械硬盘,现在都是固态硬盘了,所以说这个数量其实也可以往上进行浮动一些,还有可能也是考虑到数据要进行备份恢复的话,如果单表太大,想要备份恢复的风险也比较大,也不利于备份和恢复。非叶子节点是不会存数据的,所以第一层B+数只会存索引(我这里是int类型,占4字节)和执行下一个节点的指针(占6字节),所以在一个索引页里面就会占到10个字节,就可以计算出第一层数据 = 16184 / 10 ≈ 1618个索引加指针;

2024-12-18 08:51:18 1911

原创 彻底理解如何优化接口性能

大事务就是指的历经时间很长的事务,比如说使用了sprind的transaction的管理事务,就有可能会启动大事务,因为spring的事务管理原因是将多个事务合并在一个执行中,如果同一个接口有多个数据库读写,并且该接口并发大的话,就有可能导致大量的数据锁在数据库中,造成大量的阻塞,进而导致数据库连接池连接耗尽,所以需要将大数据进行拆分,将非事务操作和事务操作进行区分出来。虽然是反范式的设计,但是冗余数据可以减少多表关联查询,如果在分库分表的时候,可以在不同的库上冗余同一张数据,这样就可以不需要跨库查询了。

2024-12-17 17:19:38 976

原创 彻底理解如何解决接口幂等性问题

定义:同一个接口,多次发出同一个请求,必须保证操作只执行一次。调用接口发生异常并且重复尝试时,总是会造成系统所无法承受的损失,所以必须阻止这种现象的发生,比如下面这些情况,如果没有实现接口幂等性会有很严重的后果,比如:1.支付接口,重复支付会导致多次扣钱;2.订单接口,同一个订单可能会多次创建。

2024-12-17 16:42:48 310

原创 快速理解类的加载过程

虚拟机把Class文件加载到内存,并对数据进行校验、转换解析和初始化,形成可以虚拟机直接使用的Java类型,即java.lang.Class,如下图:接下来会对该三个步骤逐一进行解释。

2024-12-16 22:27:42 1252

原创 快速理解分布式事务Seate基本知识

TCC和SAGE这么就不做降级了,《彻底理解分布式事务的各种解决方案》对这两种做了详细解释,需要了解的可以查看一下。XAATTCCSAGA一致性强一致弱一致弱一致最终一致隔离性完全隔离基于全局锁隔离基于资源预留隔离无隔离代码侵入无无有,需要编写三个接口有,需要编写状态机和补偿业务性能差好非常好非常好场景对一致性、隔离性有高要求的业务基于关系型数据库的大多数分布式场景都可以1.对事务要求较高的事务;2.有非关系型数据库要产于的事务。

2024-12-13 15:28:28 1770

原创 彻底理解分布式事务的各种解决方案

分布式事务是指一个业务流程跨越多个分布式系统或服务的事务处理,它需要确保在多个参与者之间的数据一致性和原子性。它解决的问题就是当一个业务需要操作多个微服务时,每个微服务都有自己本地的事务,但其中一个微服务出现了问题时,这些微服务的事务怎么进行一个回滚。

2024-12-13 13:20:52 751

原创 JVM调优之如何排查内存占用过高问题

显示的当前进程下按照最大容量的倒序排名,可以看到具体的实例数和占用的字节数,也可以定位到具体的代码,比如这个里的UserInfo。需要再jvm中先设置开启参数,当程序发生OOM的时候,就会生成dump文件。对于内存占用过高的问题,其实有一个比较标准的排查流程。就可以在OOM的时候生产dump文件到自定目录。查看到PID为3441的内存占用率很高。

2024-12-12 20:27:44 437

原创 JVM调优之如何排查CPU长时间占用过高的问题

通过jstack定位到对于的堆栈信息,一般会有两种问题,第一种是和垃圾回收相关(垃圾回收相关的线程),这个时候,就需要排查是不是系统出现了内存泄漏,或者是内存不足导致垃圾回收器在疯狂的工作,第二种可以定位到相关的线程信息,如果定位到线程信息,基本上就是跟代码有关系,比如说在多线程中使用HashMap,这个时候问题代码就可能定位到HashMap的put方法,因为多线程使用HashMap可能造成死循环问题,或者就是代码里面触发无限循环,所以也会定位到具体的代码。4.将第3步得到的线程ID转成16进制。

2024-12-11 23:54:51 551

原创 彻底理解分布式锁怎么解决缓存击穿问题

1.选择Redis分布式锁:如果你需要高性能、低延迟的分布式锁,尤其是缓存击穿的场景,Redis是更好的选择,它能快速加锁和释放锁,适合高并发场景,如果系统对一致性要求不是非常严格,并且你能够容忍少量的锁竞争和死锁的风险,Redis的实现会更加轻量和高效;2.选择Zookeeper分布式锁:如果你的系统对一致性、可靠性和协调性有较高要求,尤其是需要锁的公平性和强一致性的场景,Zookeeper是更合适的选择,它能够保证分布式锁的状态一致性,适用于需要高度可靠性和资源协调的场景。

2024-12-11 11:36:37 1249

原创 彻底理解布隆过滤器怎么解决缓存穿透问题

在谈布隆过滤器之前,需要先了解Bitmaps,它是Redis的一种高级数据结构。定义:Bitmaps(位图)是一种数据结构,用于表示一个由二进制位(bit)组成的集合,每个二进制位的值可以是 0 或 1,通常用于表示某些状态或者集合中元素的存在与否,位图在内存中高效地存储和操作大量的布尔值(即 0 或 1),因此在许多场景中,特别是在高效存储和查找时,具有非常重要的应用。比如现在要去存一个1 3 5 7,在BitMap里面怎么表示?

2024-12-10 23:27:37 2284

原创 彻底理解synchronized常见使用方法

特性synchronized 方法synchronized 代码块synchronized 静态方法作用范围整个方法代码块中的特定部分整个静态方法锁的对象当前对象实例 (this)可以是任意对象(如 this, new Object(), Class)类对象 (Class)粒度比代码块粗更细粒度,可以同步某一段代码对整个静态方法同步适用场景适用于所有线程共享实例数据的场景适用于需要控制并发的特定代码部分适用于静态数据或静态方法的并发控制性能。

2024-12-08 23:04:18 968

原创 彻底理解ThreadLocal的应用场景和底层实现

ThreadLocal 是 Java 中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线程可以在任意时刻、任意方法中获取缓存的数据。其实是可以通过调用 Set() 方法往里面存入值,存入的值是每个线程互相隔离、互不影响的,每个线程都有一个 ThreadLocal 的空间来存 ThreadLocal 的数据,那么它是怎么做到每个线程互相隔离、互不影响的呢?这就需要从底层数据结构分析了。

2024-12-08 21:25:09 769

原创 彻底理解Sychronized的锁升级过程

通过线程的并发量来动态调节锁的实现的一种过程。

2024-12-08 15:46:51 340

原创 彻底理解线程池的状态

所以,这个状态更多的是对外的一种扩张,留着子类用的,比如我们自己实现一个线程池,会去继承 ThreadPoolExecutor,然后在terminated()方法做一些业务扩展。调用shutdownNow()方法后,线程池就会变为stop状态,此时不会再接受新的任务,如果阻塞队列中还有任务,也不会执行,此时只会执行线程池里面正在运行的任务。调用shutdown()方法后,线程池就会变为shutdown状态,此时不会再接受新的任务,如果阻塞队列中还有任务,此时还是会把阻塞队列里面的任务执行完。

2024-12-08 13:59:19 379

原创 快速理解线程创建的方法和原理

其实以上说的几种创建线程的方式,其底层原理都是基于Runnable来实现的。

2024-12-08 13:12:53 373

原创 彻底理解线程池的使用与原理

所以使用线程池的好处就可以避免线程的重复创建与销毁,进而减少系统的资源开销。

2024-12-08 00:17:04 1457

原创 快速理解倒排索引在ElasticSearch中的作用

倒排索引是一种数据结构,用来加速文本数据的搜索和检索,和传统的索引方式不同,倒排索引会被每个词汇项与包含该词汇项的文档关联起来,从而去实现快速的全文检索。

2024-11-27 16:53:26 616

原创 彻底理解如何保证ElasticSearch和数据库数据一致性问题

一个卖房业务,双十一前一天,维护楼盘的运营人员突然接到合作开发商的通知,需要上线一批热门的楼盘列表,上传完成后,C端小程序支持按楼盘的名称、户型、面积等产品属性全模糊搜索热门楼盘。1.功能需求:按楼盘的名称、户型、面积等产品属性全模糊搜索;2.非功能需求(比如性能、安全等):双十一期间,楼盘搜索QPS预计在800左右,搜索完成后展示的楼盘字段信息非常多。

2024-11-27 15:24:58 1963

原创 快速理解微服务中Gateway的概念

在微服务架构中,Spring Cloud Gateway 是一个用于API网关的框架它是一个基于 Spring Framework 的高效、可扩展的路由器和反向代理,它能够将外部请求转发到适当的微服务,并提供一些与请求处理相关的功能,如路由、负载均衡、限流、安全性等。

2024-11-26 22:26:30 1005

原创 快速理解微服务中Ribbon的概念

1.在微服务架构中,Ribbon 是一个客户端负载均衡器,用于控制服务间的通信方式。2.Ribbon 是一个开源的库,最早由 Netflix 开发,用于实现客户端负载均衡。3.Ribbon 主要解决的是在微服务架构中,多个服务实例之间进行通信时如何选择合适的服务实例的问题。但是 Ribbon 已经停止了主动维护。(Netflix 于 2018 年宣布 Ribbon 将不再作为新功能的开发重点,并在后续的版本中减少了对 Ribbon 的支持,官方表示,Ribbon 已经进入维护模式,意味着不会有新的功能更新和

2024-11-26 20:52:38 1626

原创 快速理解微服务中Fegin的概念

1.在传统的架构里面,我们是通过使用RestTemplate来访问其他的服务,但是这种方式就存在了一个很大的缺陷,也就是被调用方如果发生了服务的迁移(IP和端口发生了变化),那么调用方也需要同步的在代码里面进行修改,然后重启服务;2.这种方法在微服务新起以后,它的弊端就被无线放大,因此这个方式就逐渐的演变,然后形成了和,虽然我们使用注册中心解决服务发送迁移等等其他的一系列问题,但是最根本的服务之间的Http访问问题还是没有解决;

2024-11-26 16:31:15 1254

原创 快速理解微服务中Sentinel怎么实现限流

Sentinel是通过动态管理限流规则,根据定义的规则对请求进行限流控制。

2024-11-26 15:41:26 890

原创 彻底理解微服务的雪崩、限流、熔断和降级

一句话就是一个服务挂掉,导致整个系统不可用。服务雪崩也是微服务架构中最可怕的问题,也是导致微服务架构不可用的最大元凶。

2024-11-26 13:09:45 472

原创 谈谈微服务网关可以做什么

我们大部分情况下说的 API网关,狭义上指的是业务网关,并且如果系统的规模不大,我们也会将两者合二为一,将流量网关的工作和业务网关的工作放在一起,使用一个网关来处理所有的工作,但是在大型的系统的,是会把两者详细的区分出来的。关注点是提供更好的服务,针对具体的后端业务系统,或者是服务和业务有一定关联性的部分,并且一般被直接部署在业务服务的前面。(3)路由与负载均衡、灰度策略;(5)权限验证与用户等级策略;(4)服务过滤、聚合与发现;(6)业务规则与参数校验;(2)服务降级与熔断;(1)服务级别流控;

2024-11-26 12:34:46 266

原创 彻底理解微服务配置中心的作用

如果我们把所有配置放在一个Nacos的配置中心里面统一进行管理,那么就可以非常方便的给它做一些配置,比如说双11大促开始,可以给Redis服务切换到性能高的Redis服务器上去,或者说切换到不同的Redis上去等等,还可以动态的去配置一些限流的策略,然后等大促完了后,可以把策略关掉,切回Redis服务,这种情况下不需要修改原本服务的配置,非常方便。:比如说我每个服务都链接了Redis,一旦Redis的服务器IP发生了更改,那么就需要把所有服务的配置文件中的Redis配置进行修改,这样的话,维护性非常的差,

2024-11-26 12:03:13 1186

原创 彻底理解CAP理论

在分布式环境下,P是一定存在的(因为我们很难完全避免在分布式网络中出现网络分区故障),一旦出现了网络分区,那么一致性和可用性就一定要抛弃一个,这就意味着我们的系统通常是一个AP或者CP的系统。

2024-11-26 00:43:23 2711

原创 彻底理解微服务注册中心的作用

注册中心是用来管理和维护分布式系统中各个服务的地址和元数据的组件,它主要用于实现服务发现和服务注册功能。假如,在没有注册的中心的时候,一个服务调用另一个服务会带来什么问题?此时调用,就只能通过ip:端口走Http请求的方法,服务器、IP、端口的变更就会导致需要去修改业务代码,如下图所以:如果使用注册中心,注册中心提供了统一的服务注册功能,可以把服务都注册到注册中心上,它统一的帮我们管理了服务的列表,然后调用者就会拉去服务注册中心的列表来进行调用。怎么去调用?

2024-11-25 17:40:46 1312

原创 谈谈微服务的常用组件

降级就是比如A调用B,B调用C,当C不可用的时候,我们需要另一个方案防止系统出错;(刚开始的微服务架构中,不一定要这用这个组件,因为分布式事务通常会多一个服务出来,会提升服务器成本,所以通常在保证业务不出错的情况下,也用不到分布式事务,它一般在一致性要求比较的高的架构中需要用到)(1)RESTfulAPl:如RestTemplate(用的比较少,因为需要指定具体的微服务名和IP端口)、Feign;(业务的请求可能涉及到很多服务组成的一条链路,此时需要定位到是哪个服务出现的错误,定位就非常难),常。

2024-11-25 15:29:21 832

原创 彻底理解微服务的作用和解决方案

微服务优点很多,但是我们通常说一个东西好肯定会跟另一个东西比较,通常说微服务好会和单体项目进行比较,通常情况下微服务都是从单体项目拆分而来的,但是对于有些大型公司,不差钱,也会项目一上来就使用微服务架构,因为对于小公司,在开发人员和开发成本受限的情况下,一上来就是使用微服务,其实是不明智的选择,为什么不明智,后续谈到缺点的时候再来解释。以下是微服务相对于单体项目的一些显著好处:1.可扩展性受限:单体应用通常在可扩展性方面受到限制,因为整个应用程序。

2024-11-24 22:57:22 895

原创 彻底理解MQ中的消息重复问题

对于消息接收端的情况,幂等的含义是采用同样的输入多次调用处理函数,得到同样的结果。例如,一个 SQL 操作update stat table set count= 10 where id =1这个操作多次执行,id 等于1的记录中的 count 字段的值都为10,这个操作就是幂等的,我们不用担心这个操作被重复操作导致结果发生变化。再来看另外一个 SQL 操作 update stat table set count= count +1 where id= 1;

2024-11-24 00:29:28 1046

原创 彻底理解RabbitMQ如何保证消息不丢失

RabbitMQ 的工作流程:生产者(Product)需要把消息发送给交换器(Exchange),然后这个消息会被分发到对于消息队列(Queues)中,然后消息会被投递到对于的消费者(Consumer)。

2024-11-23 18:10:47 515

原创 彻底理解消息队列的作用及如何选择

1)RabbitMQ 于 2007 年发布,是使用 Erlang 编程语言编写的,最早是为电信行业系统之间的可靠通信设计的,也是少数几个支持 AMQP 协议的消息队列之一;2)RabbitMQ 的轻量级、迅捷是它的宣传口号,也很明确地表明了 RabbitMQ 的特点:Messaging that just works,开箱即用的消息队列,也就是说,RabbitMQ 是一个相当轻量级的消息队列,非常容器部署和使用;3)RabbitMQ 的客户端支持的编程语言大概是所有消息队列中最多的。

2024-11-23 00:06:44 1009

原创 彻底理解Redis的过期策略

因为现在Redis的使用是非常普遍的,Redis是基于内存的数据存储系统,而内存相比于早些年而言,还是便宜了很多,但是相比硬盘而言还是最很多,因此提高Redis里面的内存利用率是非常重要,而Redis的过期策略就是提升内存空间利用率的一把利刃,同时还存在另一个利刃就是内存淘汰策略。

2024-11-22 17:13:51 961

原创 谈谈Mysql的常见基础问题

首先,我们先说一下慢查询日志,顾名思义,就是查询花费大量时间的记录日志,是指mysql记录所有执行超过long_query_time(默认是10s,可以根实际需求修改时间,修改后需要重启mysql才能生效)参数设定的时间阈值的SQL语句的日志。该日志能够定位一些可能有问题的查询语句,能为SQL语句的优化带来很好的帮助。

2024-11-22 15:14:09 956

原创 彻底理解Redis的缓存击穿、雪崩和穿透问题

Redis的缓存击穿、雪崩、穿透问题是我们日常开发中必须考虑到的问题,本文通过对它们出现的常见情况以及相应的解决方案对其进行逐一分析。

2024-11-21 17:27:13 1334

原创 彻底理解Redis的持久化方式

如图:1.RDB持久化:在指定的时间间隔内将内存种的数据集(二进制序列化形式)快照写入磁盘,每次都是从Redis里面生成一个快照进行全量备份,也就代表我们当前时刻,Redis里面有多少数据,只要触发了RDB方式,就会将所有的数据以二进制的形式存储到磁盘里面;2.AOF持久化:对每条写入命令作为日志,以追加(append-only)的模式写入一个日志文件。

2024-11-21 15:49:32 1149

原创 谈谈Spring的常见基础概念

其实上一个问题已经把底层实现说的差不多了,这里强调一点,在说到底层实现的时候,不是说把工作原理、过程、数据结构、流程、设计模式、设计思想这些都说出来,而且只需要说出自己对它的理解和了解过的实现过程即可。比较重要的几个点是反射,工厂(BeanFactory),设计模式;几个关键的方法如下:这些方法如果加了do的方法就是实际干活的方法,不加do的只是在前面套了一层,仅此而已。简单流程如下:

2024-11-20 23:15:44 1164

原创 彻底理解如何保证Redis和数据库数据一致性问题

系统中缓存最常用的策略是:服务端需要同时维护 DB 和 Cache 并且是以 DB 的结果为准,那么就可能出现 DB 和 Cache 数据不一致的问题。

2024-11-20 00:52:15 1277

原创 彻底玩转建造者模式

1.优点:(1)产品的建造和表示分离实现了解耦,使用建造者模式可以使客户端不必知道产品内部组成的细节;(2)将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰;(3)具体的建造者类之间是相互独立的,这有利于系统的扩展(都有一个共同的抽象接口,只要继承该接口均可),增加新的具体建造者无需修改原有类库的代码,符合“开闭原则“。2.缺点:(1)建造者模式所创建的产品一般具有较多的共同点(有一个共同的抽象接口),其组成部分相似;如果产品之间的差异性很大,则不适合使用建造者模式。

2024-11-19 21:50:56 887

空空如也

空空如也

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

TA关注的人

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