自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

原创 nsq源码之nsqlookupd执行流程

在看nsqlookupd的时候一开始发现svn包里面的东西,不知道这是什么,就再网上查了一下 nsqd为了优雅的关闭退出,使用了svc包来管理程序的运行。先不用管svc,svc.run之后会执行Init和Start函数。 所以我们直接从它的start方法开始看 func (p *program...

2019-03-27 11:11:01

阅读数 133

评论数 0

原创 nsq之nsqd执行流程(包括订阅消息,发布消息等内容)

nsqd是就是我们平时所说的broker,接下来我们就来看一下它是怎么设计的,下面的Main方法就是nsqd启动的入口 func (n *NSQD) Main() error { ctx := &context{n} exitCh := make(chan error) var o...

2019-03-26 20:43:37

阅读数 616

评论数 0

原创 nsq源码之生产者发布消息

研究完了消费者,那么我们就要看看生产者是如何工作的 // Producer 生产者 func Producer() { producer, err := nsq.NewProducer("127.0.0.1:4150", nsq.NewConfig()) if err !=...

2019-03-26 15:27:25

阅读数 159

评论数 0

原创 nsq源码之消费端消费流程

这篇博客我们先来看一下消费者消费的流程,下面就是使用一个消费者的简单demo // ConsumerHandler 消费者处理者 type ConsumerHandler struct{} // HandleMessage 处理消息 func (*ConsumerHandler) HandleM...

2019-03-26 14:36:25

阅读数 819

评论数 0

原创 nsq阅读概述

NSQ是Go语言编写的,开源的分布式消息队列中间件,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,是一个成熟的、已在大规模生成环境下应用的产品。 最近又重新仔细学了一下Go语言...

2019-03-26 13:06:30

阅读数 58

评论数 0

原创 Quartz源码剖析

前些天看了Elastic-Job的实现原理,它是基于Quartz实现的,Quartz提供了定时任务的功能,现在我们就来看看Quartz底册是怎么实现的。初始化部分我们就不关注了,直接进入核心部分: scheduler.start(); 启动定时器 public void start() thro...

2019-03-19 20:16:49

阅读数 159

评论数 0

原创 Dubbo的SPI机制

在阅读dubbo的源码的时候,下面这行代码或者相似的代码我们会经常看到 ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class) .getExtension(url.getProtocol()) 这就是dubbo的SPI机制,这种...

2019-03-16 17:36:46

阅读数 204

评论数 0

原创 Elastic-Job之任务分片及失效分片集合转移

当定时任务需要执行的时候,在AbstractElasticJobExecutor的execute方法中会通过jobFacade的getShardingContexts()方法来获取当前服务器的分片信息 public ShardingContexts getShardingContexts() { ...

2019-03-16 16:27:26

阅读数 327

评论数 0

原创 Elastic-Job之几个主要的监听器

这篇博客我们来简单看几个主要的监听器的实现 ElectionListenerManager 主节点选举监听管理器 public void start() { addDataListener(new LeaderElectionJobListener()); a...

2019-03-16 12:24:23

阅读数 184

评论数 0

原创 Elastic-Job之注册作业启动信息

在JobScheduler实例化结束后的init方法中会调用schedulerFacade的registerStartUpInfo方法完成注册作业启动信息的工作,解析来我们就来看一下它工作的具体流程 public void registerStartUpInfo(final boolean ena...

2019-03-16 12:06:47

阅读数 121

评论数 0

原创 Elastic-Job之JobScheduleController执行任务流程

在JobScheduler的init方法中我们看到,JobScheduleController被创建并且由它启动了定时任务,接下来我们就来看一下它是如何工作的。 JobScheduleController jobScheduleController = new JobScheduleControl...

2019-03-16 11:38:21

阅读数 206

评论数 0

原创 Elastic-Job启动流程

Elastic-Job是基于quartz的一款分布式任务调度器,利用zookeeper做分布式协调,保存配置信息,分片信息,服务器实例的信息,接下来几篇博客将从源码探究一下Elastic-Job是如何实现的。 这篇文章先从启动流程大体上看一下,之后会仔细分析启动过程中的具体工作。 &lt...

2019-03-16 11:02:42

阅读数 388

评论数 0

原创 SpringMVC之完整的处理流程

在这篇文章中,将要完整的跟踪一下SpringMVC的执行流程 我们会在浏览器里输入 http://localhost:8060/articles/67/comment?comment=sssss2ssssk1k1 最终的效果是 下面就开始走进源码: protected void service...

2018-11-24 20:26:47

阅读数 1068

评论数 0

原创 SpringMVC之原理总结

SpringMVC的本质是一个Servlet,Servlet接口一共定义了5个方法,其中init方法和destroy用于初始化和销毁Servlet,整个生命周期只会被调用一次,service方法实际处理请求,getServletConfig方法返回ServletConfig,可以获取到配置Serv...

2018-11-24 14:33:21

阅读数 45

评论数 0

原创 SpringMVC之ModelFactory

ModelFactory是用来维护Model的,具体包含两个功能 1、初始化Model 2、处理器执行后将Model中相应的参数更新到SessionAttributes中 public void initModel(NativeWebRequest request, ModelAndViewCon...

2018-11-24 13:38:06

阅读数 125

评论数 0

原创 SpringMVC之RequestMappingHandlerAdapter

下面是HandlerAdapter的接口定义: public interface HandlerAdapter { /** * Given a handler instance, return whether or not this {@code HandlerAdapter} * c...

2018-11-24 12:58:32

阅读数 226

评论数 0

原创 SpringMVC之HandlerMapping

AbstractHandlerMapping是HandlerMapping的抽象实现,所有HandlerMapping都继承自AbstractHandlerMapping。AbstractHandlerMapping采用模板模式设计了HandlerMapping实现的整体接口,它继承了WebApp...

2018-11-23 12:53:16

阅读数 44

评论数 0

原创 SpringMVC之组件概览

在这里会对各个组件进行宏观的介绍,在之后会详细介绍每个组件 HandlerMapping 它会根据request找到对应的处理器 protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Except...

2018-11-22 22:04:47

阅读数 43

评论数 0

原创 SpringMVC之处理请求

接下来将会分析SpringMVC是怎么处理请求的,首先会分析HttpServletBean、FrameServlet和DispatcherServlet,然后再看一下核心方法doDispatch HttpServletBean主要参与创建工作,没有涉及请求的处理 FrameworkServlet:...

2018-11-22 17:51:00

阅读数 75

评论数 0

原创 SpringMVC创建过程

SpringMVC核心就是一个DispatcherServlet,所有请求的处理都是由它来做的,下面我们就来看一下它的创建过程: Servlet创建时可以直接调用HttpServletBean中的无参数的init方法 public final void init() throws ServletE...

2018-11-22 16:45:07

阅读数 88

评论数 0

原创 常见HTTP状态码

100, client应该继续发送请求,即继续。 101, server通知client修改协议,也就说,client需要采用新的协议版本去访问 server。 200, 请求已成功。 200 ~ 207 300 Multiple Choices 如果请求一个指向多个资源的URL时,会返回这个状态...

2018-11-05 18:55:24

阅读数 44

评论数 0

原创 mysql优化的几点建议

1、硬件配置优化 (1)CPU选择:多核的CPU,主频高的CPU (2)内存:更大的内存 (3)磁盘选择:更快的转速、RAID、阵列卡 (4)网络环境 2、mysql设计优化 (1)存储引擎的选择 ①Myisam:数据库并发不大,读多写少,而且都能很好的用到索引,sql语句比较简单 ②Innodb...

2018-11-05 18:20:20

阅读数 55

评论数 0

原创 CAP为什么不能同时满足三个特性

在分布式系统中一致性、可用性、分区容错性不可能三个同时满足,先来解释以下这三个原则的意思: 一致性:在分布式系统中的任意一个节点都会查询到相同的信息 可用性:服务一直可用,而且是正常响应时间,好的可用性主要是指系统能够很好的为用户服务,不出现用户操作失败或者访问超时等用户体验不好的情况。 分区容错...

2018-11-05 17:20:21

阅读数 430

评论数 0

原创 Redis值notify.c阅读

keyspaceEventsStringToFlags:对传入的字符串参数进行分析, 给出相应的 flags 值 int keyspaceEventsStringToFlags(char *classes) { char *p = classes; int c, flags = 0...

2018-11-05 14:06:09

阅读数 85

评论数 0

原创 Redis之发布订阅

redis的发布与订阅功能有PUBLISH、SUBSCRIBE、PSUBSRIBE等命令组成。 通过执行SUBSCRIBE命令,客户端可以订阅一个或多个频道,从而成为这些频道的订阅者,每当有其他客户端向被订阅的频道发送消息时,频道的所有订阅者都会收到这条消息。 通过执行PSUBSCRIBE命令订...

2018-11-05 11:42:55

阅读数 36

评论数 0

原创 Redis之集群

redis集群是redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。 节点 一个redis集群通常由多个节点组成,在刚开始的时候,每个节点都是相互独立的,他们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包...

2018-11-05 11:11:54

阅读数 30

评论数 0

原创 Redis之Sentinel

Sentinel是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器...

2018-11-04 20:00:52

阅读数 39

评论数 0

原创 Redis之复制

在Redis中,用户可以通过执行SLAVEOF命令或者设置slaveof选项,让一个服务器去复制另一个服务器,我们称呼被复制的服务器为主服务器,而对主服务器进行复制的服务器则被称为从服务器。 旧版复制功能的实现 redis的复制功能分为同步和命令传播两个操作: 1、同步操作用于将从服务器的数据库状...

2018-11-04 19:11:28

阅读数 65

评论数 0

原创 Redis之数据库实现源码阅读

lookupKey:查找指定的键,如果存在返回对应的值 robj *lookupKey(redisDb *db, robj *key) { // 查找键空间 dictEntry *de = dictFind(db->dict,key->ptr); ...

2018-11-04 15:03:30

阅读数 111

评论数 0

原创 Redis值集合对象源码阅读

setTypeCreate:返回一个集合对象 robj *setTypeCreate(robj *value) { if (isObjectRepresentableAsLongLong(value,NULL) == REDIS_OK) return createInts...

2018-11-04 14:16:14

阅读数 37

评论数 0

原创 Redis之列表对象源码阅读

listTypeTryConversion:尝试将列表对象转换成linkedlist编码 void listTypeTryConversion(robj *subject, robj *value) { // 确保 subject 为 ZIPLIST 编码 if (subject...

2018-11-04 13:56:19

阅读数 88

评论数 0

原创 Redis之哈希对象源码阅读

hashTypeTryConversion:对传入的参数进行检查是否需要从ziplist转换成hashtable void hashTypeTryConversion(robj *o, robj **argv, int start, int end) { int i; // 如果...

2018-11-04 13:22:16

阅读数 111

评论数 0

原创 Redis之事件

redis服务器是一个事件驱动程序,服务器需要处理以下两类事件: 1、文件事件:redis服务器通过套接字与客户端进行连接,而文件事件就是服务器对套接字操作的抽象,服务器与客户端的通信会产生相应的文件事件,,而服务器则通过监听并处理这些事件来完成一系列网络通信操作。 2、时间事件:redis服务器...

2018-11-04 12:57:19

阅读数 48

评论数 0

原创 Redis之AOF持久化

AOF持久化是通过保存redis服务器所执行的写命令来记录数据状态的: AOF持久化功能的实现可以分为追加、文件写入、文件同步三个步骤 命令追加 当AOF持久化功能处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾 AOF文件的...

2018-11-04 12:21:39

阅读数 34

评论数 0

原创 Redis之RDB持久化

RDB文件的创建与载入 有两个redis命令可以用于生成RDB文件,一个是SAVE,另一个是BGSAVE。 SAVE命令会阻塞redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求。 BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服...

2018-11-04 11:56:08

阅读数 58

评论数 0

原创 redis之数据库

redis服务器将所有数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDb结构,每个redisDb代表一个数据库 默认情况下,redis服务器会创建16个数据库 每个redis客户端都有自己的目标数据库,默认情况下,redis客户端的目标数据库为...

2018-11-03 22:21:00

阅读数 43

评论数 0

原创 Redis之字符串对象源码阅读

checkStringLength:检查字符串的大小是否超过512MB,超过返回 REDIS_ERR ,未超过返回 REDIS_OK static int checkStringLength(redisClient *c, long long size) { if (size &...

2018-11-03 21:15:06

阅读数 44

评论数 0

原创 Redis之object源码阅读

在这片博客中,我们将对object.c这个文件的其中一些方法进行阅读,大部分代码都是类似的: createObject:创建一个新对象 robj *createObject(int type, void *ptr) { robj *o = zmalloc(sizeof(*o)); ...

2018-11-03 20:43:05

阅读数 27

评论数 0

原创 Redis之对象

redis并没有直接使用我们之前介绍的那些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个系统包含字符串对象、列表对象、哈希对象、集合对象、有序集合对象五种类型的对象,每种对象都用到了至少一种我们前面所介绍的数据结构。通过这五种不同类型的对象,redis可以在执行命令之前,...

2018-11-03 20:17:57

阅读数 28

评论数 0

原创 Redis之压缩列表

压缩列表是列表键和哈希键的底层实现之一。当一个列表键只包含少量列表项,并且每个列表项要么就是整数值,要么就是长度比较短的字符串,那么redis就会使用压缩列表来做列表键的底层实现。 压缩列表的构成 压缩列表是redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型数据结构。一个压...

2018-11-03 18:19:29

阅读数 27

评论数 0

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