自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(144)
  • 资源 (27)
  • 收藏
  • 关注

原创 使用redis实现延时消息发送功能

redis本身也有发布订阅的模式,但是如果想要实现例如rocketmq或者rabbitmq的延时任务功能要怎么做呢,目前比较流行的做法有两种,一种是使用sortedset数据模型,把超时时间设置为score,然后系统启动一个定时任务定时去检查score超时的key然后把key取出来,再进行下一阶段的任务;第二种方法就是利用redis本身的通知机制,当key到期的时候会进行通知,通过捕获通知的信息来实现延时通知的效果。本文使用第二种方式,并且通过注解和反射使得整体功能更具有扩展性和适用性。

2023-11-03 16:25:58 996

原创 手写可持久化的纯JDK缓存

近期笔者搞了一个极简springboot项目,不依赖mysql,redis,数据库用H2,Cache用Caffeine,其他缓存就自己写了一个可持久化的工具。开源的代码如下: https://github.com/EricLoveMia/simpleBoot 本篇文章主要讲述可持久化的缓存工具。

2019-08-14 11:27:40 2130

原创 整理收集的一些常用java工具类(http、加解密、编号生成、二维码、字符串、图片、JDBC...)

小弟最近开了一个新的项目,主要是总结各个项目中用到的工具类,目前放到github中,内容持续补充,各位大神可以多题建议,争取做到全网最全的工具类项目 主要包括:订单编号生成工具类、http及https请求工具类、格式化数字工具类、加解密工具类、布隆过滤器、redis工具类,截取部分工具类如下: IPUtilsimport or...

2019-08-01 15:42:21 2347 1

原创 RocketMQ常见面试题一

rocketmq常见面试题

2025-05-01 17:19:34 77

原创 CentOS7 安装Redis

有两种安装方法,一种是EPEL安装,一种是手动编译安装。手动编译安装坑比较多,建议大家使用EPEL安装。通过以上步骤,Redis 即可在 CentOS 7 上正常运行。默认的配置文件路径在 /etc/redis.conf。3、启动Redis服务。1、安装EPEL仓库。

2025-04-03 13:21:11 173

原创 RocketMq源码解析十三:消息消费

PullMessageService负责对消息队列进行消息拉取,从远端服务器拉取消息后将消息存储ProcessQueue消息队列处理队列中然后调用ConsumeMessageservice#submitconsumeRequest方法进行消息消费,使用线程池来消费消息,确保了消息拉取与消息消费的解耦。ConsumeMessageService支持顺序消息和并发消息,核心类图如下:ConsumeMessageOrderlyService:顺序消费服务。

2024-07-24 10:17:51 123

原创 RocketMq源码解析十二:消息消费负载

RocketMQ消息队列重新分配是由RebalancService线程来实现,一个MQClientinstance持有一个RebalanceService的实现,并随着MQClientInstance的启动而启动。注意:消息队列的分配遵循一个消费者可以分配到多个队列,但同一个消息队列只会分配给一个消费者,如果消费者数量大于消息队列数量,则有些消费者无法消费消息。这里我们可以看到,实际上是针对每个topic进行了负载均衡 ,核心方法为this.rebalanceByTopic(topic, isOrder)

2024-07-18 11:44:26 178

原创 RocketMq源码解析十一:消息长轮询机制

RocketMO未真正实现消息推模式,而是消费者主动向消息服务器拉取消息,RocketMQ推模式是循环向消息服务端发起消息拉取请求,如果消息消费者向RocketMQ拉取消息时,消息未到达消费队列时,如果不启用长轮询机制,则会在服务端等待shortPolingTimeMils时间后(挂起)再去判断消息是否已经到达指定消息队列,如果消息仍未到达则提示拉取消息客户端PULL-NOT-FOUND(消息不存在);

2024-07-08 10:17:26 316

原创 RocketMq源码解析十:消息消费

消息消费以组的模式开展,一个消费组内可以包含多个消费者,每一个消费者组可订阅多个主题,消费组之间有集群模式和广播模式两种消费模式。集群模式,主题下的同一条消息只允许被其中一个消费者消费。广播模式,主题下的同一条消息,将被集群内的所有消费者消费一次。消息服务器与消费者之间的消息传递也有两种模式:推模式、拉模式。所谓的拉模式,是消费端主动拉起拉消息请求,而推模式是消息达到消息服务器后,推送给消息消费者。。

2024-07-01 14:17:36 199

原创 RocketMq源码解析九:刷盘机制及过期文件删除

