自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 算法入门之基本数据结构:链表

前面我们简单的对队列和栈有了个了解,今天我们还要将一种数据结构,Java中很多集合类都是由这几种数据结构演变而来的,除了队列和栈还有我们今天要说的链表,链表其实还是蛮复杂的,在C中有个指针用来实现,很多人说java不存在指针概念,是不是就不能实现链表呢,答案是否,java虽然没有指针但是有对象的引用,我们先看看java中怎么实现链表,然后再来具体分析链表到底是一种怎样的数据结构。代码模拟链表:public class MyLinkList { // 使用数组模拟单向链表 publ

2020-07-23 22:05:36 2591

原创 算法入门之基本数据结构:队列和栈

大家都知道,算法和数据结构是息息相关,学习数据结构能帮助我们更好的理解算法,理解编程,这是一种编程思想的培养;今天我们要介绍的数据结构是:队列,可以把队列想象成一个双向管道,一边进另一边出代码示例public class QueueDemo { public static void main(String[] args) { //1.初始化一组数据 int[] start = {1,2,3,4,5,6,7,8,9}; //2.初始化一个空队列...

2020-07-23 22:02:24 2558

原创 算法入门之最常用的排序:快速排序算法

回顾前面2篇文章我们提到了桶算法和冒泡算法,虽然冒泡算法解决了桶算法的空间问题,但是如果排序的基数比较大,你会发现冒泡算法的时间复杂度O(N²)也是惊人的,有没有一种更好的算法既能解决空间问题又能解决时间复杂度的问题呢?答案就是我们今天要说的:快速排序算法先上代码实现:public class QuickSort { public static int[] sort(int[] waitNumbers, int start, int end) { // 当开始下标大...

2020-06-23 20:13:19 8323

原创 入门算法之中国好邻居:冒泡排序

上文我们聊到桶排序,了解到虽然桶排序简单,快速,但是同时也有其致命的缺点:那就是空桶对内存空间的极大浪费以及只能针对正整数排序;所以我们需要一个较好的算法来解决这两个问题,接下来我们就来认识一个新的算法:冒泡排序。先上代码实现:public class BubbleSort { public static void main(String[] args) { // 1.等待排序的数组 int[] waitNumbers = {3,15,8,13,6,...

2020-06-23 20:12:24 11561

原创 入门算法之最快最简单的排序:桶排序

桶排序算法是最简单最快速的排序算法,今天我们先从最简单的开始接触算法,首先我们先看下代码实现,然后根据结果再来对该算法进行分析:public class BucketSort { public static void main(String[] args) { // 1.等待排序的数组 int[] waitNumbers = {3,15,8,13,6,35}; // 2.准备好空桶 (带排序数字中最大的那个值+1) ...

2020-06-21 19:10:24 9934

原创 并发编程系列之线程池工厂类:Executors

前言上节讲了讲自定义线程池,今天我们来聊聊线程池框架,在实际开发中我们还是基本使用线程框架Executor给我们提供的一些工具类,Java提供的Executor都在JUC(java.util.concurrent)包下面,主要包括:线程池工厂类Executors,线程池实现类ThreadPoolExecutor等,今天呢我们主要聊聊Executors,看看通过Executors我们可以做什么?OK,不多说废话,我们马上进入今天的主题,让我们扬帆起航,开启今天的并发之旅吧。什么是Executor.

2020-06-21 19:08:00 10114

原创 并发编程系列之自定义线程池

前言前面我们在讲并发工具类的时候,多次提到线程池,今天我们就来走进线程池的旅地,首先我们先不讲线程池框架Executors,我们今天先来介绍如何自己定义一个线程池,是不是已经迫不及待了,那么就让我们开启今天的旅途吧。什么是线程池?线程池可以理解为一个专门管理线程生命周期的池子,里面的线程都可以由这个池子本身来调度,使用线程池有哪些好处呢? 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗 提高响应速度:当任务到达时,任务可以不需要的等到线程创建就能立即执行.

2020-06-21 19:06:33 11349

原创 并发编程系列之Semaphore

前言上节我们介绍了Java中的并发工具类CountDownLatch和Cyclicbarrier,今天我们再来说说另外两个并发工具类:Semaphore(信号量)和Exchanger(交换者),首先我们先来说说信号量这个东西,结合我们今天所讲的,我们了解下,这个东西到底有啥用,话不多说,让我们开启今天的并发之旅吧。什么是信号量?信号量是用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用公共资源。这样说可能大家不是很理解,那我就举个生活中常见的场景,结合场景描述..

2020-06-20 22:15:02 10427

原创 并发编程系列之Exchanger

前言上面我们介绍了信号量,再来说说交换者,这个东西用的不是很多,所以一般也不被经常关注,但是我们还是最好了解下,下面我将从什么是Exchanger以及如何使用Exchanger两个方面谈谈这个用于线程间协调的工具类。什么是Exchanger?Exchanger主要是用于线程之间进行数据交换的,提供一个同步点,在这个同步点,两个线程可以交换彼此的数据;两个线程通过Exchanger方法来进行交换,当第一个线程先执行Exchanger()方法,他会一直等待第二个线程也执行Exchanger方法.

2020-06-18 23:34:54 11518

原创 并发编程系列之CountDownLatch对战Cyclicbarrier

前言前面我们介绍了并发容器和队列,今天我们来介绍几个非常有用的并发工具类,今天主要讲CountDownLatch和Cyclicbarrier这两个工具类,通过讲解并对比两个类的区别,OK,让我们开始今天的并发之旅吧。什么是CountDownLatch?CountDownLatch用于监听某些初始化操作,等待初始化执行完毕,通知主线程继续工作,允许一个或者多个线程等待其他线程完成操作。之前我们知道要实现线程等待还有一个方法就是jion方法,先让我们来回忆什么是Join方法:Join用于让.

2020-06-16 09:51:43 9527

原创 并发编程系列之Fork/Join

前言上节我们讲了阻塞队列,Java中的并发容器就算有了个基本的认识,今天我们来介绍一种线程工作模式,叫Fork/Join,他是JDK7之后提供的一个并行执行框架,主要的思想我觉得是分而治之,将一个大的任务分成多个小的任务并行执行,然后等所有小任务执行完毕后汇总结果,完成任务执行,是不是觉得这种模式挺好的,也有不少类似场景可以适用吧,那还等什么,开始进入我们今天的并发之旅吧。什么是Fork/Join?Fork/Join从上图很容易理解他是一种分合思想,Fork/Join最常用的场景就用在工

2020-06-14 21:35:04 15960

原创 并发编程系列之阻塞队列(BlockingQueue)

前言上节我们介绍了非阻塞队列ConcurrentLinkedQueue的相关内容,今天我们再来说说Java中的阻塞队列BlockingQueue,主要介绍下阻塞队列的概念,常见的阻塞队列,以及阻塞队列的底层实现。什么是阻塞队列?阻塞队列就是一种支持阻塞的插入和移除操作的特殊容器 阻塞的插入:当队列满时,向队列中插入元素的线程会被阻塞,直到队列中有元素被移除,即队列不满时,阻塞的线程才能继续向队列中插入元素; 阻塞的移除:当队列中没有元素时,即队列为空时,从队列中移除元素的线.

2020-06-14 21:33:41 14391

原创 并发编程系列之并发容器:ConcurrentLinkedQueue

前言上节我们介绍了线程安全的HashMap,今天我们再来介绍一个线程安全的并发容器:ConcurrentLinkedQueue,它是一个线程安全的队列,在Java中如果要实现一个线程安全的队列由2种方式:一个是使用阻塞算法的队列,用一个锁(入队和出队列共享同一把锁)或者两个锁(入队和出队各持一把锁)来实现,另一个是使用非阻塞的CAS方式来实现,今天我们我们就来一起看看如何使用非阻塞方式实现ConcurrentLinkedQueue,OK,让我们扬帆起航,开始今天的并发之旅吧。什么是Concur.

2020-06-12 20:17:39 15976

原创 并发编程系列之并发容器:ConcurrentHashMap

前言之前我们讲了线程,锁以及队列同步器等等一些并发相关底层的东西,当然Java开发者在开发中很少直接去使用之前所讲的,因为Java为了简化开发,为我们提供了一整套并发容器和框架,但是这些容器和框架都是建立在之前所讲的基础之上的,今天就让我们来看第一个并发容器:ConcurrentHashMap,我们主要从原理和使用两个方面介绍,让我们扬帆起航,开始今天的并发之旅吧。景点一:为什么要使用ConcurrentHashMapConcurrentHashMap是一个线程安全并且高效的HashMap.

2020-06-11 23:19:34 16136

原创 并发编程系列之Condition接口

前言前面我们学习线程的时候讲过等待通知模式,之前讲的是通过wait,notify/notifyAll配合synchronized关键字,实现等待通知,今天呢,我们介绍另外一种同样实现等待通知模式的对象叫做condition接口,配合lock使用,也能完成等待通知,但是跟之前说的又有一些区别,今天就让我们来认识一下吧,OK,开始我们今天的并发之旅吧,祝您旅途愉快。什么是Condition接口?Condition定义了等待/通知两种类型的方法,当前线程如果调用这些方法之前,必须先获取到cond.

2020-06-11 23:11:21 15904

原创 Mysql如何先根据字段1为NULL排序,再根据字段2正常排序

ORDER BY 字段1 IS NULL DESC,字段2 DESC

2020-06-10 22:36:35 18041

原创 并发编程系列之重入锁VS读写锁

前言上节我们介绍了Java中的锁基础篇,也算是对锁有了个基本的认识,对锁底层的一些原理有所掌握,那么今天我们就来看看2个最常见的锁的实例应用,重入锁和读写锁,这是今天旅途最美的两大景点,是不是有点迫不及待了,OK,那就让我们一起开启今天的并发之旅吧,祝您今天的旅途愉快。景点一:重入锁什么是重入锁?重入锁ReentrantLock指的是支持重进入的锁,表示该锁能够支持同一个线程对资源的重复加锁,也就是说当线程对某个资源获取锁之后,该线程继续获取该资源的锁时不会被阻塞;synchron.

2020-06-10 19:37:05 19069

原创 mysql更新一张表的字段来自另一张表的某个字段

UPDATE tbaaLEFT JOIN tbbbon a.id=b.idset a.xxx= b.xxxxwhere a.id= b.id

2020-06-10 16:15:56 19834

原创 并发编程系列之锁基础篇

前言上节我们介绍了线程的相关知识,今天我们开始逛逛Java中锁的相关旅途,今天我们先介绍基础景点,主要讲解下Java中的Lock接口和AQS,OK,让我们开始今天的并发之旅吧。景点一:Lock接口什么是Lock对象?锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问。一次只能有一个线程获得锁,对共享资源的所有访问都需要首先获得锁。不过,某些锁可能允许对共享资源并发访问,如ReadWriteLock的读取锁。synchronized方法或语句的通过对每...

2020-06-10 13:13:57 19302

原创 面试系列之缓存篇

Redis有哪些数据类型?五大数据类型:string、hash、list、set、sorted setRedis主从复制的过程? slave与master建立连接,发送sync同步命令 master会开启一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存 后台完成保存后,将文件发送给slave slave将此文件保存到硬盘上,并载入数据库 Redis主节点宕机了怎么办,还有没有同步的数据怎么办?为了避免主节..

2020-06-09 21:45:47 18150

原创 并发编程系列之线程之间的通信

前言上节我们介绍了线程从创建到结束的过程,介绍了几种常见的启动和终止方法,我们知道了如何使用一个线程,那么今天我们再接下来看看1个或者多个线程之间是如何进行通信的?OK,让我们一起走进今天的并发之旅吧,祝您旅途愉快。景点一:共享变量(volatile)关键字volatile可以用来修饰一个共享的变量字段,使用volatile修饰的变量,当访问该变量时需要从共享内存中获取最新值,而对该变量的更新,必须同步刷新回共享内存,这样就能保证所有线程对该变量访问的可见性;结合示例代码更容易理解:p

2020-06-09 20:42:01 18223

原创 并发编程系列之线程的启动终止

前言上节我们对线程有了个基本的概念和认识,从线程状态转变过程我们也已经知道了线程通过调用start方法进行启动,直到run方法执行线程结束,今天我们就来详细的说说启动和终止线程的细节,OK,让我们开始今天的并发之旅吧。创建线程在使用一个线程之前我们需要先构造线程,即new一个线程Thread thread =newThread();线程对象在构建的时候需要提供线程所需要的属性,如线程组、优先级等等,下面我们看下如下的源代码:privatevoidinit(Thr...

2020-06-09 19:57:21 18197

原创 并发编程系列之线程简介

前言前几天我们把Java内存模型介绍了下,大家对JMM也有所认识了,从今天我们就开始走进一个我们天天挂在嘴边,听在耳边的东西:线程,对于线程相信大家都不会陌生,当然也有很多小伙伴在开发中或多或少的使用到线程,即使你没有使用过,但是并不代表你的程序中不存在,相反,他是一定会存在的,虽然这有点废话,OK,那我们废话也不多说,今天我们先对线程做个简单的介绍,那么,让我们一起开始新的旅途吧。什么是线程?线程是现代操作系统调度的最小单元,也叫轻量级进程,在一个进程中可以创建多个线程,每个线程都拥有自己

2020-06-09 19:47:58 19567

原创 并发编程系列之Final域的内存语义

前言上节我们讲了锁的内存语义,在同步原语中我们已经讲了两个,今天再来介绍另一个同步原语Final域,了解下final域的内存语义以及重排序规则在处理器中又是如何实现的,并结合前面的volatile和锁,大家可以进行对比下,OK,开始我们今天的并发之旅吧。final域的重排序规则对于final域,编译器和处理器需要遵循两个重排序规则: 对一个构造函数内final域的写入,与后续把这个构造对象的引用赋值给一个引用变量,这2个操作之间是不能重排序的,相当于对一个final域的写和读不能重排序

2020-06-09 19:43:32 18363

原创 并发编程系列之锁的内存语义

前言上节我们介绍了volatile的内存语义,今天讲讲另一个同步原语锁是如何保证同步的,我们同样从锁的内存语义讲解,上节也有提到volatile的内存屏障能达到和锁同样的效果,那么我们就来看看锁的内存语义吧,OK,开始今天的并发编程之旅吧。基于锁建立的先行发生原则锁可以保证临界区的执行互斥,而且可以让释放锁的线程向获取该锁的线程发送消息,下面我们看下锁是如何保证先行发生原则的:锁的释放和获取的内存语义锁的释放内存语义:当线程释放锁时,JMM会把该线程对应的本地内存...

2020-06-09 19:35:08 18280

原创 并发编程系列之volatile内存语义

前言前面介绍顺序一致性模型时,我们提到了程序如果正确的同步就会具备顺序一致性,这里所说的同步泛指广义上的同步,其中包括就包括同步原语volatile,那么volatile声明的变量为什么就能保证同步呢?这又是如何实现的呢?今天就让我们一起来揭开这神秘的面纱,OK,开始我们今天的并发编程之旅吧。volatile的特性volatile特性可以理解为对volatile变量的单个读写,看成是使用了同一个锁对这些单个读写进行了同步,他们之间的执行效果是一样的;volatile变量自身具有下面2种特性:

2020-06-09 19:29:43 18335

原创 并发编程JMM系列之重排序和顺序一致性

前言昨天我们接触到了什么是Java内存模型以及两种Java并发模型,并对JMM有了一些初步的认识和了解,我们在上节有提到JMM的重排序规则,但是讲的不详细,今天我们再重点聊下重排序这个东西,以及顺序一致性内存模型,OK,开始我们今天的并发之旅吧。重排序要遵循的三个原则重排序的目的是提高编译器和处理器的并行处理能力即并行度,但是在做重排序时,一般都会遵循下面3种原则:数据依赖性原则:如果两个操作访问同一个变量,并且这两个操作中有一个操作是写操作,那么这两个操作之间就存在数据依赖性,上节我们

2020-06-09 16:24:50 17734

原创 并发编程JMM系列之基础

前言Java程序员在进行多线程开发时,并不需要关心线程间是如何通信的,这些对程序员本来来说完全是透明的,但是内存可见性问题很容易让我们困惑,今天开始我们就讲讲Java内存模型(JMM)相关知识点,首先我们先讲讲内存模型的一些基本概念,对内存模型有个大概的认识,让我们开始今天的并发之旅吧。并发编程模型的关键问题并发编程模型主要有两种模型:共享内存模型和消息传递模型,在这两种模型中都需要解决并发编程最关键的两个问题:共享内存模型: 线程之间通信:线程之间共享程序的公共状态,通过读-写.

2020-06-07 22:55:35 18206

原创 并发编程系列之原子操作实现原理

前言上节我们讲了并发编程中最基本的两个元素的底层实现,同样并发编程中还有一个很重要的元素,就是原子操作,原子本意是不可以再被分割的最小粒子,原子操作就是指不可中断的一个或者一系列操作。那么今天我们就来看看在多处理器环境下Java是如何保证原子操作的,ok,开始我们今天的并发编程之旅吧。处理器如何实现原子操作处理器自身会自动保证基本的内存操作原子性,保证从系统内存中读取或者写入一个字节动作是原子性的,也就是说,当处理器读取一个字节时,其他处理器不能访问该字节的内存地址。但是处理器自身只能保证.

2020-06-07 09:24:23 19109

原创 并发编程系列之volatile和synchronized实现原理

前言上节我们讲了并发的一些挑战,算是开启并发编程的大门,今天我们就来说说并发中最基本的两个东西volatile和Synchronized的底层实现原理,我们都知道Java代码在编译后会变成字节码,然后被类加载器加载到JVM中,JVM执行字节码,最终需要转化为汇编指令在CPU上去执行,因此Java中所使用的的并发机制是依赖于JVM的实现和CPU的指令完成的。ok,那么我们现在就开启我们今天的并发之旅吧。SynchronizedSynchronized是并发编程中最基本最古老的元素,一般也被称.

2020-06-07 09:07:38 19382

原创 JVM系列之类加载器

前言上节我们介绍了类加载的时机和过程,对类加载有了个初步的认识,上节我们有不断提到一个东西:类加载器,那么什么是类加载器?又有哪些类加载器?类加载器之间的联系等等一些问题,今天我们将会围绕这些点展开,那么,开始我们今天的JVM之旅吧。什么是类加载器?把类加载阶段中的“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类,实现该动作的代码模块就被称为“类加载器”。类与类加载器的联系类加载器用于实现类的..

2020-06-05 20:10:12 19946

原创 JVM系列之类加载

前言虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程就称为JVM的类加载机制。今天我们主要从下面两个方面说下类加载:类加载时机和类加载过程。类加载时机类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解析、初始化、使用和卸载7个阶段,其中验证+准备+解析3个阶段称为连接。加载、验证、准备、初始化和卸载5个阶段的顺序是确定的,类加载过程必须按这5个顺序开始,解.

2020-06-05 20:07:07 19972

原创 JVM系列之内存分配与回收策略

前言经过前面几篇文章,我们已经对JVM虚拟机有了个初步认识,也了解了各区域应用哪些收集器,以及每个收集器用哪些收集算法,但是在这一系列过程中,其实就是一个对象的由生到死的过程,那么在这过程中对象是怎么处理它的生命周期的呢,今天我们就来介绍下对象在内存中的分配和回收分配给对象的内存,那么,让我们带着愉快的周末心情来开启今天的JVM之旅吧。内存分配内存分配,通俗讲就是对象在堆上分配:对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。少数对象也可能直接.

2020-06-05 19:58:46 20079

原创 JVM系列之垃圾收集算法

前言上节我们介绍了JVM虚拟机对象的存活判断,提到了GC回收,GC回收指的是将存在内存中的不会再被使用的对象当成垃圾倒掉,垃圾回收算法有很多例如:引用计数,标记清除,复制,分代,分区,那么今天我们就来谈谈Java中这几种垃圾回收算法,OK,让我们开启今天的JVM之旅。引用计数算法引用计数是一个比较古老的算法,核心是:在对象被其他对象所引用时计数器加1,而当引用失效时则减1,但是这种方式有非常严重的问题:无法处理循环引用的情况,还有就是每次进行加减操作比较浪费系统性能。标记-清除算..

2020-06-05 16:54:23 20135

原创 JVM系列之对象是否存活

前言之前我们讲过了JVM的内存区域和内存溢出,今天我们谈下处于JVM中的对象的问题,这些对象是否存活,如何判断,又如何去处理呢,带着这些疑问我们开启今天的JVM之旅。如何判断对象是否存活? 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就+1,当引用失效时,计数器的值就-1;当计数器的值为0时,就表示该对象为不可用对象; 优点:引用计数算法实现简单,效率也很高 缺点:很难解决对象之间相互循环引用时的对象存活判断,例如对象A和B相互引用对方,即使A和B.

2020-06-05 16:41:01 20121

原创 JVM系列之OOM异常

前言之前我们简单的介绍了下虚拟机内存结构,今天我们讲下虚拟机的内存相关错误异常,主要从几大内存区域分类介绍:Java堆溢出、虚拟机栈和本地方法栈溢出、方法区和运行时常量池溢出、本机直接内存溢出。Java堆溢出 什么时候产生堆溢出? 堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量达到了最大堆容量限制时就会产生堆溢出异常; 堆溢出如何分析? 通过设置参数:-XX:+Heap.

2020-06-04 22:27:53 20786

原创 JVM系列之Java内存区域

前言对于Java开发者来说,在虚拟机的自动内存管理机制下,不需要去关心每个对象的存亡,只需要创建出来就完全扔给了虚拟机去处理,而且还不容易出现内存泄露和内存溢出的问题,这看起来很美好,但是如果一旦出现内存泄露和溢出的问题,你就会很棘手,所以我们一定要了解Java虚拟机是如何管理内存的,否则你排出问题将无从下手。下面我们将从以下2个方面谈谈Java虚拟机的内存区域:运行时数据区域、对象访问。运行时数据区域Java虚拟机在执行Java程序时会把它管理的内存划分为若干区域,这些区域各有自己的作用.

2020-06-04 22:18:00 20722

原创 RocketMQ系列之顺序消费

前言上节我们介绍了RMQ的两大亮点,重试和重复消费的问题,其实重试才能算亮点,重复消费最终还是要由我们自己来解决这个问题,RMQ自身并没有提供很好的机制,至少目前是没有,不知道将来会不会有,OK扯远了,今天呢,我们再来介绍RMQ一个不错的地方,那就是顺序消费,RMQ是可以保证同一个queue中的消息被顺序的消费。RMQ实现如何实现顺序消费?生产者Producer在生产消息时将需要顺序消费的消息发送到同一个queue下,每个topic默认是有4个queue所以Producer需要一个队列选择.

2020-06-04 13:20:56 21476

原创 RocketMQ系列之消息重试+重复消费

前言上节我们介绍了RMQ的几大模块以及每个模块的作用,前面也介绍了RMQ的订阅消费案例,今天我们来看一个RMQ的消息重试机制和重复消费的问题,了解这2点有助于我们更好更合理的处理消息消费的异常情况。为什么会出现消息重试?因为RMQ的消息都是通过网络传输的,通过网络传输就难免会受网络环境的影响,各种可能存在的情况,可能导致生产者Producer发送消息失败,也可能导致消费者Consumer消费消息失败,因此RMQ的消息重试机制就显得比较重要了,这也是RMQ的一大优势所在,显然消息重试机..

2020-06-04 13:18:48 24711 2

原创 RocketMQ系列之入门

前言之前我们把RMQ的多Master集群搭建起来了,我们今天就来看看如何向这个集群生产消息以及消费消息。集群搭建回顾回顾上节的内容,我总结下以下几步:第一:最新版RMQ4.2.0要求最低JDK8版本第二:修改虚拟机的host,配置nameserver域名第三:安装RMQ第四:新建RMQ的消息存储文件第五:修改RMQ的日志输出第六:配置Broker配置文件第七:根据虚拟机实际情况修改runserver.sh和runbroker.sh启动参数第八:启动names.

2020-06-03 20:00:00 21189

空空如也

空空如也

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

TA关注的人

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