自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

qq_250161537

肖钦栋

  • 博客(96)
  • 收藏
  • 关注

原创 基于Redis实现分布式锁

Redis实现分布式锁

2022-01-19 08:45:00 616

原创 手把手教你手写一个RPC(实现SPI、注册中心等)

手写一个简易的Rpc,实现SPI、zookeeper注册中心、负载均衡等

2022-01-05 08:12:24 2048

原创 一文带你彻底了解Dubbo的SPI机制

从使用与源码角度搞懂dubbo的SPI机制以及@Adaptive与@Activate

2021-12-14 07:39:44 1200

原创 手把手教你手写一个RPC框架

前言最近在看dubbo的源码,所以就参考着这本书籍作为辅助(这个诣极总是让我看成了极诣,嗯,极诣狂战士):dubbo在3.0版本就有三十万行代码,光看个核心功能的代码就快折磨死人了,为了加强理解,我觉得动手实现一个rpc框架倒是个非常不错的方法。本文主要会围绕RPC的基本功能来展开。主要是对RPC有个认知,至于SPI、注册中心、负载均衡、netty传递信息等的实现,我会放在下一篇文章中进行讲解。开篇市面上有很多RPC框架,虽然种类比较多,但是他们所围绕的中心思想是一样的。我们看下书中是这么介绍的

2021-11-24 07:46:51 5403 4

原创 MySQL中Explain用法详解

Explain简介我们在写后端程序的时候,通常会写sql来查询数据,如果是单表查询的时候,那直接select就完事了,但是如果是连表查询数据量也不小的话,就造成了查询速度会比较慢,那么我们该怎么知道我的sql的实际执行情况,它有没有走索引,执行效率是啥呢?数据库就给我们提供了这么一种功能,这个就是本文的重点了:expalin。通过explain,我们可以获取到sql语句的执行计划,比如像表的读取顺序,使用了哪些索引等等。但是各个数据库的explain执行计划所展示出的内容是不太相同的,这里我们就来看..

2021-11-08 07:45:57 4030 2

原创 万字解析Springboot启动流程与原理

目录写在前面对象的创建run方法结语写在前面在使用Springboot框架的时候,我们只需要启动一个类就可以启动整个项目,这个类长这个样子:@SpringBootApplication@EnableScheduling@EnableTransactionManagementpublic class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApp

2021-10-14 07:46:44 671

原创 countDownLatch、cyclicBarrier、semaphore使用详解