刷盘策略在不同时间进行刷写磁盘。RocketMQ的存储是基于JDK NIO的内存映射机制(MappedByteBuffer)的,消息存储首先将消息追加到内存,再根据配置的刷写磁盘消息追加到内存后,立即将数据刷写到文件系统中。代码的调用链如下:我们一起来看下同步刷盘和异步刷盘的逻辑。

2024-06-28 16:08:06 189

原创 RocketMq源码解析八:实时更新消息消费队列与索引文件

消息消费队文件、消息属性索引文件都是基于CommitLog文件构建的,当消息生产者提交的消息存储在CommitLog文件中,ConsumerQueue、indexFile需要及时更新,否则消息无法及时被消费,根据消息属性查找消息也会出现较大延迟。RocketMQ通过开启一个线程ReputMessageservice来准实时转发Commitlog文件更新事件,相应的任务处理器根据转发的消息及时更新ConsumerQueue、indexFile文件。

2024-06-19 09:50:27 144

原创 RocketMq源码解析六:消息存储

我们针对源码来看下消息存储的流程,这里主要说明内存写入的过程,刷盘的机制在后面再讲。

2024-06-10 22:01:53 188

原创 RocketMq源码解析七:消息存储文件映射

RocketMQ通过使用内存映射文件提高!0访问性能,无论是CommitLog、ConsumerQueue还是IndexFile,单个文件都被设计为固定长度,如果一个文件写满以后再创建一个新文件,文件名就为该文件第一条消息对应的全局物理偏移量。我们看下一个commitLog文件大小是1GB一个comsumerQueue文件大小是5.72MB一个indexFile文件大小是 400MB。

2024-06-05 17:25:17 121

原创 RocketMq源码解析五:生产者Producer发送消息

消息发送的过程可以分成四步,分别是验证消息、查找路由、选择队列、发送消息验证消息:检查msg、检查topic、检查body;查找路由:先查本地缓存,如果为空从namesrv中获取并更新;选择队列:使用index+1再取模的方式进行负载均衡选择队列;发送消息:最终通过NettyRemotingClient发送请求。

2024-06-05 17:24:38 250

原创 RocketMq源码解析四:生产者Producer启动

生产者服务核心接口和类的关系如下图所示:MQProducer是生产者解耦,这里找几个有代表性的方法// 同步发送消息// 同步超时发送消息 如果超过了timeout的时间就抛出异常//异步发送消息// 异步超时发送消息 如果超过了timeout的时间就抛出异常// 指定消息队列同步发送消息。

2024-05-27 09:50:39 191

原创 RocketMq源码解析三:路由管理

Nameserver的主要作用是为消息的生产者和消息消费者提供关于主题Topic的路由信息,那么Nameserver需要存储路由的基础信息,还要管理Broker节点,包括路由注册、路由删除等。

2024-05-27 09:48:38 269

原创 RocketMq源码解析二:NameService篇(启动流程)

首先来看一章总体的技术架构图消息中间件的设计思路一般是基于主题订阅发布的机制,消息生产者(Producer)发送某一个主题到消息服务器,消息服务器负责将消息持久化存储,消息消费者(Consumer)订阅该兴趣的主题,消息服务器根据订阅信息(路由信息)将消息推送到消费者(Push模式)或者消费者主动向消息服务器拉去(Pu模式),从而实现消息生产者与消息消费者解耦。为了避免消息服务器的单点故障导致的整个系统瘫痪,通常会部署多台消息服务器共同承担消息的存储。那消息生产者如何知道消息要发送到哪台消息服务器呢?

2024-05-21 15:49:33 418

原创 RocketMq源码解析一:源码结构介绍

从本章开始我们对Rocketmq的源码进行解析。使用版本是4.9.8。

2024-05-21 15:48:42 368

原创 面试集中营—Linux篇

语法:more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]more命令中内置了若干快捷键,常用的有H(获得帮助信息),Enter(向下翻滚一行),空格(向下滚动一屏),ps查看进程信息并通过less分页显示: ps -ef |less。cat是由第一行到最后一行连续显示在屏幕上,一次显示整个文件。ps -aux | grep * : 过滤查询某些进程;打包:tar -zxvf 文件名。less 文件名 : #cat 文件名 : #

2024-05-14 15:32:50 923

原创 面试集中营—rocketmq架构篇

Apache RocketMQ 是一款低延迟、高并发、高可用、高可靠的分布式消息中间件。消息队列 RocketMQ 可为分布式应用系统提供异步解耦和削峰填谷的能力,同时也具备互联网应用所需的海量消息堆积、高吞吐、可靠重试等特性。Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。

2024-05-14 14:50:42 1290

原创 面试集中营—Seata分布式事务

