自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(68)
  • 资源 (4)
  • 收藏
  • 关注

原创 RocketMq源码分析(九)--顺序消息

1、消息顺序消费,需要将消费主题(topic)设置成一个队列2、顺序消息消费需要经历4个步骤:消息队列负载、消息拉取、消息消费、消息进度存储。

2023-12-10 18:05:57 812

原创 RocketMq源码分析(八)--消息消费流程

消息消费有2种实现,分别为:并发消费实现(ConsumeMessageConcurrentlyService)和顺序消费实现(ConsumeMessageOrderlyService)。2)DefaultMQPushConsumerImpl#pullMessage方法中定义了回调实现,在成功拉取消息后,先将消息放到processQueue中,然后再提交消费请求(ConsumeMessageConcurrentlyService中创建消息消费请求线程ConsumeRequest,然后提交到线程池。

2023-10-28 16:45:05 119

原创 RocketMq源码分析(七)--消息发送流程

消息发送根据消息通信模式(同步、异步、单向)决定消息发送次数。在重试发送时,记录上一次发送失败的broker(lastBrokerName),这样在下一次重试时能避免再次往失败的broker发送。执行消息发送时,选择所发送消息topic的一个队列,这个队列不能是上一次重试时使用的队列(lastBrokerName)当向消息:producer向broker发送消息,执行发送后立即返回,也不等待broker结果。如果消息是事务消息,添加事务标记。消息发送请求对象,包含发送消息必要的信息(topic、队列等)

2023-05-21 15:46:34 1031

原创 RocketMq源码分析(六)--消息消费者启动流程

如果是刚创建实例时(CREATE_JUST状态),则先将附实例状态更改为START_FAILED,然后进行一些列初始化并启动操作(检查配置、复制订阅信息、设置负载均衡实现、创建并加载消息进度offsetStore、创建并启动消息消费consumeMessageService服务、向消费者工厂注册自己),最后变更为RUNNING状态。//服务实例状态,有:CREATE_JUST、RUNNING、SHUTDOWN_ALREADY、START_FAILED,默认CREATE_JUST。接口定义,默认实现类为。

2023-05-02 17:28:00 900

原创 RocketMq源码分析(五)--消息生产者启动流程

消息生产者方法由接口MQProducer定义,默认消息生产者实现类为DefaultMQProducer

2022-10-22 17:41:05 670

原创 RocketMq源码分析(四)--消息存储服务MessageStore

所以在保存消息的最后,需要提交一次刷盘,然后根据消息的持久化策略,选择进行同步刷盘还是异步刷盘,将内存中的消息数据持久化到磁盘文件中。如果当前mappedFile剩余可添加消息空间大小不足以添加当前消息,这个时候会返回。对于延时消息,把消息原始topic及queueId存入到消息的属性中,然后将当前topic、queueId替换为。方法保存消息之后,消息此时还只是保存在内存中,并未真正保存到commitLog文件中。在保存消息内容之前,先将消息内容计算出一个CRC校验码,用于后续消息内容校验。

2022-10-05 23:28:42 624

原创 RocketMq源码分析(三)--Broker启动流程

Broker启动流程

2022-09-25 16:34:27 618

原创 RocketMq源码分析(二)--nameServer启动流程

NameServer启动流程,源码解析

2022-09-04 10:32:42 324

原创 RocketMq源码分析(一)--基本知识

  RocketMq技术架构上主要分为4个部分:NameServer,Producer,Consumer,BrokerServer。  Topic、Tag、Queue是Broker中重要的概念,在Broker消息过滤、查询中起到重要的作用。  消息存储主要由CommitLog、ConsumeQueue、IndexFile三个部分文件构成  (1) 同步刷盘:消息真正持久化至磁盘后,broker才会给producer返回ACK响应  (2)异步刷盘:利用PageCache,只要消息写入PageCache即可

2022-08-14 16:30:58 643

