自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 高频算法:Leetcode53 最大子数组和

如果我们将1这个元素换成一个负数,比如说 -1,那么这个子数组和是 -2 - 1 = -3,所以最大子数组和就是 -1,-2就被舍弃掉了。通过我们对于示例的拆解,我们可以发现一个规律,那就是如果我们在遍历数组的时候,一旦加和为负数的话,这个和就对我们最终的解存在负面效果,所以当前遍历的数组元素就不会在我们的最大连续子数组中。先从-2开始,-2 + 1 = -1 此时我们的和是一个负数,那么无论后面的数是什么,这个数加上-1一定是更小了,所以-2这个值我们不应该加入到我们的结果子数组中。

2023-04-09 21:55:43 435 1

原创 高频算法:Leetcode88 合并两个有序数组

我们只需要每次将nums1和nums2的元素取出来比较一下,将较小的元素放入到我们新的返回数组中,直到nums1或nums2中的元素都放入到新数组中,那么余下的那个数组中的元素都是比较大的,我们直接将剩余元素放到我们的返回数组即可,画一张图来理解一下这个过程。我们是不是可以通过空间换时间的方式再来解决一遍这个问题,既然上面的方法麻烦的地方就在于如果nums2中的元素比nums1中的元素小的话,nums1其后的元素都要后移一位,我们就单独创建一个数组来装我们的结果,是不是就不用这么复杂了呢?

2023-03-24 23:27:02 473

原创 高频算法:Leetcode26 删除有序数组中的重复项

删除有序数组中的重复项

2023-01-29 23:26:37 314

原创 高频算法:Leetcode1 两数之和

两数之和

2023-01-10 23:23:38 168

原创 Leaf(美团分布式ID生成服务)核心代码分析

Leaf源码简析

2022-10-07 23:31:47 759

原创 几种常见的分布式唯一ID生成方案简析

分布式唯一ID生成方案

2022-09-14 21:58:57 516

原创 Seata分布式事务简析

分布式事务框架Seata

2022-08-30 22:26:30 558

原创 DDD基础概念

限界上线文:指的是一个大系统中的一小块子系统举个例子,一个电商系统就是一个大系统,而其中的订单系统,营销系统,库存系统等等就是其中的子系统每一个子系统都有自己的领域和边界,就可以认为是一个限界上下文通用语言:对于一个限界上下文中一批名词(类)的定义还是以电商系统举例子,假如有一个类叫做Customer,对于订单系统来说,可能就是指的下单客户信息,对于供应商系统来说,可能指的就是内部的供应商客户不同的限界上下文中应该维护一套自己的通用语言,定义自己内部使用的名词和解释子域:每一个限界上..

2021-08-05 21:01:55 522

原创 如何看懂MySQL的explain执行计划

explain是个程序员应该都知道,但是要如何理解执行计划里面表达的信息呢?里面包含了以下的一些信息:id:复杂的查询语句可能包含多个执行计划,每个id都代表了一个执行计划select_type:执行计划对应的查询类型table:查询的表名partitions:表分区type:使用索引的类型,这个后面细讲possible_keys:可能使用的索引keykey:实际使用的索引keykey_len:索引长度ref:使用某个字段的索引进行等值匹配时,等值匹配的那个目标值的一些信息rows:

2021-04-16 19:39:10 324

原创 大白话讲解为啥TCP需要三次握手建立连接和四次挥手断开连接

TCP建立连接断开连接这都是老生常谈的问题了,这篇博客不打算赘述那些每次连接传输了什么SYN、ACK等信息,只讨论为什么需要特定次数的数据交换才能完成建立连接和断开连接这两个过程首先是建立连接,这个过程需要三次握手,直接上图大概流程如图所示,首先客户端需要确认服务端能接受到信息,然后服务端同样返回信息给客户端保证服务端到客户端通讯畅通,最后客户端确认建立连接,这样三次握手就能保证建立连接乍一看可能觉得第三次握手有点多余,现在如果我们去掉第三次握手并假设这么一个场景,客户端发送第一次握手之后长时间没有

2021-04-09 11:27:17 380

原创 TCP/IP四层网络模型简析