在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的, 因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。数据库事务的四大特性:ACID:原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。:一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如:张三向李四转100 元,转账前和转账后的数据是正确状态这叫一致性,如果出现张三转出100。

2024-05-12 22:29:38 978

原创 面试集中营—JVM篇

线程独占:栈,本地方法栈,程序计数器;线程共享:堆,方法区虚拟机栈:线程私有的,线程执行方法是会创建一个栈阵,用来存储局部变量表,操作栈,动态链接,方法出口等信息.调用方法时执行入栈,方法返回式执行出栈;本地方法栈:与虚拟机栈类似,也是用来保存执行方法的信息.执行Java方法是使用栈,执行Native方法时使用本地方法栈;程序计数器:保存着当前线程执行的字节码位置,每个线程工作时都有独立的计数器,只为执行Java方法服务,执行Native方法时,程序计数器为空;

2024-05-07 16:10:04 855

原创 面试集中营—Redis面试题

Redis是基于非阻塞的IO复用模型,内部使用文件事件处理器(file event handler),这个文件事件处理器是单线程的,所以Redis才叫做单线程的模型,它采用IO多路复用机制同时监听多个socket,根据socket上的事件来选择对应的事件处理器进行处理。文件事件处理器的结构包括四个部分1、多个socket;2、IO多路复用程序3、文件事件分排器4、事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)多个 socket。

2024-05-07 14:19:59 1265

原创 面试集中营—Spring篇

Spring框架的好处Spring框架的好处1、轻量:spring是轻量的,基本的版本大约2MB;2、IOC:控制反转,Spring的IOC机制使得对象之间的依赖不再需要我们自己来控制了,而是由容易来控制,一个字:爽;3、AOP:切面编程,Spring提供的AOP技术可以把应用逻辑和系统服务分来,编码更灵活,更方便;4、MVC框架:如果使用过Struts2的同学,使用springmvc就会觉得非常的舒适,spring提供的mvc框架是一个非常优秀的Web框架;

2024-05-06 16:34:12 869

原创 面试集中营—Redis架构篇

1、redis6.0版本之前的单线程,是指网络请求I/O与数据的读写是由一个线程完成的;2、redis6.0版本升级成了多线程,指的是在网络请求I/O阶段应用的多线程技术;而键值对的读写还是由单线程完成的。所以redis多线程的模型依然是线程安全的。

2024-05-06 14:11:01 1236 2

原创 面试集中营—ElasticSearch架构篇

1、支持多种数据类型。它可以处理非结构化、数值和地理信息等多种类型的数据;2、简单的RESTful API。ES提供了一个简单易用的RESTful API,使得它可以从任何编程语言中调用,降低了学习的曲线。3、近实时搜索。ES每隔1秒将数据存储至系统缓存中,使用倒排索引提高检索效率,使得搜索数据变得快速且高效。4、支持相关性搜索。它可以根据条件对搜索结果进行打分,提供了基于文档的全文检索能力。5、天然分布式存储。ES是分布式的,使用分片支持处理PB级的数据量,易于扩展,可部署在数百台服务器的集群中。

2024-04-26 11:21:23 1420 5

原创 面试集中营—mysql架构相关

了解一个中间件一定要从架构开始,上来就背八股文那就没意思了。从下图可以看到Mysql的包括网络连接、服务、数据存储和系统文件(日志)四大部分。数据连接:客户端连接器(Client Connectors):提供与MySQL服务器建立的支持;服务:又包括了sql接口,sql解析器,查询优化器,缓存等模块,主要是把sql进行解析和处理;数据存储:主要是存储引擎,常用的就是MyISAM和InnoDB;

2024-04-23 10:34:14 1083

原创 面试集中营—场景面试题A

第一步我们要首先确定是什么导致的消息积压,基本上三个原因线上消息积压第一步先看日志,是否在消费端出现了系统异常,系统异常有可能是磁盘满了,挂载盘故障了,网络不稳定或者有黑客入侵植入了其他程序侵占了系统资源等等。系统异常排除,就通过日志查看是否存在业务异常,是否有大量的报错信息,如果存在那么应该是代码的问题,此时就要快速修复问题,然后上线。如果不是代码的问题,那么就要考虑当前消费线程的执行时间是否过长,每次消费的时间太长也会造成消息的积压,通过各种工具可以检测到消费的时长,如果很长那么也需要优化代码。

2024-04-23 10:33:47 1054

原创 面试集中营—AQS哪些事儿之ReentrantLock