原创 Java SPI机制应用实战

  SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制,可以轻松实现面向服务的注册与发现,完成服务提供与使用的解耦,并且可以实现动态加载。  引入服务提供者就是引入了SPI接口的实现者,通过本地的注册发现获取到具体的实现类,轻松可插拔,SPI实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态加载,为某个接口寻找服务实现的机制。  利用SPI机制,快速实现一个可插拔服务,实现步骤也简单。  定义一个接口(SPIService):  创建

2022-06-19 22:20:08 333

原创 Redis知识(七)--高可用/集群

引言  Redis高可用部署有以下两种方式:哨兵模式(sentinel) 和集群模式。一、哨兵模式  哨兵模式由一个或多个哨兵实例组成的哨兵系统,可以监视任意多个主服务器,以及从属主服务器的所有从服务器。当主服务器进入下线状态(宕机、下线)时,哨兵系统自动将该主服务器的某个从服务器提升为新的主服务器,代替原来的主服务器继续接收并处理命令请求。1、哨兵启动初始化  启动一个哨兵可使用命令redis-sentinel /path/sentinel.conf或者命令redis-server /path

2021-10-03 11:40:32 106

原创 Redis知识(六)--主从复制

引言  在了解了Redis的底层结构以及持久化机制后,就可以开始学习Redis主从复制的原理了。  Redis中,通过SLAVEOF命令或者slaveof选项设置就可以实现一个服务器复制另一服务器。  Redis2.8版本以前复制为旧版,2.8开始使用新版复制功能。  Redis中,从服务器对主服务器的复制可以分两种情况:初次复制:从服务器以前没有复制过任何主服务器,或者从服务器当前要复制的主服务器和上一次复制的主服务器不同断线后复制:处于命令传播阶段的主从服务器因为网络原因而中断了复制,但

2021-09-12 22:58:04 91

原创 Redis知识(五)--事件

一、引言  前面已经讲过Redis底层数据结构以及Redis持久化的方式、原理。本次主要说说Redis的事件。Redis的事件主要分为两类:  文件事件(file event):Redis服务器通过套接字与客户端(或其他Redis服务器)进行连接,而文件事件就是服务器对套接字操作的抽象  时间事件(time event):Redis服务器中的一些操作,如serverCron函数,需要在给定的时间点执行,时间事件就是Redis对这类定时操作的抽象二、文件事件  Redis基于Reactor模式

2021-09-04 17:21:39 204

原创 Redis知识(四)--持久化

一、引言  Redis是一个内存数据库,它将自己的数据库状态存在内存里面。如果不想办法将存储在内存的数据库状态保存到磁盘里面,一旦服务器进程退出,那么数据也就不见了。  为了解决这个问题,Redis提供了RDB和AOF持久化功能,将Redis内存中的数据保存到磁盘里面,避免意外丢失。二、RDB持久化  RDB持久化功能所生成的RDB文件是一个经过压缩的二进制文件,通过该文件还可以还原生成RDB文件时的数据库状态。1、RDB文件的创建与载入1.1、RDB的创建  有两个命令可以用于生成RDB文件

2021-08-29 22:11:44 119

原创 Redis知识(三)--底层数据结构

引言  Redis常用的数据类型有5种:字符串(String)、哈希(Hash)、列表(List)、集合(Set)以及有序集合(Zset)。而这5中数据类型,实际由Redis底层数据结构实现。  根据《Redis设计与实现》一书的介绍,可以了解到,Redis底层数据结构有如下数据类型:简单动态字符串(simple dynamic string,SDS)链表字典跳跃表整数集合压缩列表对象简单动态字符串(simple dynamic string,SDS)定义struct sdshd

2021-08-22 22:07:50 200

原创 处理大文件排序的方式--外部排序

引言  一般来说,对一个数组的排序,我们常用冒泡排序、快速排序、堆排序等算法进行排序。这样的数组能够一次性加载到内存中,使用上述的排序算法就能轻而易举进行排序,所以上述的排序算法可以称之为堆内排序。  然而有些场景下,一个待排序的文件可能超过甚至远远大于应用程序的运行内存。这种情况,一次性将文件加载到内存中,明显是不可行的,需要使用其他的排序手段进行排序。外部排序就是一种可行的方案。基本思想...

