自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

又蠢又笨的懒羊羊程序猿的博客

『世界上只有一种真正的英雄主义』

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

原创 RocketMQ:消息存储机制详解与源码解析

文章目录消息存储机制1.前言2.核心存储类:DefaultMessageStore3.消息存储流程4.消息存储文件5.存储文件内存映射5.1.MapperFileQueue5.2.MappedFile5.2.1.commit5.2.2.flush5.3.TransientStorePool6.刷盘机制6.1.同步刷盘6.2.异步刷盘消息存储机制1.前言本文主要讲解内容是Broker接收到消息生产者发送的消息之后,如何将消息持久化存储在Broker中。2.核心存储类:DefaultMessageSto

2021-11-17 11:23:44 3164 2

原创 RocketMQ:消息ACK机制源码解析

消息消费进度概述消费者消费消息过程中,为了避免消息的重复消费,应将消息消费进度保存起来,当其他消费者再对消息进行消费时,读取已消费的消息偏移量,对之后的消息进行消费即可。消息模式分为两种:集群模式:一条消息只能被一个消费者消费广播模式:一条消息被所有消费者都消费一次广播模式下,消息被所有消费者消费,因此消息消费的进度可以跟消费端保存在一起,即本地保存。集群模式下,消息只能被集群内的一个消费者消费,进度不能保存在消费端,否则会导致消息重复消费,因此集群模式下消息进度集中保存在Broker中。

2021-11-20 13:38:29 7919 3

原创 RocketMQ:消费端的消息消息队列负载均衡与重新发布机制源码解析

文章目录前言流程解析总结前言在上一篇博客中我们了解到,PullMessageService线程主要是负责从pullRequestQueue中获得拉取消息请求并进行请求处理的。PullMessageService#run//在拉取消息请求队列中拉取消息请求PullRequest pullRequest = this.pullRequestQueue.take();//处理请求this.pullMessage(pullRequest);但是pullRequestQueue中的PullReque

2021-11-19 20:21:41 7077 2

原创 RocketMQ:Consumer概述及启动流程与消息拉取源码分析

文章目录Consumer概述消费者核心类消费者启动流程消息拉取PullMessageService实现机制ProcessQueue实现机制消息拉取基本流程客户端发起消息拉取请求消息服务器Broker组装消息消息拉取客户端处理消息总结Consumer概述消费者组与消费模式消息消费以组的模式展开,一个消费组内可包含多个消费者,每个消费组可以订阅多个主题。消费组之间有负载均衡和广播两种模式。负载均衡模式,主题下的同一条消息只允许被其中一个消费者消费。广播模式,主题下的同一条消息,将被所有消费者消费一次

2021-11-18 13:44:37 6169 1

原创 RocketMQ:消息消费队列与索引文件的实时更新以及文件恢复源码解析

文章目录消息存储1.实时更新消息消费队列和索引文件1.1.转发到ConsumerQueue1.2.转发到Index2.消息队列和索引文件恢复2.1.存储文件加载2.1.1.加载commitLog文件2.1.2.加载消息消费队列2.1.3.加载索引文件2.2.正常恢复2.3.异常恢复消息存储1.实时更新消息消费队列和索引文件消息消费队文件、消息属性索引文件都是基于CommitLog文件构建的,当消息生产者提交的消息存储在CommitLog文件中,ConsumerQueue、IndexFile需要及时更新

2021-11-17 18:39:38 924 1

原创 RocketMQ:Producer启动流程与消息发送源码分析

文章目录Producer1.方法和属性2.启动流程3.消息发送3.1验证消息3.2查找路由3.3选择队列3.4发送消息3.5发送批量消息Producer在RocketMQ中,消息生产者就是客户端,即消息的提供者。以下是消息生产者Producer项目预览图:1.方法和属性Producer的相关核心类:MQAdmin接口方法介绍://创建主题void createTopic(final String key, final String newTopic, final int queueNu

2021-11-15 13:08:35 1631 1

原创 RocketMQ:NameServer路由管理源码分析

NameServer路由管理1.前言NameServer主要作用是为消息消费者和消息生产者提供关于主题Topic的路由信息,那么NameServer需要存储路由的基本信息,还要管理Broker节点,包括路由注册、路由删除等。2.路由元信息路由元信息主要由RouteInfoManager来进行管理,这个类在已经介绍过,这里再做一下简单的介绍。private final static long BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2; private

2021-11-13 19:08:21 1637 1

原创 RocketMQ:NameServer架构设计以及启动关闭流程源码分析