AQS—AbstractQueuedSynchronizer是JDK工具包中的一个抽象类。在这个抽象类中,有几个属性和一个双向队列(FIFO)。是JUC并发包下的一个基类,那么我们熟知的ReentrantLock、CountDownLatch、信号量等等都是基于这个基类来实现的。

2024-04-22 15:08:23 1102

原创 面试集中营—AQS哪些事儿之CountDownLatch

AQS既可以用来实现互斥锁也可以用来实现共享锁,互斥锁确实可以用boolean来定义state的类型,但是共享锁需要多个线程持有一个锁资源,那么boolean就不适合了,state定义成int类型可以表示线程占用的数量。

2024-04-22 15:07:17 632

原创 面试题集中营—GC日志简析及频繁GC的调优

有两种方式查看GC日志,一种是动态命令行查看第二种就是在JVM参数中增加打印的参数,如下:-XX:+PrintGCDetails -XX:+PrintGCTimeStamps 表示打印每次GC的日志以及GC发生的时间-Xloggc:gc.log 可以把gc日志写入文件中。

2024-04-18 11:25:49 1262

原创 面试题集中营—分布式共识算法

简单来说共识算法就是投票,主节点或者说处理客户端请求的节点由集群中所有的服务器投票得出(更准确的说有投票权的服务器投票得出)。这样就有一个保证,如果集群中有半数以上的服务器是可用的,那么我的服务就可用。我们又会将节点分成数据节点和管理节点,由管理节点来统一管理数据节点。现在服务节点高可用了,但是管理节点呢,又出现单点问题了,怎么办,好办,管理节点也做高可用,可是难道要给管理节点再增加管理管理节点吗?为了服务的高可用性,我们一般都会多引入几个副节点当备份,当服务节点挂了,就把其中一个副节点升级为主节点。

2024-04-18 09:35:15 711

原创 从零开始手写mmo游戏从框架到爆炸(二十七)— 英雄属性展示及穿戴装备-1

本章我们把命令行客户端与后台串起来,并完成穿戴装备的功能。

2024-02-28 13:59:01 791

原创 从零开始手写mmo游戏从框架到爆炸(二十六)— 装备、金币、经验的掉落与获取二

上一章我们完成了装备金币和经验掉落的计算,这一章我们来完成装备、金币与经验的获取。这里我们先改造英雄封装 - HeroWrapper。改造BattleEngine中获取经验、金币和物品的方法。分支:step-13。

2024-02-28 10:41:27 336

原创 从零开始手写mmo游戏从框架到爆炸(二十五)— 装备、金币、经验的掉落与获取一

装备已经可以通过模板生成出来了,但是正式使用过程中,应该是根据野怪的等级、品质、还有地图等级等等来随机获得装备。掉落装备的同时也应该同时掉落金币。金币的作用就不用多说了。

2024-02-27 09:19:24 652

原创 从零开始手写mmo游戏从框架到爆炸(二十四)— 装备系统二

大概解释一下就是根据野怪的等级找到可获得的装备模板列表,再根据品质去获得属性的浮动,品质越高浮动越小,这样品质高的武器将有机会获得更高的属性加成。分支:step-12。

2024-02-27 09:19:02 1056

原创 从零开始手写mmo游戏从框架到爆炸(二十三)— 装备系统一

下一步,就是要考虑经验、金币、和装备掉落的问题。经验金币都好说,装备系统是目前需要考虑的问题。为了简化我们把装备分成武器、胸甲两个部位,后期可以慢慢扩展。此时我们还是需要装备模板。这个功能和之前的野怪模板、地图模板差不多。

2024-02-26 15:32:15 1068

原创 从零开始手写mmo游戏从框架到爆炸(二十二)— 战斗系统三

其中大部分上一章已经基本讲过了,大家对着gitee上的分支源码来看即可,我们重点关注地图已经搜寻野怪的代码。地图中存储了野怪的等级已经出现的概率。)中,客户端已经可以创建英雄并且进入游戏主界面了,下一步,我们需要选择地图,并且和地图中的野怪来一张遭遇战。首先我们把上一章中的test路径下的demo移动到正式路径下并进行修改。我们把战斗系统demo应用到实际的项目中来。这个接口就一个方法,寻找野怪。选择地图:MenuHandler。客户端的相关handler。地图:TownMap。分支:step-12。

2024-02-26 15:31:41 633

原创 从零开始手写mmo游戏从框架到爆炸(二十一)— 战斗系统二