2021-08-14 18:23:29 1841

原创 Java性能调优(总结)

前言  本文结合《Java性能权威指南》一书进行总结,用于Java代码性能调优实战。  改善性能涉及的3种不同活动:性能监控、性能分析、性能调优。性能监控:非侵入式收集或查看应用运行性能数据的活动。性能分析:侵入式方式收集性能数据的活动,会影响应用吞吐量或响应性。性能调优:改善应用响应性或吞吐量而更改参数、源代码或属性配置的活动。性能分析的两种方法自顶向下:着眼于软件栈顶层的应用,从上往下寻找优化机会和问题。是最常用的性能调优方法,涉及代码修改也用这招。

2021-08-07 18:49:08 788

原创 TCP拥塞控制

背景介绍  两台主机在传输数据包的时候,如果发送方迟迟没有收到接收方反馈的ACK,那么发送方就会认为它发送的数据包丢失了,进而会重新传输这个丢失的数据包。然而实际情况有可能此时有太多主机正在使用信道资源,导致网络拥塞了,而A发送的数据包被堵在了半路,迟迟没有到达B。这个时候A误认为是发生了丢包情况,会重新传输这个数据包。这样不仅浪费了信道资源,还会使网络更加拥塞。  拥塞控制的出现,减少了网络拥堵,促使网络尽快回复正常。名次解释MSS:最大报文长度,这里指报文数据的大小ssthresh :慢启动

2021-05-23 18:21:39 172

原创 时间复杂度如何计算

前言  时间复杂度用于描述一个算法的运行时间消耗。刷题(leetcode等)也会有部分题要求写出一些进阶解法。一、简介1、时间频度T(n)  一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多少就可以了。一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。2、时间复杂度  时间频度T(n)中,n

2021-05-04 17:52:09 24958 2

原创 Java设计模式--命令模式

一、命令模式介绍1)什么是命令模式  命令(Command)模式的定义如下:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。2)特点降低了系统耦合度增加或删除命令非常方便3)缺点可能会导致某些系统有过多的具体命令类4)应用场景当系统需要将请求调用者与请求接收者解耦时,命令模式使得调用者和接收者不直接交互当系统需要随机请求命令或经常增加或删除命令时,命令模式比较方便实现这些功能

2020-09-21 22:21:14 118

原创 Java设计模式--策略模式

一、策略模式介绍1)什么是策略模式  策略模式是对算法的包装,把使用算法的责任和算法本身分隔开,委派给不同的对象管理。策略模式通常把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。2)特点多重条件语句(if…else)不易维护,而使用策略模式可以避免使用多重条件语句。提供了一系列的可供重用的算法族,恰当使用继承可以把算法族的公共代码转移到父类里面,从而避免重复的代码。可以提供相同行为的不同实现,客户可以根据不同时间或空间要求选择不同的。提供了对开闭原则的完美支持,可以在不修改

2020-09-06 23:08:56 163

原创 Java设计模式--责任链模式

一、责任链模式介绍1)什么是责任链模式  **责任链模式(Chain of Responsibility)**使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处理它。2)特点...

2020-08-29 17:42:49 135

原创 Java默认线程池及线程池参数

一、Executors默认创建的线程池  jdk中Executors提供了几种默认的线程池:FixedThreadPool创建一个固定线程数的线程池,核心线程数和最大线程数固定相等。keepAliveTime为0,意味着一旦有多余的空闲线程,就会被立即停止掉,不过因为最多只有nThreads个线程,且corePoolSize和maximunPoolSize值一致,所以这个值无法发挥作用。阻塞队列采用了LinkedBlockingQueue,它是一个无界队列,由于阻塞队列是一个无界队列,因此永

2020-07-19 23:02:55 4583

转载 SpringMVC过滤器与拦截器之间的区别