如果聊到网络这一块的话,那么网络模型肯定就绕不过去了,一般来说讲的比较多的就是TCP/IP四层网络模型,这里面就包括了数据链路层、网络层、传输层、应用层四层,而OSI七层网络模型可以理解为更细化的四层网络模型,分别是应用层、表示层、会话层、传输层、网络层、数据链路层、物理层乍一看,可能觉得这么多分层,怎么记得清,其实只要熟悉了每层的作用,其实就没问题了,没必要死记这些个概念,这篇文章打算简单分析一下TCP/IP四层网络模型中各层的作用数据链路层首先是数据链路层,这一层使用到了以太网协议,其实网络传

2021-03-26 17:53:01 1233

原创 MySQL中的常见索引规则

在使用索引规则的时候,会有一个前置条件,就是索引的类型一般是联合索引,至于为什么要使用联合索引,是因为数据的增删改都会维护索引,所以过多的索引在方便我们快速查询的时候,同时还会带来一部分的性能问题。这时就需要使用到联合索引了,联合索引既能减少索引的数量,又能满足我们查询的需求全值匹配规则这个规则的使用需要我们在where条件的判断中,根据联合索引的顺序来查询,同时条件必须是等于举个例子,假如我们有一张表,主键就是id,还有name,age,email这些字段,假如我们建立了一个name和age的联

2021-02-09 11:56:40 508

原创 MySQL中的聚簇索引和非聚簇索引

我们都知道MySQL的innodb引擎中的索引底层数据结构就是一棵B+树,且查询的时候会根据索引页一页页往下查询,直到找到我们所需要的数据索引有很多种,其中一种就是主键索引,innodb存储引擎一般在我们指定主键的时候就会生成主键索引,如果我们没有指定的话,也会自动生成一个。主键索引就是一个典型的聚簇索引,那么聚簇索引的特点又是什么呢?主键索引在进行数据搜索的时候,会通过二分法不断的找到对应的索引页,最后能确定到唯一一条数据,这条数据是在B+数的叶子节点上,同时会有这笔数据的所有信息,因为找到的这个索引

2021-02-08 18:13:22 240

原创 JetBrains DataGrip导出数据方法

DataGrip作为一款优秀的数据库可视化工具,里面的数据导出功能也很强大,其中的insert语句,update语句,Excel格式和JSON格式导出都很实用

2021-01-28 23:57:29 1343 1

原创 MySQL的索引结构简析

先来讲讲没有索引的情况下是如何来查询数据的吧首先我们应该知道数据都是存储在了一个个的数据页中,在我的上一篇博客《图解MySQL页分裂》中具体讲了数据页的格式,简单来说,数据页中包含了一行行的数据行,且数据行之间是单向链表连接,每个数据页中的数据行的主键都是递增的(如果不是的话则会进行页分裂保证递增),每个数据页之间是双向链表连接的这里假设两种情况,一种是数据量较少,一个数据页就能存储所有的数据的情况,此时如果是根据主键查询,此时会利用上一个页目录的概念,拿正常的目录做类比的话,标题就是主键,页码对应的是

2021-01-25 23:32:07 149

原创 图解MySQL页分裂

这一篇博客我们来讲一下页分裂,先抛出一个问题,就是MySQL为什么不推荐使用UUID作为主键?这个我相信大家都知道,因为UUID生成是无序的,而主键最好是自增的,或者有顺序的,至于为什么要这样呢,其实就是因为MySQL会存在页分裂既然数据页会分裂,那么具体是怎么分裂?分裂成什么样的呢?首先来一个数据页的图:上面就是数据页的结构了,首先两个数据页之间会有指针指向上一个和下一个数据页,形成一个双向链表,在数据页中存储的就是一行行的数据了,每个数据行之间会有单向指针连接,组成一个单向链表我们还可以看到

2021-01-01 17:40:12 11931 9

原创 简单图文版MVCC讲解

在讲MVCC之前,当然得知道MVCC解决了什么问题,MVCC(多版本控制)主要解决的是多个事务并发引起的问题这就是老生常谈的问题了,关于数据库的多事务并发问题,我这里稍微带一下:脏写:事务B修改了事务A改过的值,此时事务A未提交,如果事务A最终回滚的话,那么事务B修改的值也就没了脏读:事务B查询了事务A修改过的数据,但是此时事务A还没提交,如果事务A回滚事务的话就会造成事务B再次查询就读不到刚才事务A修改的数据了不可重复读:事务A读取一条数据,事务B修改了这条数据并提交事务,此时事务A在查询的时候