上一章我们说过,比如速度是1000的时候是每隔2秒钟攻击一次,但是服务器不能真的等两秒再计算攻击的结果,那么这个战斗的时长将会超过几分钟,用户也可能等这么久。首先Action接口中增加一个interval()的方法,用于获取时间间隔,这个时间间隔是预计攻击时间距离战斗开始时间的间隔,例如计算出来的攻击间隔是500,那么每次计算的结果就是500,1000,1500,2000...以此类推。第一个就是速度和出手间隔的换算,我们使用一个比较简单的公式,就是。那么根据这个方法我们来尝试改造战斗引擎。

2024-02-22 09:26:02 1254

原创 从零开始手写mmo游戏从框架到爆炸(二十)— 战斗系统一

我们现在设计并尝试开发战斗系统。战斗系统我们先设定几个规则 1、多人对多人:英雄可以携带宝宝,面对的野怪也可以是成群的,故要设计成多人对多人的战斗引擎; 2、速度快的先出手:这点应该没有异议,根据速度来判定出手间隔,但是这里要有一个数据转换的问题,比如并不是速度100的就比速度50的出手速度快一倍,应该有一个计算公式来根据英雄的速度属性计算出手间隔。

2024-02-22 09:25:22 986

IBM-ECM解决方案介绍

IBM-ECM解决方案介绍IBM-ECM解决方案介绍IBM-ECM解决方案介绍

2016-12-06

IBM-知识管理白皮书

IBM_知识管理白皮书

2016-04-07

zipkin-server-3.3.0-exec.jar

zipkin-server-3.3.0-exec.jar

2024-05-15

zipkin-server-2.24.4-exec.jar

zipkin-server-2.24.4-exec.jar

2024-05-15

PPT时间轴模板大全,PPT时间轴

PPT时间轴模板大全

2018-08-31

2021年中国APaaS应用及选型研究报告

2021年中国APaaS应用及选型研究报告

2022-12-13

Http工具类,一个http的java工具类

Http工具类

2019-02-25

新员工培训材料-天宫paas分布式服务架构演进及k8s基础培训.pdf

新员工培训材料-天宫paas分布式服务架构演进及k8s基础培训

2022-12-13

PPT模板素材-时间轴汇总大全

PPT模板素材-时间轴汇总大全

2018-08-31

sshshell.zip

sshshell ssh shell 服务器 远程连接 FTP for mac ssh shell 服务器 远程连接

2018-01-02

rubygems-2.6.13

rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13rubygems-2.6.13

2017-11-03

重构-改善既有代码的设计》电子书高清版+源码

重构-改善既有代码的设计》电子书高清版+源码 重构-改善既有代码的设计》电子书高清版+源码 重构-改善既有代码的设计》电子书高清版+源码

2018-01-12

PI-API Installation Instructions

PI API 安装手册

2016-07-20

FileZilla_3.29.0_macosx-x86.dmg

FileZilla_3.29.0_macosx-x86.dmg SSH 远程连接服务器工具

2018-01-02

cudnn-9.0-linux-x64-v7.2.1.38.tgz

cudnn-9.0-linux-x64

2018-08-31

C语言写的员工管理系统

员工管理系统,这是一个员工管理系统,这是一个员工管理系统这是一个员工管理系统这是一个员工管理系统

2009-11-27

简单计算器

c语言编的计算器,大家有需要可以拿去用

2008-06-24

Java Web 投票系统

Java Web项目开发案例精粹02投票系统源码Java Web项目开发案例精粹02投票系统源码Java Web项目开发案例精粹02投票系统源码Java Web项目开发案例精粹02投票系统源码Java Web项目开发案例精粹02投票系统源码

2016-12-06

PPT素材库时间轴

PPT素材库时间轴

2018-08-31

genymotion-2.10.0.exe

genymotion-2.10.0.exe

2017-08-16

SharePoint2007安装及使用教程(零基础)

SharePoint2007安装及使用教程(零基础)

2011-07-29

HTML+CSS+JavaScript帮助文档

HTML+CSS+JavaScript帮助文档

2015-07-17

Ext 3.0 中文帮助文档

Ext 3.0 中文帮助文档

2016-12-06

JavaScript手册

JavaScript手册

2015-07-17

最短路径算法

计算各点到原点的最短距离

2008-06-25

JAVA编的聊天器

自己搞得大家随便看看

2008-06-23

C++编的计算器

计算器而已,没有什么

2008-06-24

火车订票系统

添加,预订,更新,保存等

2008-06-24

C编的各种排序大全

插入排序,希尔排序,冒泡排序,快速排序,简单排序,堆排序

2008-06-24

简单计算器

c语言编得计算器,有需要的可以拿去用

2008-06-24

C语言贪吃蛇

贪吃蛇游戏啊贪吃蛇用C的

2008-06-25

空空如也

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

TA关注的人

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