过滤器和拦截器的区别拦截器是基于java的反射机制的,而过滤器是基于函数回调。过滤器是servlet规范规定的,只能用于web程序中,而拦截器是在spring容器中,它不依赖servlet容器。过滤器可以拦截几乎所有的请求(包含对静态资源的请求),而拦截器只拦截action请求(不拦截静态资源请求)。拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。拦截器可以获取IOC容器中的各个bean,

2020-07-13 00:15:11 337

原创 Mysql索引失效场景总结

隐式转换这种是经常出现的场景,例如表t的字段 name(varchar类型),通过条件查询传入数字类型,虽然可以查出所要的结果,但是此时索引没有命中。反例: select * from t where name=123;正例: select * from t where name=‘123’;索引列的运算在...

2020-07-05 15:30:08 167

转载 IO模型

一、io模型种类  参考《Unix网络编程》一书,网络IO的模型有如下五种:同步模型(synchronous IO)阻塞IO(bloking IO)非阻塞IO(non-blocking IO)多路复用IO(multiplexing IO)信号驱动式IO(signal-driven IO)异步IO(asynchronous IO)二、io模型简述1、阻塞IO(bloking IO)  同步阻塞 IO 模型是最常用的一个模型,也是最简单的模型。在linux中,默认情况下所有的soc

2020-06-27 17:26:11 121

转载 Spring Bean的生命周期

Spring bean 的生命周期整体流程  从初始化bean到销毁,流程如下:  中文版本:bean实例生命周期过程如下:Bean容器找到配置文件中 Spring Bean 的定义。Bean容器利用Java Reflection API创建一个Bean的实例。如果涉及到一些属性值 利用set方法设置一些属性值。如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。如果Bean实现了BeanClassLoaderAware接口,调用s

2020-06-27 00:55:02 115

原创 Mysql排名(并列排名与不并列排名)

一、MySQL中没有排名函数  sql中有排名函数rank()用来排序,但MySQL没有可排名函数。所以,在mysql中需要自己实现排名。二、实现方法  假设有张表 t1(id,score), 根据t1表中的score进行分数从大到小进行排名。  此时能够很容易想到根据score从大到小排序,我们可以写个 order by score desc 倒序处理。至于排名的序号,就有点难度了。通过引入一个临时变量(mysql中 @变量名称的用法),我们可以很容易根据数据记录的顺序得出排名。三、非并列排名

2020-06-21 18:11:34 2901 1

原创 进程间的通信方式

一、进程通信的目的数据传输一个进程需要将其数据发送给另一进程,发送的数据量在一个字节到几M字节之间。共享数据多个进程操作共享数据事件通知一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。资源共享多个进程之间共享同样的资源。为了作到这一点,需要内核提供锁和同步机制。进程控制有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。二、linux使用的进程间通

2020-06-03 23:46:56 157

原创 Centos安装openoffice

一、安装包下载  安装包选择地址:http://www.openoffice.org/zh-cn/download/  本次选择适合centos7的4.17中文简体版下载。网络原因,windows下直接下载老是断开,可以直接在centos上使用wget无限重试下载。命令如下;wget -c -t0 https://sourceforge.net/projects/openofficeorg....

2020-04-12 16:02:56 236

原创 Redis知识(二)----缓存穿透、缓存击穿与缓存雪崩

一、缓存穿透   缓存穿透:说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库。  解决方法:  1、接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;  2、布隆过滤器:布隆过滤器是一个非常神奇的数据结构,通过它我们可以非...

2020-03-28 16:58:41 107

原创 Mysql一个查询语句的执行流程

一、MySQL逻辑结构  MySQL 可以分为 Server 层和存储引擎层两部分。二、sql的执行流程1、连接器  在数据库层执行SQL语句时,应用程序会连接到相应的数据库服务器,把SQL语句发送给服务器处理。2、查询缓存  服务器在解析一个查询语句之前,如果查询缓存是打开的(MySQL默认打开,可以使have_query_cache查看),在接收到查询请求后,并不会直接去数据库查...

2020-03-14 17:10:51 164

原创 Redis知识(一)----数据类型与应用场景