2020-12-28 15:27:33 409

原创 MySQL中的undo log简述

上一篇讲完了redo log,这篇博客再来讲最后一个log文件,undo logundo log的作用是事务回滚或者事务提交失败时用来恢复数据的,还有一个作用是用在了MVCC机制中(这个我们后面再讲),undo log跟redo log这种物理日志不同,它是一个逻辑日志当我们执行了增删改操作之后,undo log其实就代表了一个回滚的操作,如果是insert操作,那么undo log就记录的是删除这些数据,如果是delete操作的话,那么就代表的是新增记录,如果是update操作的话,那么就是反向的up

2020-12-17 16:07:21 588

原创 IDEA Download Sources报错java.lang.RuntimeException: Cannot reconnect.

Local repository后面的Override勾上即可

2020-12-04 10:45:14 3789 6

原创 MySQL中的redo log详解

redo log重做日志,顾名思义,其实它的作用是在MySQL宕机之后,用来恢复数据的一种log文件,那么为什么需要redo log呢?之前一篇文章我们讲过了Buffer Pool,知道了缓存页的机制,数据的增删改查都是先将磁盘中数据页的数据加载到Buffer Pool中的缓存页,然后再对缓存页中的数据进行操作,如果数据经过了增删改的操作,那么这些数据就是脏数据了,因为缓存页中的数据和磁盘中的数据不一致,一旦MySQL宕机,那么缓存页中的数据就丢了。那如果我们提交了事务,但是缓存页的数据还没来得及刷入磁盘

2020-11-30 20:57:18 1403 1

原创 MySQL中的Buffer Pool到底是个什么玩意儿

InnoDB是MySQL中默认的存储引擎,那么他是如何设计来实现我们MySQL的功能的呢?这篇博客就来剖析一下内部的一些架构设计首先有一个东西叫做缓冲池(Buffer Pool),我们都知道MySQL中的数据都是存储在磁盘上的,那么如果每次都去磁盘上读取数据的话,那么效率肯定很低,所以在内存中就存在一个缓冲池,磁盘中的数据会被缓存到缓冲池中,如果缓冲池存在的话,就不需要再去磁盘中重新读取数据了,而且为了防止缓冲池中的数据被修改,里面的数据还会加一个独占锁。对于InnoDB储存引擎而言,缓冲池配置通过 in

2020-11-24 19:18:56 419

原创 MySQL中的一条sql是如何从头走到尾的

MySQL在平时的工作使用中对我们大多数人来说,其实就是对应着一条条的sql语句,对于其中的内部设计,其实知道的人并不多假如我们有一个简单的web应用,当我们接到请求之后,请求会通过Tomcat,此时Tomcat中可能会有很多线程并发的去处理请求,需要处理的这些请求可能就意味着许多的sql,所以如果只有一个数据库连接的话,那不是坑爹了,所以这里就需要一个类似线程池的东西,这就是数据库连接池。数据库连接池除了提供多个数据库连接以供请求,还负责连接系统和MySQL数据库服务器,系统跟MySQL建立连接时,会根

2020-11-06 20:48:06 151

原创 分布式锁之Redisson实现

分布式锁相信大家都已经听过了,常见的方案呢,也就那么几种,今天我们来讲讲使用Redisson框架来实现redis的分布式锁那么第一个问题来了,为什么不直接使用redis,而是要来用Redisson框架呢?如果我们要使用redis来实现分布式锁的话,最low的一种方式就是直接set一个key,如果set成功了,那么就相当于持有了这把锁,其他的线程无法set成功,就只能不断的轮询尝试获取锁,这就是最基础的redis分布式锁原理设想一下以下的问题,当一个线程加锁成功了,然后他自己给挂了,那么之后的线程是

2020-10-27 22:36:33 335

原创 Zuul网关简析