文章目录前言countDownLatchcyclicBarriersemaphore结尾前言在前面两篇中介绍了AQS的同步队列、条件队列的源码实现,这一篇则是来看一下JUC中主要的三个并发工具类:countDownLatch、cyclicBarrier、semaphore。本文不会像之前两篇文章那样从源码角度展开,而是结合工具的API,来看一下这些工具类的使用方法以及场景。countDownLatchcountDownLatch我们可以理解为是一个计数器,计数器的初始值是线程的可执行的次数(这个实际

2021-09-26 07:23:57 396

原创 AQS:条件队列的源码解读

前言在上一篇中介绍了AQS中的同步队列:AQS:从原理到源码解读,条件队列相对于同步队列来说的话,内容并没有那么的多。因为在同步队列中是分了共享模式与独占模式,而在条件队列中,是没有共享模式的,条件队列中的节点都是独占式的,这一点会在接下来的源码中介绍到。在开始条件队列的源码之前,我们以一段代码为例子:public static void main(String[] args) throws InterruptedException { ReentrantLock lock=new R

2021-08-30 22:19:16 206

原创 AQS:从原理到源码解读

目录文章目录前言原理构造独占式获取锁释放锁共享式获取锁释放锁写在最后前言我们在使用ReentrantLock、CountDownLatch等并发相关的工具的时候,会发现它们都继承了一个类:AbstractQueuedSynchronizer,简称AQS,有人说他是并发的基石,也有一种说法是并发框架,但是不管哪种说法,都显示出了AQS的重要性,所以我们也有必要去了解一下AQS,本文只是我对于AQS的了解,如有不当之处,欢迎指出我及时修改。在AQS中,核心方法是围绕独占式地获取、释放锁,共享式地获取、释

2021-08-13 07:52:40 212

原创 left join的基本用法以及on与where的区别

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言我们在写sql语句的时候,,比如内连接、外连接。以本文的left join为例,网上都是这么说的:LEFT JOIN 关键字会从左表 那里返回所有的行,即使在右表中没有匹配的行。一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):import numpy as npimport pandas as pdimpor

2021-08-04 08:50:40 51197

原创 Java8新特性之Optional了解与使用

文章目录前言使用of与ofNullablegetorElseorElseGet、orElseThrowmapflatMapfilter(过滤)isPresentifPresent前言Java8引入了一些新的特性,比如lambda表达式、Stream流,当然了,还有这篇要说的Optional,它主要就是解决NullPointerException,用法其实也没多少,他的接口也就十来个,来个图一下展示出来:接下来,我们就围绕这些API来了解Optional。使用of与ofNullable这俩是.

2021-07-30 08:47:09 1079

原创 Java是值传递还是引用传递(值传递)

前言最近在看Java核心卷一,也就是这本书:在这本书里面也看到了这个问题,Java是值传递还是引用传递,这个问题其实也是很有意思的,之前也看到过这个问题,但是只是依稀记得是值传递,但是而且网上也有在讨论这个问题的。所以就先说结论吧:是值传递。文章目录前言值传递与引用传递二、使用步骤1.引入库2.读入数据总结值传递与引用传递既然讨论是值传递还是引用传递,那肯定是要知道啥是值传递、引用传递的。示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤

2021-06-06 18:01:33 215 3

原创 一条sql语句在MySQL中的执行过程

Write in first平常我们经常写sql语句,但是sql语句在数据库中的执行过程又是啥样呢?本文就从数据库的基本架构与sql语句的类型两方面来分析下sql语句的执行过程。因为本文主要涉及MySQL数据库中sql语句的执行过程,所以你要是关心像oracle、sql server等数据库的话,可能不太适用(因为我也没用过oracle。。。)。基本架构MySQL可以分为server层与存储引擎两个部分。server层:连接器、查询缓存、分析器、优化器、执行器等都是属于server层的。这些部件可

2021-01-30 16:51:27 473

原创 Java的类加载过程与双亲委派模型

类加载Java的类加载过程中涉及到双亲委派模型,而提到双亲委派模型又免不了讨论类的加载过程,所以这两者放到一块了解更加合适。Java的类加载过程可以分为三个步骤:加载、连接、初始化。其中连接过程又可以分为验证、准备、解析三个步骤。在这里我画了个图更加方便展示:所以我们接下来就围绕加载、连接、初始化这三个部分来看一下整个的类加载过程。加载阶段类加载的第一个阶段,在此阶段,JVM虚拟机会完成下面的三个步骤:1、通过一个类的全限定名来获取其定义的二进制字节流。2、将这个字节流所代表的静态存储结构转化

2021-01-28 08:22:22 361

原创 一文掌握Java8Stream流的常见用法

前言Lambda 表达式是 jdk8引入的一个新特性,可以取代大部分的匿名内部类,在集合的遍历和对集合的操作中,可以极大地优化代码结构。而jdk8又是现在的主流版本,关于lambda表达式,其实也得多多少少了解一点,尤其是在某些情况下,使用lambda表达式确实能够方便很多。在接下来的内容中,通过从简单到复杂,一步一步去了解lambda与Stream流。Lambda表达式遍历比如下面这个数组::String[] name = {"Tom", "Abel","Jack","Cary","Georg

2021-01-14 21:43:11 732 2

原创 一文掌握JVM常见垃圾回收算法与垃圾收集器

从垃圾回收算法、垃圾收集器,这字面意思上来看,都是是围绕垃圾这个名词展示的,那么啥是垃圾呢?垃圾定义我们日常生活中是怎么定义垃圾的呢?对于那些不需要用的东西称为垃圾,不然都放在屋里那怎么受的了。对于JVM也是这样的,垃圾就是在程序运行时没有任何指针指向的对象就是垃圾。因为不需要使用它了,留着它也是占内存,赶紧把它清除掉为别的对象腾放空间。那我怎么知道一个对象是不是垃圾呢?万一把还需要用的对象给清除掉了,那也不是太好啊。所以我们需要一定的方法来确认这个对象是否被引用,进而来确认是否要删除。两种标识算法

2021-01-10 21:20:39 291

原创 Java实现在线秒杀系统(主要问题以及源码)

前言最近在整理电脑文件的时候,发现了毕业之前看视频学习的在线秒杀系统,现在毕业半年了,正好公司使用了dubbo+zookeeper的分布式框架,合计着整理下之前看过的在线秒杀项目,然后希望能够尽可能地整理成分布式框架(不过希望以后有时间完成吧。。。)。本文呢,主要是看一下这个秒杀系统主要会涉及哪些问题。其中用到了SpringBoot、Redis、RabbitMQ、MySQL。文章末尾会给出源代码。正文其实吧,对于秒杀,在我们的生活中也是很常见的,一有个节日,商家就会搞个秒杀活动促销,我就想起之前的红

2021-01-10 12:29:50 1907 5

原创 IDEA修改内存大小并显示内存使用

最近在使用IDEA的时候,感觉就是比较卡,点个class文件就会卡顿,为了提高流畅度,我决定修改下内存大小。最方便的方法就是在IDEA上方点击Help->Edit Custom VM Options:点击之后就会到配置文件,主要看两项:这两项根据自己的需要,自行配置。最好是配个整数:比如1024啦,2048啦。配置完重启IDEA就OK了。看右下角就知道内存的使用情况了。如果你也想显示这个内存使用情况的话,点击Setting:在图中对应的位置打上勾即可,此时IDEA主页面右下方就

2020-12-27 17:21:50 1268

原创 SpringBoot集成rabbitmq出现错误:org.springframework.amqp.AmqpConnectException: java.net.ConnectException

今天在使用SpringBoot集成rabbitMQ的时候,出现了这么一个情况:org.springframework.amqp.AmqpConnectException: java.net.ConnectException:Connection refused在我的配置文件中配置的username与password都是guest,而guest默认只能连接本机IP(也就是127.0.0.1),所以就爆出了拒绝连接的错误。我使用的是阿里云的服务器,经过网上的查找,也是找到了解决的办法。在服务器上进入到r

2020-12-21 21:17:34 2751

原创 动态规划算法详解(附带背包问题、机器人不同路径、跳台阶)

前言关于动态规划的一些名词、概念,比如像什么动态转移方程,无后效性,最优子结构啦。我想我们可以先不用看百度出来的解释或者是书本上对这些概念的解释,过于复杂难懂的话,可能就没入门就放弃了。我们以三个例子为基础,将概念带入例子并进行总结,进而初识动态规划。目录前言1、跳台阶2、机器人不同路径3、01背包问题总结1、跳台阶经典蛙兄跳台阶:蛙兄正在上楼梯,楼梯有 n 阶台阶,蛙兄一次可以跳 1 阶或者跳2 阶,计算跳n阶台阶共有多少种方式。分析:我们假设f(n)表示跳n阶可以有多少种方式,而n阶是

2020-12-20 20:07:06 737

原创 B+树索引与Hash索引

既然索引的数据结构有B+树与Hash两种,那么索引又是什么呢?索引在关系型数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的 SQL 语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。使用索引可以快速地查找到数据,但是不同的数据结构,查找数据花费的时间与使用的场景也不尽相同。在MySQL中,索引的结构主要分为B+树与Hash这两种。B+TreeB+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。在B+树

2020-12-19 22:15:18 1057 1

原创 Volatile关键字的解析

先来看两段代码:class volatileTest extends Thread{ private boolean k=false; @Override public void run() { if (k){ System.out.println("进入"); } }}public class volatileee { public static void main(String[] args) {

2020-12-17 21:30:46 320

原创 缓存雪崩、缓存穿透、缓存击穿的概念与解决方法

缓存雪崩、缓存穿透、缓存击穿这三兄弟在Redis中也是比较重要的一个方面,而且由于三者长得相似,也是常来拿做比较。现在就来看看这三者的不同一级对应的解决方案。缓存雪崩概念缓存雪崩:大面积的缓存在同一时间失效,此时前端请求对失效的缓存进行查找,但是缓存中没有,那就全部去数据库中查找。这样可能会对数据库造成巨大压力。解决办法1、设置热点数据永不过期。热点数据永不过期就不会造成大面积的缓存失效。2、对Key设置随机过期时间。3、如果Redis是Redis集群,可以选择将数据均匀分布在不同的服务器上。

2020-12-06 10:55:48 588

原创 Java集合之Set篇(知识点)

上一篇主要介绍了List中的ArrayList、LinkedList、Vector:Java集合之List篇(知识点与面试题)这一篇则来介绍Set集合。个人感觉Set集合的优先级不如Map与List,但是也是重要的一点。Set作为同样实现了Collection接口中的一员,自然免不了与List一通比较。他与List相比,最主要的方面就是Set不允许出现重复元素,Set中有的子类是无序的,有的子类是有序的。先看下IDEA中Set的结构图:我们也就主要看HashSet、TreeSet、LinkedHa

2020-12-05 21:44:59 392 1

原创 Java集合之List篇(知识点与面试题)

在面试中,集合应当是Java基础中必问的一块了,无论是Map,还是List、Set,总有一款会问到。这一篇就来聊聊这个List的一些常见问题。我还记得校招有一次面试的时候,面试官就问我LinkedList底层是什么?我就说LInkedList的底层是双向链表。面试官:你确定么?“对啊,LinkedList底层就是双向链表啊。”“ 你再好好想想。”我:????是我记错了么?这特喵就是双向链表啊。没毛病啊,就是双向链表。后来我查了下,确实是双向链表。可能是这个面试官故意搞事情。好了,废

2020-12-05 19:05:36 439

原创 Redis的五种基本数据类型与三种特殊数据类型

本文主要从使用与场景两方面来介绍Redis的五种基本数据类型与三种特殊数据类型,这些数据类型的使用看着很简单,但还是要敲一遍才能更好的了解。文末附带这八种数据类型的思维导图。StringString是Redis最基本的数据结构,他采用K-V的形式来存储数据,当然了,虽然是String,但是他的value也可以为int、float形式,也可以存储json、图片等,但是不能超过521MB。使用场景:1、做缓存。2、计数,比如粉丝数、文章阅读量3、分布式session。Hash键值对形式的存储

2020-12-01 21:18:36 674

原创 InnoDB与MyISAM的多种区别与选择

InnoDB与MyISAM作为MySQL中的存储引擎,无论是在我们学习数据库方面,还是在面试方面,都是很重要的一点。他们俩可以从多个方面的区别进行了解。1、外键InnoDB支持外键,而MyISAM是不支持的。如果将InnoDB类型的表转换为MyISAM类型的话,是会转换失败的。2、索引InnoDB是聚集索引,使用B+树作为索引结构。必须要有主键,通过主键索引效率会很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此主键不应该过大,因为主键过大的话,索引也要增大。MyI

2020-11-29 15:48:15 765

原创 zookeeper的基本原理(二)

在前面的两篇中,我们介绍了zookeeper的安装与简单的使用,这一篇我们就来看一下zookeeper的一些基本原理。目录一、什么是zookeeper二、为什么使用zookeeper三、zookeeper的一些重要概念&&信息四、ZAB协议五、zookeeper集群为什么要奇数台服务器一、什么是zookeeperzookeeper是什么?打开百度,输入zookeeper,我们可以看到是这么定义的:ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的C

2020-11-22 21:59:12 724 1

原创 zookeeper的使用与基本原理(一)

在上一篇中完成了zookeeper的单机版与集群版的配置,这一篇主要介绍使用zookeeper时,用到的常见命令,先对zookeeper的使用有个简单的了解。下一篇会着重介绍zookeeper的一些相关信息与原理。先来看下zookeeper的数据结构:zookeeper的数据结构可以看做是一个树状,每个节点是znode(zookeeper node),每个节点也可以有多个子节点。节点既可以存储数据信息、对应权限,也可以作为一个路径来指定信息。一个znode一般可以分为三个部分:1、节点中的数据。

2020-11-22 17:27:01 385

原创 zookeeper的安装与配置(单机版与集群版)

前言dubbo作为现在使用的比较多的分布式框架,它推荐zookeeper作为注册中心,并且zookeeper也是hbase、hadoop的一部分,我们有必要了解一下zookeeper,最起码也得知道zookeeper的一些简单使用。本文主要介绍在linux环境下zookeeper的安装、配置。不过貌似公司也不会在windows环境下使用zookeeper吧。zookeeper的使用包括单机版与集群版,接下来就开始zookeeper的安装。文章目录前言一、zookeeper单机版的配置二、zookeep

2020-11-21 20:40:21 774

原创 Java并发编程之线程池的了解与使用

前言在Java语言中,一切都可以看作是对象,如果要使用对象,那么就new一个出来,线程也是如此。我们知道,要使用线程,那么肯定是先去创建一个线程,使用完毕后就将线程销毁,这个操作在我们现在的硬件条件下,执行速度是相当快的。但是如果并发线程数量很多的时候,那情况就不一样了,积少成多,会严重地减少相应的速度。那么能不能将使用过的线程先保存下来,在需要线程的时候直接去调用?针对这样的情况,Java中正好有线程池,通过线程池能够在一定程度上减少多个线程运行的时间。文章目录前言一、ThreadPoolExecut

2020-11-14 15:11:03 397

原创 设计模式系列之观察者模式

观察者设计模式简介:观察者模式(Observer)是对象的行为模式,又叫发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。比如我们在某鱼、某牙关注了主播,又或者是B站关注了up主,我们就相当于观察者,当我们关注的主播

2020-11-01 14:59:36 379

原创 设计模式系列之工厂模式

工厂设计模式前言一、简单工厂模式1.1、什么是简单工厂二、工厂模式三、抽象工厂模式前言       设计模式是我们程序员多多少少要了解的,尤其是工厂设计模式,作为Spring框架中用到的设计模式,更是面试时经常问到的,那么什么是设计模式呢?设计模式 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。  

2020-10-28 21:03:36 372

原创 设计模式系列之策略模式

概述:策略模式定义了一系列的算法,并将这些算法一个个封装起来, 并且使它们可相互替换emmm,这是什么意思呢?单看定义确实有那么一点点晦涩难懂,不如先看下策略模式有哪些角色。策略模式的三个角色:1、策略角色:策略是一个接口,接口中定义了要实现的算法。2、具体策略角色:具体策略是实现策略接口的类,并将接口中的方法实现。3、策略上下文角色:策略上下文依赖于策略接口的类,也就是说上下文包含有策略声明的变量。其实就是策略模式需要一个接口(这个接口就是策略角色),接口中有方法。既然我们创建了接口,那

2020-10-25 17:36:24 401

原创 设计模式系列之单例模式(五种写法)

前言设计模式是我们程序员应该要掌握的,可能没有用过,但是至少听过。毕竟没吃过猪肉,哪还能没见过猪跑,那么什么是设计模式呢?文章目录前言饿汉式懒汉式加锁的懒汉式双检锁静态内部类枚举git地址设计模式 是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。反正很重要就对了,而且在找工作的时候也是经常问到的,通常会有面试官让你手写个设计模式,最常见的就是单例模式了,接下来我们就来看一下单例模式到底是什么?

2020-10-24 17:08:22 505

原创 Java使用aspose将word文档转换为pdf

这一周有个需求正好用到了将word转换为pdf,网上资料很多,但是实现功能还是费了点事,这里把具体的实现贴了出来,有需要的直接使用即可,功能是都可以跑的通实现的。

2020-10-17 21:21:38 1591 2

原创 Java使用poi根据word模板进行导出(有效可行)

       最近一直在做与导出这部分相关的事情,有一个就是需要将数据库中查询到的信息写入到word模板中再进行导出。下面的代码直接复制使用即可,没啥毛病,无论是段落中的,还是表格中的,都是有效的。使用过程中遇到的一些问题我也写在注释中了,如果你也遇到类似的问题,或许可以参考一下。package com.dong.poi.wordReplace;import org.apache.poi.POIXMLDocument;import

2020-10-17 20:15:31 2917 4

原创 Java使用poi导出word(亲测有效)

废话也就不那个多说,下面的代码是我最近使用过的,直接使用即可,本地跑通之后可以做下适当的修改就可以放到项目中。工具类:package com.dong.outWord;import org.apache.poi.xwpf.usermodel.ParagraphAlignment;import org.apache.poi.xwpf.usermodel.XWPFDocument;import org.apache.poi.xwpf.usermodel.XWPFParagraph;import o

2020-10-17 16:05:49 5429 4

原创 那些年一起看过的HashMap面试题

前言我们在日常的工作学习中,都会常常用到HashMap,记得在校招面试中,也是基本上多多少少会问到一些关于HashMap的知识点,因此我们对于HashMap也不能仅仅停留在使用get、put操作存取数据,接下来就看看HashMap有哪些常见的问题。了解数据结构中的HashMap么?讲讲你对HashMap的认识这种应该就属于比较基本的问题,根据这个问题来引出之后的问题。HashMap由数组+链表的形式组成,是一个用于存储key-value键值对的集合,在Java7中叫做Entry,在Java8中叫

2020-09-20 20:56:48 457

原创 解决CentOS7安装docker 启动失败:Job for docker.service failed...

首先声明,这个问题是在安装docker时出现的问题。如果是使用过一段时间出现了错误,有可能不能很好地解决。今天在新的虚拟机上安装docker时,安装已经成功了,但是却显示启动失败,信息如下:我们查看docker的version,只有Client,没有server,执行 vi /etc/sysconfig/selinux , 在文件中将 selinux 属性值改为disabled。设置完成之后,重启系统reboot,将xshell重新与虚拟机连接,...

2020-05-28 12:25:27 2147

空空如也

空空如也

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

TA关注的人

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