一、Redis的数据类型  Redis主要有5种数据类型:String,List,Hash,Set,Zset。数据类型可以存储的值 操作应用场景String字符串、整数或者浮点数对整个字符串或者字符串的其中一部分执行操作;对整数和浮点数执行自增或者自减操作做简单的键值对缓存List列表从两端压入或者弹出元素对单个或者多个元素进行修剪,只保留一个范围内的元素存储一些列表型的数据结构,类似...

2020-02-28 00:01:02 168

转载 Base64加密和解密JDK8

  在 Java8中 Base64编码已经成为Java类库的标准,且内置了Base64编码的编码器和解码器。一、什么是Base64? – 来自百度百科  Base64是网络上最常见的用于传输 8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。1、什么是“可打印字符”呢?为什么要用它来传输 8Bit字节码呢?  Base64一般用于在 HTTP协...

2020-02-22 03:06:01 1092

原创 Docker安装fastdfs

一、安装环境  最近想升级fastdfs的版本,主要是因为旧版本版本在配置nginx module的时候提示需要升级版本才能使用。然而升级在升级之前,又需要升级libfastcommon,过程繁琐,libfastcommon跟fdfs的版本不匹配导致升级失败。  新版本的fdfs支持了docker部署,所以想着使用docker部署的方式,隔离主机环境。  环境配置如下:宿主机器cento...

2020-01-26 14:44:57 198

原创 Springboot操作FastDFS文件存储

一、制作FastDFS客户端jar包  fdfs的作者happyfish100的GitHub上提供了java操作fdfs的客户端项目fastdfs-client-java。  下载到本地后,按自己JDK版本修改编译版本进行编译。  使用maven进行构建,本次构建客户端的版本为mvn clean install  构建成功后,在本地maven仓库中出现编译完后的jar包,也就是后面...

2020-01-17 00:08:21 693

原创 Docker安装mysql

一、安装环境宿主机器centos7docker版本18.03.0-cemysql版本5.7二、安装步骤1、查找mysql镜像  使用docker search命令查询镜像源中mysql相关镜像。命令:docker search mysql  根据宿主环境,这里选择安装centos/mysql-57-centos7版本的mysql,拉取此版本镜像,命令: docker pul...

2020-01-09 00:46:12 76

原创 Docker修改镜像源地址

一、国内常用镜像源Docker 官方中国区:https://registry.docker-cn.com网易镜像源:http://hub-mirror.c.163.comUSTC:https://docker.mirrors.ustc.edu.cn阿里云注册:https://cr.console.aliyun.com/二、修改镜像源方法1、–registry-mirror 参数 ...

2020-01-01 16:40:43 2381

转载 Docker配置文件daemon.json解析

  Docker Engine V1.12 之后版本,用户可以自行创建 daemon.json 文件对 Docker Engine 进行配置和调整。要点如下:该文件作为 Docker Engine 的配置管理文件, 里面几乎涵盖了所有 docker 命令行启动可以配置的参数。不管是在哪个平台以何种方式启动, Docker 默认都会来这里读取配置。使用户可以统一管理不同系统下的 docker ...

2020-01-01 00:44:09 2577

原创 Springboot启动时加载数据到内存中

前言  一般来说,springboot工程环境配置放在properties文件中,启动的时候将工程中的properties/yaml文件的配置项加载到内存中。但这种方式改配置项的时候,需要重新编译部署,考虑到这种因素,今天介绍将配置项存到数据库表中,在工程启动时把配置项加载到内存中。  springboot提供了两个接口:**CommandLineRunner和ApplicationRunne...

2019-12-21 19:12:57 4953

java swing计算器

java swing 实现的简单计算器,用多种小功能,支持记录计算结果,除计算外,科学计算器只是雏形

2015-07-01

jstl.jar包

jstl.jar

2014-07-27

jspsmartupload.jar

jspsmartupload.jar

2014-07-27

简单计算器

简单计算器,有标准版、科学版,科学版未完成,还要写。

2013-11-09

空空如也

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

TA关注的人

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