自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 nsq源码之nsqlookupd执行流程

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

2019-03-27 11:11:01 507

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

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

2019-03-26 20:43:37 2528

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

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

2019-03-26 15:27:25 631

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

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

2019-03-26 14:36:25 2604 1

原创 nsq阅读概述

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

2019-03-26 13:06:30 159

原创 Quartz源码剖析

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

2019-03-19 20:16:49 594

原创 Dubbo的SPI机制

在阅读dubbo的源码的时候,下面这行代码或者相似的代码我们会经常看到ExtensionLoader.getExtensionLoader(ConfiguratorFactory.class) .getExtension(url.getProtocol())这就是dubbo的SPI机制,这种方式我们平时也经常用,使用场景就是,我们定义了一个接口,有好多类实现了这个接口,程序在编写时我们不知道...

2019-03-16 17:36:46 636

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

当定时任务需要执行的时候,在AbstractElasticJobExecutor的execute方法中会通过jobFacade的getShardingContexts()方法来获取当前服务器的分片信息public ShardingContexts getShardingContexts() { //检查时候开启失效转移 boolean isFailover = configS...

2019-03-16 16:27:26 1175

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

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

2019-03-16 12:24:23 1031

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

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

2019-03-16 12:06:47 706

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

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

2019-03-16 11:38:21 1140

原创 Elastic-Job启动流程

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

2019-03-16 11:02:42 1786

原创 SpringMVC之完整的处理流程

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

2018-11-24 20:26:47 1246

原创 SpringMVC之原理总结

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

2018-11-24 14:33:21 147

原创 SpringMVC之ModelFactory

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

2018-11-24 13:38:06 541

原创 SpringMVC之RequestMappingHandlerAdapter

下面是HandlerAdapter的接口定义:public interface HandlerAdapter { /** * Given a handler instance, return whether or not this {@code HandlerAdapter} * can support it. Typical HandlerAdapters will base th...

2018-11-24 12:58:32 699

原创 SpringMVC之HandlerMapping

AbstractHandlerMapping是HandlerMapping的抽象实现,所有HandlerMapping都继承自AbstractHandlerMapping。AbstractHandlerMapping采用模板模式设计了HandlerMapping实现的整体接口,它继承了WebApplicationObjectSupport,初始化时会自动调用模板方法initApplicationC...

2018-11-23 12:53:16 135

原创 SpringMVC之组件概览

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

2018-11-22 22:04:47 133

原创 SpringMVC之处理请求

接下来将会分析SpringMVC是怎么处理请求的,首先会分析HttpServletBean、FrameServlet和DispatcherServlet,然后再看一下核心方法doDispatchHttpServletBean主要参与创建工作,没有涉及请求的处理FrameworkServlet:servlet的处理流程是:首先从Servlet接口的service方法开始,然后在HttpServ...

2018-11-22 17:51:00 186

原创 SpringMVC创建过程

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

2018-11-22 16:45:07 272

原创 常见HTTP状态码

100, client应该继续发送请求,即继续。101, server通知client修改协议,也就说,client需要采用新的协议版本去访问 server。200, 请求已成功。200 ~ 207300 Multiple Choices 如果请求一个指向多个资源的URL时,会返回这个状态码,比如某个服务器上有某个HTML文件的中文和英文版本。301永久重定向302临时重定向,HTTP...

2018-11-05 18:55:24 108

原创 mysql优化的几点建议

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

2018-11-05 18:20:20 101

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

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

2018-11-05 17:20:21 1336

原创 Redis值notify.c阅读

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

2018-11-05 14:06:09 209

原创 Redis之发布订阅

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

2018-11-05 11:42:55 85

原创 Redis之集群

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

2018-11-05 11:11:54 150

原创 Redis之Sentinel

Sentinel是Redis的高可用性解决方案:由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。当server1的下线时长超过用户设定的下线时长上限时,Sentinel系统就会...

2018-11-04 20:00:52 110

原创 Redis之复制

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

2018-11-04 19:11:28 137

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

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

2018-11-04 15:03:30 238

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

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

2018-11-04 14:16:14 113

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

listTypeTryConversion:尝试将列表对象转换成linkedlist编码void listTypeTryConversion(robj *subject, robj *value) { // 确保 subject 为 ZIPLIST 编码 if (subject->encoding != REDIS_ENCODING_ZIPLIST) return; ...

2018-11-04 13:56:19 196

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

hashTypeTryConversion:对传入的参数进行检查是否需要从ziplist转换成hashtablevoid hashTypeTryConversion(robj *o, robj **argv, int start, int end) { int i; // 如果对象不是 ziplist 编码,那么直接返回 if (o->encoding != RE...

2018-11-04 13:22:16 280

原创 Redis之事件

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

2018-11-04 12:57:19 111

原创 Redis之AOF持久化

AOF持久化是通过保存redis服务器所执行的写命令来记录数据状态的:AOF持久化功能的实现可以分为追加、文件写入、文件同步三个步骤命令追加当AOF持久化功能处于打开状态时,服务器在执行完一个写命令之后,会以协议格式将被执行的写命令追加到服务器状态的aof_buf缓冲区的末尾AOF文件的写入与同步redis的服务器进程就是一个事件循环,这个循环中的文件事件负责接收客户端的命令请求,以及...

2018-11-04 12:21:39 128

原创 Redis之RDB持久化

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

2018-11-04 11:56:08 122

原创 redis之数据库

redis服务器将所有数据库都保存在服务器状态redisServer结构的db数组中,db数组的每个项都是一个redisDb结构,每个redisDb代表一个数据库默认情况下,redis服务器会创建16个数据库每个redis客户端都有自己的目标数据库,默认情况下,redis客户端的目标数据库为0号数据库,但是客户端可以通过执行select命令来切换数据库。在服务器内部,客户端状态redisC...

2018-11-03 22:21:00 132

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

checkStringLength:检查字符串的大小是否超过512MB,超过返回 REDIS_ERR ,未超过返回 REDIS_OKstatic int checkStringLength(redisClient *c, long long size) { if (size > 512*1024*1024) { addReplyError(c,"string ex...

2018-11-03 21:15:06 167

原创 Redis之object源码阅读

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

2018-11-03 20:43:05 134

原创 Redis之对象

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

2018-11-03 20:17:57 102

原创 Redis之压缩列表

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

2018-11-03 18:19:29 103

空空如也

空空如也

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

TA关注的人

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