文章目录NameServer1.架构设计2.核心类与配置3.启动与关闭流程3.1.步骤一3.2.步骤二3.3.步骤三NameServer1.架构设计消息中间件的设计思路一般都是基于主题订阅与发布的机制,RocketMQ也不例外。RocketMQ中,消息生产者(Producer)发送某主题的消息到消息服务器,消息服务器对消息进行持久化存储,而消息消费者(Consumer)订阅所需要的主题,消息服务器根据订阅信息(路由信息)将消息推送至消息消费者(Push模式)或者消息消费者主动向消息服务器进行拉取(Pu

2021-11-12 22:59:07 1621 1

原创 RocketMQ集群启动报错:java.lang.RuntimeException: Lock failed,MQ already started

启动RocketMQ集群后报错:java.lang.RuntimeException: Lock failed,MQ already started at org.apache.rocketmq.store.DefaultMessageStore.start(DefaultMessageStore.java:214) at org.apache.rocketmq.broker.BrokerController.start(BrokerController.java:827) at org.apach

2021-11-01 12:10:16 2317 4

原创 解决ZooKeeper集群搭建 [myid:1] - WARN [QuorumPeer[myid=1]:QuorumCnxManager@685] - Cannot open channel

ZooKeeper集群搭建中出现错误:[myid:1] - WARN [QuorumPeer[myid=1](plain=0.0.0.0:2181)(secure=disabled):QuorumCnxManager@685] - Cannot open channel to 3 at election address /x.x.x.x:3883java.net.ConnectException: Connection refused (Connection refused) at java.net

2021-11-01 11:42:58 15377 1

原创 SpringtBoot+SpringSecurity+Jwt+MyBatis整合实现用户认证以及权限控制

文章目录前言数据库表结构项目结构图核心配置类SecurityConfig实体类工具类用户登录认证Token令牌验证获取用户权限用户权限验证Service层实现类统一响应类Controller流程解析测试**登录测试**公共接口测试访问具有访问权限的接口访问无访问权限的接口前言本项目采用SpringBoot+SpringSecurity+Jwt+Mybatis,实现了基于数据库的用户认证以及权限分配。pom.xml导入依赖 <dependencies> <depend

2021-10-18 22:39:58 1222 4

转载 Zookeeper

这里写目录标题一级目录二级目录三级目录Zookeeper简介/快速入门应用场景Zookeeper的设计目标数据模型结点状态stat的属性单机安装常用shell命令操作结点zookeeper的Acl权限控制案例/远程登录acl 超级管理员zookeeper的 JavaAPI连接到Zookeeper新增节点修改节点删除节点查看节点查看子节点检查节点是否存在事件监听机制watcher架构watcher特性Watcher通知状态(KeeperState)Watcher事件类型(EventType)捕获相应的事件客户

2021-10-05 12:41:21 437 1

原创 Dubbo负载均衡与集群容错

文章目录负载均衡与集群容错Invoker服务目录RegistryDirectoryStaticDirectory服务路由Cluster负载均衡负载均衡与集群容错Invoker在Dubbo中Invoker就是一个具有调用功能的对象,在服务提供端就是实际的服务实现,只是将服务实现封装起来变成一个Invoker。在服务消费端,从注册中心得到服务提供者的信息之后,将一条条信息封装为Invoker,这个Invoker就具备了远程调用的能力。综上,Dubbo就是创建了一个统一的模型,将可调用(可执行体)的服务

2021-10-02 15:31:05 535 2

原创 Dubbo服务调用过程

文章目录Dubbo调用过程大致流程调用请求的具体信息协议序列化器调用流程图调用流程源码分析——客户端路由和负载均衡调用的三种方式调用流程源码分析——服务端总结Dubbo调用过程大致流程客户端根据远程服务的地址,客户端发送请求至服务端,服务端解析信息并找到对应的实现类,进行方法调用,之后将调用结果原路返回,客户端解析响应之后再返回。调用请求的具体信息客户端发送给服务端的请求中应该包含哪些具体信息呢?首先肯定要说明调用的是服务端的哪个接口、方法名、方法参数类型、以及版本号等,将上述信息封装进请求,

2021-09-29 15:01:40 2244 1

原创 Dubbo服务引用过程

Dubbo服务引用大致流程Provider将服务暴露出来并且注册到注册中心,而Consumer通过注册中心获取Provider的信息,之后将自己封装成一个调用类去与Provider进行交互。首先需要将所有调用转化为Dubbo中我们熟悉的Invoker,再通过代理类去远程获取服务。大致流程如下:服务引用策略服务的引用和服务的暴露原理相似,都是Spring自定义标签机制解析生成对应的Bean,在之前服务暴露使用到的Provider Service使用的是ServiceBean,而Comsumer

2021-09-26 14:47:42 458 2

原创 Dubbo暴露服务过程

Dubbo服务暴露机制前言在进行服务暴露机制的分析之前,必须谈谈什么是URL,在Dubbo服务暴露过程中URL是无处不在的,贯穿了整个过程。一般情况下,URL指的是统一资源定位符,标准格式如下:protocol://host:port/path?key1=value1&key2=value2Dubbo就是用这种URL的方式来作为约定的参数类型,服务之间也是用URL来进行交互。Dubbo用URL作为配置总线,贯穿整个源码体系。URL的具体参数如下:protocol:dubbo中的各

2021-09-23 22:42:49 558 1

原创 Dubbo的原理与机制

​Dubbo前言在介绍Dubbo之前先了解一下基本概念:Dubbo是一个RPC框架,RPC,即Remote Procedure Call(远程过程调用),相对的就是本地过程调用,在分布式架构之前的单体应用架构和垂直应该架构运用的都是本地过程调用。它允许程序调用另外一个地址空间(通常是网络共享的另外一台机器)的过程或函数,并且不用程序员显式编码这个远程调用的细节。而分布式架构应用与应用之间的远程调用就需要RPC框架来做,目的就是为了让远程调用像本地调用一样简单。Dubbo框架有以下部件:Con

2021-09-17 17:34:27 16385 6

原创 深入学习Redis

文章目录Redis前言一、概念和基础概念优势官方资料使用场景二、数据类型:5种基础的数据类型Redis数据结构简介基础数据结构详解String字符串List列表Set集合Hash散列Zset有序集合三、特殊的数据类型三种特殊类型讲解HyperLogLogBitmapGeospatial四、数据库常用指令过期数据的删除策略定时删除惰性删除定期删除五、持久化RDB持久化触发方式RDB的优缺点AOF持久化实现AOF配置文件重写机制重启加载六、事务七、主从复制旧版复制功能的实现复制命令传播新版复制功能的实现部分重同

2021-09-10 19:03:23 575 7

原创 Java实现堆排序及详细图解

文章目录堆排序前言实现步骤代码实现堆排序前言堆排序(HeapSort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似于完全二叉树的结构,同时满足子节点的键值总是小于(或者大于)其父节点。每个节点的值都大于或者等于其左右子节点的值,称为大顶堆;或者每个节点的值都小于或者等于其左右子节点的值,称为小顶堆。对堆中的节点按层进行编号,将这种逻辑结构映射到数组如下图所示:该数组从逻辑上讲就是一个堆结构,并且有以下特点:大顶堆:arr[i] >= arr[2i+1] &&a

2021-08-23 11:44:35 25081 7

原创 Java实现前中后序线索化二叉树以及遍历

文章目录一、线索化二叉树的原理二、构建线索化二叉树三、代码实现线索二叉树一、线索化二叉树的原理在前面介绍二叉树的文章中提到,二叉树可以使用两种存储结构:顺序存储和链式存储,在使用链式存储时,会存在大量的空指针域,为了可以充分利用这些空指针域,引申出了线索化二叉树,将这些空指针域利用起来,提高检索效率。上图中,紫色区域就是没有指向的空指针域,从存储空间的角度来看,这些空指针域浪费了内存资源。从另外的角度思考,如果需要知道C节点的前驱节点和后继节点,每次都都需要进行一次遍历,是否可以提前存储C节点的前

2021-08-19 13:24:48 1402 4

原创 数据结构:二叉树

文章目录树前言1.树概念及结构1.1树的概念1.2树的实现2.二叉树2.1概念2.2二叉树的存储结构2.3特殊的二叉树2.4二叉树的存储结构2.4.1顺序存储2.4.2链式存储3.二叉树顺序结构及其实现3.2二叉树的顺序结构3.1代码实现4.二叉树链式结构及实现4.1二叉树链式结构的遍历4.2代码实现树前言为什么需要树这种数据结构?1、数组存储方式分析优点:通过下表方式访问元素,速度快,对于有序数组,还可以使用二分、插入以及斐波那契查找算法来提高检索效率。缺点:如果要检索具体的某个值,或者

2021-08-18 21:43:21 230 3

原创 Java实现HashTable的基本操作

文章目录哈希表前言实现思路代码实现哈希表前言哈希表(Hash Table)也叫做散列表,是根据键值对(Key Value)而直接访问的数据结构。它通过将关键码值Key映射到表的一个位置来直接访问,以此加快查找的速度。这个映射函数叫做散列函数,存放记录的数值叫做散列表。实现思路哈希表底层通过数组和链表组成,数组中的每一个值就是链表。HashMap就是用哈希表实现,当我们使用put(key,value)方法时,哈希表中调用key.hashCode()%size,计算得出的值就是数组的下标,因不同k

2021-08-15 10:48:33 1103 3

原创 Java语言实现插值查找

插值查找前言在上一篇文章中已经将讲解过二分查找算法,而插值查找与二分查找类似,只不过是在二分查找的基础上进行优化,讲mid的值进行了一定调整优化,将mid的值修改为,该算法时间复杂度为O(log n)。优缺点优点:对于数据量较大并且关键字分布均匀的查找表来说,采用插值查找速度更加快。关键字分布不均匀的情况下,该方法不一定比二分查找好。代码实现 /** * 插值查找 * 说明:插值查找算法要求数组有序 * @param array 数组

2021-08-13 17:00:09 136

原创 Java语言实现二分查找(可查询重复数据)

文章目录二分查找1.前言2.算法思想3.图示4.优缺点5.代码实现标准二分查找拓展:可以查询重复值二分查找1.前言二分查找是一种查询效率非常高的查找算法,又称为折半查找。用递归思想来实现二分查找较为形象并且代码可读性强,因此本文中将介绍二分查找的思想,代码实现以及重复值查找的拓展。2.算法思想使用二分查找的前提是在一组有序的序列下进行,每次以序列的中间位置的数作为标准与带查找的数进行比较,从而调整查找方向,并且缩小查找范围,直至匹配成功。3.图示4.优缺点优点:比较次数少,查找速度快

2021-08-13 16:01:55 907 1

原创 递归回溯解决八皇后问题

文章目录前言八皇后问题问题解析代码实现完整代码前言八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。现代教学中,把八皇后问题当成一个经典递归算法例题。八皇后问题问题解析首先八个皇后之间需要满足:不在同

2021-08-13 10:47:09 384 2

原创 回溯算法解决迷宫问题

文章目录前言一、回溯法二、算法应用——迷宫问题1.问题描述2.解题思路三、Java代码实现前言本文介绍一种经典算法——回溯法,可作为迷宫问题的一种解法。一、回溯法回溯是一种算法思想,用递归实现,类似于枚举的搜索尝试过程。主要思想在于搜索尝试过程中寻找问题的解,当发现不满足求解条件时,则立刻回溯返回,尝试别的解决方案。可作为一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现该选择不优或者无法达到目标,就退回一步重新进行选择,而满足回溯条件的某个状态点称为“回溯点”。二、算法应用

2021-08-11 16:46:45 4276 2

原创 数据结构:栈实现逆波兰计算器

栈实现逆波兰计算器前言上篇博文中已经介绍了栈实现中缀表达式计算器,中缀表达式形如 “1+((2+3)*4)-5” 对人比较容易计算,但对于计算机却是一件比较困难的事,而后缀表达式 "1 2 3 + 4 * + 5 -"恰恰相反,对人计算起来不是很方便,但对于计算机比较方便并且高效,因此本博文将讲解如何将中缀表达式转换为后缀表达式和实现后缀表达式的计算。1.中缀表达式转换为后缀表达式1.1思路初始化两个栈:运算符栈s1和储存中间结果的栈s2从左至右扫描中缀表达式扫描到数字时,将其入栈s2扫

2021-08-11 01:00:53 266 1

原创 数据结构:栈实现简易计算器

文章目录栈实现简易计算器思路代码实现栈结构运算方法测试栈实现简易计算器之前的博客已经介绍了栈数据结构,栈有着数据先进后出的特点,因此用于实现简易计算器时相当方便。本博文中将介绍如何用栈实现一个可以进行简单四则运算不含括号的简易计算器(中缀表达式)思路首先创建两个栈,一个用于存储数而另一个用于存储运算符号。首先需要一个index索引来遍历表达式遍历到数字时直接入数栈遍历到运算符时需要分情况讨论如果当前符号栈为空直接入栈如果当前符号栈不为空需要分情况讨论当前遍历到的运算符的运算优先级小

2021-08-07 21:53:53 6684 2

原创 数据结构:栈

文章目录栈1.定义:2.用数组模拟栈2.1思路2.2代码实现3.用链表模拟栈3.1思路3.2代码实现栈1.定义:栈是一个先入后出(FILO-First In Last Out)的有序列表栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端为变化的一端,称之为栈顶,另一端为固定的一端,称之为栈底。根据栈的定义可知,最后放入栈中的元素在栈底,最后放入的在栈顶。而删除元素恰好相反,最后放入的元素最先删除,最先放入的元素最后删除。2.用数组模

2021-08-05 23:50:21 135 2

原创 数据结构:循环链表解决约瑟夫问题

约瑟夫问题问题来历据说著名犹太历史学家Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。然而Josephus 和他的朋友并不想遵从。首先从一个人开始,越过k-2个人(因为第一个人已经被越过),并杀掉第k个人。接着,再越过k-1个人,并杀掉第k个人。这个过程沿着

2021-08-05 13:26:18 539 2

原创 数据结构:双向链表

文章目录双向链表1.定义1.1双向链表定义:1.2单链表特点:1.3双链表特点:2.代码实现2.1双向链表的节点结构:2.2插入节点2.3删除节点2.4修改节点2.5遍历链表双向链表上篇博客已将讲解过单向链表,单向链表在实现增删改查时速度还是有所限制,可以通过双向链表更快地实现操作。1.定义1.1双向链表定义:​ 双向链表也是链表的一种,每个数据节点中都有两个指针,一个为pre指向前一个节点(前驱),另一个为next指向下一个节点(后继),因为这个特点,双向链表可以很方便的访问任意节点的前驱节点

2021-08-04 15:20:57 629 2

原创 数据结构:单向链表的反转

文章目录单链表的反转1.头插法1.1思路1.2代码实现2.就地逆置法2.1思路2.2代码实现单链表的反转本文主要介绍头插法逆置和就地逆置法实现链表的反转1.头插法1.1思路迭代方式的链表反转操作核心是从链表头到链表尾首先让创建一个temp指针使其指向头节点的下一个节点,并将其取出取出之后让新创建的reverseNode节点指向刚取出的节点,反复进行上述操作。需要注意的是每次取出节点之前,需要用另外一个指针暂存temp指向的节点的下一个节点,防止temp指针变化后找不到新的节点。最后让初

2021-08-03 13:29:17 1214 2

原创 数据结构:单向链表

单链表文章目录单链表前言单向链表的结构代码实现链表存储的节点链表初始化链表的基本操作增加节点按照编号顺序添加节点更新节点中数据遍历链表获取链表长度获取倒数第n个节点前言在链表的学习之前,我们已经学过了数组,在数组创建时,其数组长度已经写死了,因此对于数据的拓展,数组具有一定的局限性。数组有一个很重要的结构就是索引,我们在数组中查询数据也是用索引去查询,因此当需要删除数据时,必须将所有数据进行移动改变索引,性能开销相当大,而链表就可以解决以上问题。单向链表的结构[外链图片转存失败,源站可能有防盗链

2021-08-02 22:38:53 111

原创 数据结构:队列

1.队列1.1定义队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。队列(Queue)是一种先进先出(First In First Out)的线性表,简称FIFO。允许插入的一端叫做队尾,删除的一端叫做队头。1.2队列顺序存储的约定及说明front变量指向队头元素的前一个位置rear变量指向队尾的数据空队时,rear == front队列初始时,rear = front = 0入队:队列未满时,将数据送至队尾,rear指针加一出队:队列不为空时,将

2021-08-01 17:24:15 368 1

原创 数据结构:稀疏数组

稀疏数组1.定义稀疏数组相当于普通数组的压缩,当一个数组中大部分元素为0或者为同一个值的数组时,可以用稀疏数组来保存该数组。例如:原始数组:0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

2021-07-31 18:04:53 125 1

原创 Ftp实现上传文件至远程服务器

服务器安装FTP服务1.安装vsftpdyum -y install vsftpd2.关闭匿名访问vim /etc/vsftpd/vsftpd.conf将anonymous_enable的值改为NO[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lJmjKgfA-1627114115784)(C:\Users\Supreme honor\AppData\Roaming\Typora\typora-user-images\image-20210722140

2021-07-24 16:16:05 912 7

原创 Java后端:Linux的基本使用学习笔记

Linux简介Linux 内核最初只是由芬兰人林纳斯·托瓦兹(Linus Torvalds)在赫尔辛基大学上学时出于个人爱好而编写的。Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX(可移植操作系统接口) 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操

2021-05-28 13:13:14 324 1

空空如也

空空如也

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

TA关注的人

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