之前讲过了其他的SpringCloud中的组件,今天来说一下最后一个基本组件Zuul首先简单讲一下Zuul的作用,他在微服务这个架构里面扮演的角色是网关,那么为什么我们需要网关呢?在微服务的架构中,可能会有非常多的服务,服务都会有各自的服务名称,如果前端需要调用后端的接口的话,那么如此纷繁复杂的服务名称肯定会让前端崩溃,这个时候我们就需要屏蔽掉这些服务所带来的影响,这时我们需要一个门面,也就是Zuul(类比一下slf4j,这也是一个经典的门面,调用slf4j,我们就不需要关心实际调用的日志框架是log

2020-10-23 15:34:52 390

原创 hystrix是如何实现熔断降级的

这篇文章将介绍feign与hystrix结合来实现调用的同时进行熔断降级防止服务雪崩使用feign的话自然少不了@FeignClient注解,而@FeignClient注解中除了最基本的name等属性之外,如果要整合hystrix一起使用的话,我们可能会用到fallbackFactory或者是fallback属性,所以一个@FeignClient注解看起来可能会是这样的@FeignClient(name = "ServiceName",fallbackFactory = MyFallbackFactor

2020-09-30 15:46:53 1129

原创 我当码农那些年

博客写了也有一年多了,都是一些技术性的文章,虽然读的人不多,但至少坚持了这么久,今天突然心血来潮,想水一篇大学学的专业是通信工程,虽然是工科,但是能跟计算机打交道的也就是两门C和C++的公共课,基本上感觉是零基础吧,我入行的契机可能跟某些人是一样的,没错,就是培训班当时大四开始需要实习找工作了,这个时候说实话,连我自己都不知道大学里学了些啥,所以就瞎投简历,最后进了个培训班,进之前我甚至都不知道我是不是真的想做一行,对程序员的唯一认识,也就是加班,熬夜我不知道大家对于培训班都是什么印象,可能不太好,但

2020-09-16 22:32:51 689

原创 Spring循环依赖(缩略版)

Spring循环依赖问题也算是个老掉牙的问题,一搜一大把,这里纯粹是为了给自己做个笔记,所以写(水)一篇博客那么为什么要叫缩略版呢,因为这里不打算分析Spring源码来讲了(主要是因为懒),能画图那就不分析代码首先Spring创建一个对象分为了三步:实例化 -> 填充属性 -> 初始化那如果是在构造器中进行了循环依赖,假如A的构造器依赖于B,B的构造器中依赖于A,那么就类似于死锁了,Spring也救不了你那么如果是使用setter方式的话呢?@Componentpublic cla

2020-09-14 15:16:43 151

原创 声明式服务调用feign解析

之前的文章已经分析过了ribbon的流程,如果我们只使用ribbon来进行服务调用的话,就需要依赖RestTemplate,看起来可能是这样的@RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)public String greeting(@PathVariable("name") String name) { RestTemplate restTemplate = getRestTemplate(); re

2020-08-26 10:02:50 401

原创 ribbon实现负载均衡流程解析

ribbon的作用是负载均衡,这篇博客就来分析一下这里面的请求流程,里面贴的源码会比较多,如果看不惯的话,可以直接看最后的总结一般来说,使用原生ribbon而不搭配feign的话,使用的都是RestTemplate,通过这个RestTemplate 来访问其他的服务,看起来是这样的@LoadBalanced@Beanpublic RestTemplate getRestTemplate() { return new RestTemplate();}RestTemplate本身并没有负载

2020-08-16 20:40:02 764 2

原创 图解零拷贝

零拷贝相信大家都听过了,说白了呢,其实就是传统IO的性能实在有点拉胯,所以搞出来一个零拷贝机制提升一下效率要了解零拷贝的话,首先得先了解一下传统IO的执行流程,这里举个例子,通过传统的IO进行网络传输来传输一个文件先上一张图,这张图就代表了传统IO传输文件的流程,读取文件的时候,会从用户态切换为内核态,同时基于DMA引擎将磁盘文件拷贝到内核缓冲区看到这里,可能你就已经懵逼了,什么是用户态和内核态,什么是DMA拷贝,我用大白话解释一下首先用户态其实就是CPU在执行你的代码,而内核态呢,其实就是

2020-08-09 20:41:39 288

原创 Eureka Server集群同步机制和数据同步的批处理机制

一般eureka server在部署的时候,都会选择集群部署,否则只用一个eureka server的话,万一出现了单点故障的话,那岂不是整个系统直接GG同时eureka server的集群也不是类似主从的概念,所有的eureka server都保存了全部的注册表信息,但是大家的角色都是一样的,eureka server中的一个节点叫做一个peer,可以认为eureka server集群中的节点都是peer to peer的模式将eureka的集群机制和zookeeper对比一下,zookeeper的集

2020-08-02 10:19:21 2246 1

原创 Eureka自我保护机制源码简析

Eureka的自我保护机制大家应该都知道了,当Eureka发现大量的服务实例都故障了,此时是不会下线所有的这些故障服务实例的。Eureka此时会认为是自己的网络故障了,导致无法接收到故障服务实例的心跳信息然后Eureka就会进入一个自我保护机制,不会再下线任何的服务实例了如果你在Eureka的控制台看到这段提示,说明就已经触发了自我保护机制首先来看一下是否触发自我保护机制的源码@Overridepublic boolean isLeaseExpirationEnabled() { // 这个是

2020-07-28 07:10:39 404

原创 Eureka服务实例下线机制

Eureka服务实例的摘除包含两种情况,第一种就是正常的服务实例下线,第二种是服务实例故障,然后自动摘除故障的服务实例先来说说第一种情况,

2020-07-22 16:07:29 1763

原创 Eureka的注册表拉取及多级缓存机制简析

只读缓存 + 读写缓存

2020-07-16 16:55:53 1948

原创 DelayQueue源码简析

DelayQueue延迟队列,意思是加入队列的元素可以设置一个延迟时间,当延迟时间到了才可以从队列中出队这个元素,先写一个demo来看看要如何使用DelayQueuepublic class DelayQueueTest { static class MyDelayed implements Delayed { private final long delayTime ; //延迟时间 private final long expire; //到期时间

2020-07-05 09:24:53 184

原创 PriorityBlockingQueue源码简析

PriorityBlockingQueue优先队列

2020-06-28 15:27:08 256

原创 LinkedBlockingQueue源码简析

上一篇博文画图解析了一下ConcurrentLinkedQueue,这个Queue其实是一个无界队列,按道理可以挂无数个节点在链表中。今天要讲的LinkedBlockingQueue则是一个有界队列,通过他的构造函数来看一下// 无参的构造函数,默认的队列容量是Integer.MAX_VALUE,基本可以认为是一个无界队列了public LinkedBlockingQueue() { this(Integer.MAX_VALUE);}// 最常用的构造函数,传入capacity作为队列的容量

2020-06-21 09:31:16 151

原创 ConcurrentLinkedQueue的出入队源码简析

ConcurrentLinkedQueue其实就是一个并发安全的Queue,底层的数据结构使用的是链表,因为使用的是链表,所以源码中会有大量的指针操作,这篇博文就以画图的方式来解析源码首先写一个小demo,然后按照这个demo的逻辑来一步步还原源码的实现流程...

2020-06-10 16:58:23 215

原创 CopyOnWriteArrayList源码简析

CopyOnWriteArrayList,是在concurrent包下的一个类,说明这是一个并发安全的类,从命名来看,这是一个线程安全的ArrayList,CopyOnWrite则是实现他并发安全的机制,即写时复制CopyOnWriteArrayList类的用法和ArrayList基本是一样的,所以就不写demo了,这里直接来看一下add方法的源码吧public boolean add(E e...

2020-06-04 15:16:36 193

原创 ConcurrentHashMap分段加锁机制简析

ConcurrentHashMap是线程安全的HashMap,我就不多废话了,实现的思想是使用的分段加锁,使用分段加锁的作用当然就是可以有效提升并发量,可以对比一下所有操作都加锁的HashTable,就能明白分段加锁的好处了既然说是分段加锁,那么我们可以猜想一下是根据什么依据来进行分段的呢?我们都知道HashMap的底层是一个数组,当里面的键值对出现了hash冲突的话,就会挂载成为一个链表,链表的阈值达到了8之后就会转化为红黑树,既然底层的数据结构是数组的话,那么是否可以对数组来进行加锁呢?我们拿Con

2020-05-30 18:55:54 5677 1

空空如也

空空如也

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

TA关注的人

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