自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(249)
  • 资源 (12)
  • 收藏
  • 关注

原创 【RocketMQ】【源码】消息的发送

首先来看一个RcoketMQ发送消息的例子:RocketMQ是通过进行消息发送的,它实现了接口,接口中定义了消息发送的方法,方法主要分为三大类:接下来以将以同步消息发送为例来分析消息发送的流程。里面有一个类型的成员变量,从默认的无参构造函数中可以看出在构造函数中对进行了实例化,在方法中就是调用的方法进行消息发送的:中消息的发送在方法中实现,处理逻辑如下:获取路由信息DefaultMQProducerImpl中有一个路由信息表,记录了主题对应的路由信息,其中KEY为topic, value为对应的路

2022-11-02 23:10:27 1368

原创 【RocketMQ】【源码】Broker服务注册

在Broker的启动函数中,添加了定时向NameServer进行注册的任务,在启动后延迟10秒向NameServer进行注册,之后定时发送心跳包,关于发送周期,首先从Broker配置的周期与60000毫秒中选出最小的那个值,然后再与10000毫秒对比,选出最大的那个,所以。brokerLiveTable保存了当前NameServer收到的心跳数据,遍历brokerLiveTable,获取每一个Broker最近一次发送心跳的时间,如果上一次发送心跳的时间 + 过期时间(120s) 小于 当前时间,

2022-11-02 23:08:50 1643

原创 【RocketMQ】【源码】NameServer的启动

NameServer是一个注册中心,Broker在启动时向所有的NameServer注册,生产者Producer和消费者Consumer可以从NameServer中获取所有注册的Broker列表,并从中选取Broker进行消息的发送和消费。NameServer的启动类是。

2022-11-02 23:07:34 2002

原创 【Redis】Redis Cluster-集群数据迁移

Redis通过对KEY计算hash,将KEY映射到slot,集群中每个节点负责一部分slot的方式管理数据,slot最大个数为16384。在集群节点对应的结构体变量clusterNode中可以看到slots数组,数组的大小为CLUSTER_SLOTS除以8,CLUSTER_SLOTS的值是16384:clusterStateclusterNode里面保存了节点相关的信息,集群数据迁移信息并未保存在clusterNode中,而是使用了clusterState结构体来保存:clusterState与cl

2022-06-21 23:11:27 3400

原创 【Redis】集群请求命令处理

在Redis的命令处理函数(server.c)中有对集群节点的处理,满足以下条件时进入集群节点处理逻辑中:条件三的判断条件有些绕,意味着命令中没有key参数,表示当前命令不是EXEC,然后对整体做了取反操作,那么看以下两种情况:MULTI命令的处理上面说到,如果是命令时,也会进入到集群节点处理逻辑,命令一般与结合使用,用于执行事务。比如以下例子中,使用开启事务,执行对a账户增1,b账户减1的操作,可以看到返回结果为,命令被缓存起来,直到执行命令,Redis才开始提交命令:由于集群也需要对命令处理,所以

2022-06-18 13:11:01 1255

原创 【Redis】集群故障转移

Cluster消息类型定义在Redis初始化服务initServer函数中,调用aeCreateTimeEvent注册了时间事件,周期性的执行serverCron函数,在serverCron中可以看到每隔100ms调用一次clusterCron函数,执行Redis Cluster定时任务:clusterCronclusterCron是集群相关的定时执行函数,每100ms执行一次:clusterNodeclusterNode是集群中节点对应的结构体,包含了以下内容:clusterLinkConnect

2022-06-16 22:02:15 2121

原创 【Redis】Redis Cluster初始化及PING消息的发送

Cluster消息类型定义在Redis初始化服务initServer函数中,调用aeCreateTimeEvent注册了时间事件,周期性的执行serverCron函数,在serverCron中可以看到每隔100ms调用一次clusterCron函数,执行Redis Cluster定时任务:clusterCronclusterCron是集群相关的定时执行函数,每100ms执行一次:clusterNodeclusterNode是集群中节点对应的结构体,包含了以下内容:clusterLinkConnect

2022-06-16 21:59:54 1598 1

原创 【Redis】客观下线

sentinelCheckObjectivelyDownsentinelCheckObjectivelyDown函数用于判断master节点是否客观下线:可以看到,master节点客观下线需要根据其他哨兵实例对主节点的判断来共同决定,具体是通过其他哨兵实例的flag中是否有SRI_MASTER_DOWN状态来判断的,如果认为master下线的哨兵个数超过了master节点中的quorum...

2022-06-07 09:28:31 1542

原创 【Redis】哨兵初始化和主观下线

在的redis启动函数main(server.c文件)中,对哨兵模式进行了检查,如果是哨兵模式,将调用initSentinelConfig和initSentinel进行初始化,initServer函数中会注册哨兵的时间事件,最后调用sentinelIsRunning运行哨兵实例,哨兵初始化哨兵模式校验checkForSentinelModecheckForSentinelMode函数在server.c文件中,用于校验是否是哨兵模式,可以看到有两种方式校验哨兵模式:初始化配置项initSentine

2022-06-07 09:26:41 1468

原创 【Redis】网络IO-事件驱动框架源码分析(多线程)

IO线程初始化Redis在6.0版本中引入了多线程,提高IO请求处理效率。在Redis Server启动函数main(server.c文件)中初始化服务之后,又调用了InitServerLast函数:int main(int argc, char **argv) { // ... // 初始化服务 initServer(); // ... // InitServerLast InitServerLast(); // ... // 事件循环

2022-05-29 20:10:22 1446

原创 【Redis】网络IO-事件驱动框架源码分析(单线程)

aeEventLoop初始化在server.c文件的initServer函数中,对aeEventLoop进行了初始化:调用aeCreateEventLoop函数创建aeEventLoop结构体,对aeEventLoop结构体中的变量进行了初始化,之后调用了aeApiCreate函数创建epoll实例调用aeCreateFileEvent函数向内核注册监听事件,由参数可知,注册的是对TCP文件描述符的可读事件监听,回调函数是acceptTcpHandler,当内核监听到TCP文件描述符有可读事件时,R

2022-05-29 20:07:12 493

原创 【Spring】AOP实现原理(三):创建代理

AbstractAutoProxyCreator在AbstractAutoProxyCreator的wrapIfNecessary方法中,调用getAdvicesAndAdvisorsForBean方法获取到所有的Advisor之后,就可以创建代理对象了,创建的具体过程在createProxy方法中:创建代理工厂ProxyFactory调用buildAdvisors构建Advisor,入参是getAdvicesAndAdvisorsForBean获取到的Advice和Advisor,里面又调用了Ad

2022-05-10 09:30:14 781

原创 【Spring】AOP实现原理(二):Advisor获取

@EnableAspectJAutoProxy@EnableAspectJAutoProxy注解可以用来开启AOP,那么就从@EnableAspectJAutoProxy入手学习一下Spring AOP的实现原理。@EnableAspectJAutoProxy导入了AspectJAutoProxyRegistrar。定义了proxyTargetClass属性,表示是否使用CGLIB生成代理对象,默认返回false,默认是使用JDK动态代理创建代理对象的。@Target(ElementType.T

2022-05-09 09:51:26 748

原创 【Spring】AOP实现原理(一):AOP基础知识

AOP相关概念在学习AOP实现原理之前,先了解下AOP相关基础知识。AOP面向切面编程,它可以通过预编译方式或者基于动态代理对我们编写的代码进行拦截(也叫增强处理),在方法执行前后可以做一些操作,一般我们会看到以下几个概念:连接点(JointPoint): AOP进行切入的位置称为连接点,一般指程序中的某个方法,对该方法进行拦截通知(Advice): 在某个连接点执行的操作称为通知,也就是被拦截方法执行前后需要执行的操作称为通知,一共有五种前置通知:作用于被拦截方法执行之前后置通知:作用于被拦

2022-05-07 09:51:09 466

原创 【Spring】事务的执行原理(三)

事务的回滚如果获取事务属性不为空,并且抛出的异常是RuntimeException或者Error类型,调用事务管理器中的rollback方法进行回滚如果事务属性为空或者抛出的异常不是RuntimeException,也不是Error,将继续提交事务public abstract class TransactionAspectSupport implements BeanFactoryAware, InitializingBean { /** * 处理抛出异常下的事务

2022-05-06 09:51:28 617

原创 【Spring】事务的执行原理(二)

前置知识事务的执行步骤如下:获取事务管理器创建事务执行目标方法捕捉异常,如果出现异常进行回滚提交事务public abstract class TransactionAspectSupport implements BeanFactoryAware, InitializingBean { @Nullable protected Object invokeWithinTransaction(Method method, @Nullable Class<?> ta

2022-05-06 09:28:11 983

原创 【Spring】事务的执行原理(一)

在使用事务的时候需要添加@EnableTransactionManagement注解来开启事务,那么就从@EnableTransactionManagement入手查看一下事务的执行原理。@EnableTransactionManagementSpring事务底层是通过AOP来完成的,而Spring AOP基于动态代理实现,可以看到mode方法默认返回了PROXY代理模式,我们只需关注代理模式下的执行流程即可使用@Import导入了TransactionManagementConfiguration

2022-04-02 22:08:39 1134

原创 Ribbon的ServerStats引起内存泄露问题总结

问题描述服务运行一段时间之后,出现页面卡顿加载慢的问题,使用top命令查看了服务器的使用情况,发现CPU飙高,接着查看了该进程中每个线程的占用情况,发现导致CPU高的线程是JVM垃圾回收的线程,然后使用jstat命令打印了GC的情况,基本隔几秒就进行一次FULL GC,每次FULL GC之后有大量的内存空间释放不掉,所以JVM内存空间很快又被耗尽再次进行GC。既然JVM在频繁的进行垃圾回收,接下来就要分析是什么原因造成的,使用jmap命令导出了一份内存快照,导入到Eclipse Memery Analy

2022-03-13 11:22:03 1004 1

原创 使用itextpdf拆页遇到的问题总结

使用itextpdf拆页遇到的问题总结问题一:stream closed问题复现原因分析PdfCopy解决方案问题二:文件损坏问题复现最近使用了itextpdf对多页的PDF文件进行拆页,将它按页拆分,每一页对应一个PDF文件,在进行测试的过程中发现了两个问题:对OutputStream使用try-with-resoure的情况下,在finally中关闭document对象时,报stream closed错误。将拆页后的输出流转为输入流时,如果不调用document的close方法,会导致一部分数据

2021-10-31 22:05:37 2017

原创 Springboot整合ShardingSphere分库分表

单库单表假设现在有一个存储商品信息的数据库db_product,db_product里面有一张Product商品信息表,里面存储了商品ID和商品名称,先使用Springboot搭建一个项目,Mysql作为数据库,对Product表进行操作。初始化数据库创建数据库db_product,和product商品表:CREATE DATABASE IF NOT EXISTS db_product DEFAULT CHARACTER SET utf8;USE db_product;CREATE TABLE

2021-04-11 22:27:27 1077

原创 Mac环境下编译Elasticsearch源码并导入IDEA

参考:《Elasticsearch源码解析与优化实战》-张超 1.下载Elasticsearch源码此处下载的源码版本为6.1.2,下载后解压文件:https://github.com/elastic/elasticsearch/releases 2.安装Gradle由于Elasticsearch5.0之后使用Gradle构建,因此需要安装Gradle,mac下安装Gr...

2019-01-27 13:05:05 2321 1

原创 【Mybatis源码】一级缓存

参考::【MyBatis源码解析】MyBatis一二级缓存凯伦:聊聊MyBatis缓存机制Mybatis一级缓存配置:&lt;setting name="localCacheScope" value="SESSION"/&gt;value有两个值可选:session:缓存对一次会话中所有的执行语句有效,也就是SqlSession级别的。statement:缓存只对当前执行的这一个Statement...

2018-05-19 20:09:28 526

原创 【Mybatis源码】SqlSession四大对象

四大对象:Executor:执行器,用来调度StatementHandler、ParameterHandler、ResultHandler等来执行对应的SQL。StatementHandler:使用数据库的Statement执行操作,是四大对象的核心。ParameterHandler:用于对SQL参数的处理。ResultHandler:进行最后数据集ResultSet的封装返回处理的。一、Exec...

2018-05-16 22:55:24 1294

原创 【mybatis源码】Mapper的动态代理

DefaultSqlSession的getMapper方法入手:(1)DefaultSqlSession的getMapper方法中实际上又调用的是Configuration中的getMapper方法:@Overridepublic &lt;T&gt; T getMapper(Class&lt;T&gt; type) { return configuration.&lt;T&gt;getM...

2018-05-13 12:30:04 1025

原创 【Mybatis源码】SqlSessionFactory构建过程

参考:MyBatis 源码分析——介绍MyBatis 源码分析——配置信息通过代码构建SqlSessionFactory的过程://mybatis的xml配置文件String resource = "mybatis-config.xml";//获取配置文件输入流InputStream inputStream = Resources.getResourceAsStream(resource);...

2018-05-08 21:35:08 646

原创 Hashtable源码

1.Entry结构  HashMap的节点结构叫Node(JDK1.8,JDK1.8以前也叫Entry),Hashtable为Entry,都包含了四个相同的字段。private static class Entry&lt;K,V&gt; implements Map.Entry&lt;K,V&gt; { //hash值 final int hash; ...

2018-05-06 21:11:47 311

原创 LinkedHashMap源码

LinkedHashMap继承了HashMap,HashMap具有的特性LinkedHashMap也有。public class LinkedHashMap&lt;K,V&gt; extends HashMap&lt;K,V&gt; implements Map&lt;K,V&gt;LinkedHashMap与HashMap不同的是,除了拥有与HashMap一样的存...

2018-05-05 13:19:26 305

原创 HashMap源码

1.节点结构在哈希表中存储的元素的结构如下:hash:根据key的hash值,计算在哈希表(数组)中的索引key:Map中的key值value:Map中的valuenext:下一个节点的引用,由于会产生哈希冲突,hashmap采用链表(JDK1.8中增加了红黑树)解决冲突,如果根据hash计算出的索引位置处已经放有节点,但是节点的value与要加入的对象的value不同,将新节点使用尾插法插入(J...

2018-05-03 20:55:20 331

原创 LinkedList源码

LinkedList由双向链表实现,实现了List、Deque、Serializable、Cloneable接口,能被克隆和实例化。public class LinkedList&lt;E&gt; extends AbstractSequentialList&lt;E&gt; implements List&lt;E&gt;, Deque&lt;E&gt;, Clo...

2018-04-30 15:01:13 454

原创 ArrayList源码

参考:jdk1.8.0_45源码解读——ArrayList的实现【Java集合源码剖析】ArrayList源码剖析从ArrayList的继承关系上看ArrayList的特点:public class ArrayList&lt;E&gt; extends AbstractList&lt;E&gt; implements List&lt;E&gt;, RandomAccess, Clo...

2018-04-28 22:30:10 306

原创 深入理解JVM笔记-演示OOM异常和SOF异常

1.堆中的OutOfMemory异常设置最大堆和Xmx最小堆Xms参数,通过不断的创建对象,当没有足够的空间创建新的对象时产生内存溢出异常-verbose:gc-Xms20M-Xmx20M-Xmn10M-XX:+PrintGCDetails -XX:SurvivorRatio=8Xms:最小堆Xmx:最大堆Xmn:新生代的大小PrintGCDetails:打印GC日志SurvivorRatio:E...

2018-03-25 15:53:39 1263

原创 Elasticsearch文档存储过程

参考:ES官方文档分片内部原理:https://www.elastic.co/guide/cn/elasticsearch/guide/current/inside-a-shard.htmlES分片原理:http://blog.csdn.net/mgxcool/article/details/49250341索引的解释:名词的索引:指的是由多个分片组成的集合,类似于数据库中的数据库名称动词的索引:...

2018-03-17 22:35:09 4592

原创 RabbitMQ自定义Consumer

在 使用RabbitMQ简单发送接收消息 一文中介绍了使用默认的转发器direct进行消息的发送和接收,在接收端可以看到使用了一个while循环来保证程序一直运行,当队列中有消息时接收消息,没有消息就等待:while (true) { //从consumer中获取队列中的消息,nextDelivery是一个阻塞方法,如果队列中无内容,则等待 ...

2018-03-17 17:50:16 2160

原创 Mac通过homebrew安装rabbitmq

这里使用homebrew安装rabbitmq1.打开终端,输入安装命令brew install rabbitmq安装的时候如果出现下面的错误:Error: Failed to download resource "erlang"Download failed: https://homebrew.bintray.com/bottles/erlang-20.2.2.high_sierra.bottle...

2018-03-11 16:10:23 8810

原创 python从数据库获取全量数据的方法

数据库:postgresql(1)第一种方法:使用分页查询的方式,不推荐使用特别是在数据量大的时候       首先计算总数据量,然后根据每次查询的大小batch_size计算总共有多少页,再一页一页的去获取数据。       由于分页查询类似ES中的深度分页,页数越大效率越低,因此在数据量小的时候用用还凑合。import psycopg2.poolfrom datetime import da...

2018-03-09 22:53:27 12156

原创 python获取文件的绝对路径

文件目录结构如下:第一种方法:os.path.abspath(__file__)假设app.py中想读取config.ini文件的内容,首先app.py需要知道config.ini的文件路径,从目录结构上可以看出,config.ini与app.py的父目录同级,也就是获取到app.py父目录(bin文件夹的路径)的父目录(config文件夹路径)的绝对路径再拼上config.ini文件名就能获取到...

2018-02-08 09:54:23 129989 6

原创 sklearn计算两个向量之间的距离

from sklearn.feature_extraction.text import CountVectorizerfrom sklearn.metrics.pairwise import euclidean_distancesfrom sklearn.feature_extraction.text import TfidfVectorizerimport jiebadef seg_w

2018-01-26 17:09:27 11440

原创 elasticsearch bulk方法超时问题

批量插入数据的时候,出现了超时的问题,因为es默认时间为10s,批量插入的时候超过了这个时间,出现了超时异常批量插入语句: es_conn.bulk(data_list)异常:elasticsearch.exceptions.ConnectionTimeout: ConnectionTimeout caused by - ReadTimeoutError(HTTPConnectio

2018-01-24 22:03:19 19706

原创 基于情感词典的情感分析

思路以及代码都来源于下面两篇文章:一个不知死活的胖子:Python做文本情感分析之情感极性分析 Ran Fengzheng 的博客:基于情感词典的文本情感极性分析相关代码基于情感词典的情感分析应该是最简单的情感分析方法了,大致说一下使用情感词典进行情感分析的思路:对文档分词,找出文档中的情感词、否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前的否定词和程度副词划分为一个组...

2018-01-19 23:05:26 83424 116

原创 python使用反射机制实例化对象

之前在做数据解析的时候,发现不同类别的数据解析的流程是一样的,只不过每次去查询获取数据的时候表不相同,为了代码能够简洁一些,想到了先创建一个父类A,每个数据类别对应一个A的子类,在子类中实现数据查询的方法,然后通过获取A的所有子类对象,用反射机制实例化对象,再调用数据查询的方法来完成所有类别的数据解析工作,这样如果再新增一个类别,只需要再添加一个A的子类对象即可。例子:项目结构如下:

2018-01-19 22:06:44 14123 3

nacos-server-2.0.3.zip

nacos-server-2.0.3.zip

2022-03-01

json与bean的转换

json-lib中的jsonobject的简单使用,并介绍了json与bean的转换 http://blog.csdn.net/lom9357bye/article/details/53291636

2016-11-22

scrollDemo

Elasticsearch的scroll分页查询用法 http://blog.csdn.net/lom9357bye/article/details/64500638

2017-03-21

elasticsearch简单例子

基于elasticsearch使用Java创建索引、更新索引、删除索引、查询索引的一个小例子 http://blog.csdn.net/lom9357bye/article/details/52841711

2016-10-17

MyPushDemo

Android百度云推送,通过百度云推送的SDK和下载的demo实现一个简单的消息推送

2015-12-12

springbootdemo

springboot的一个简单demo

2016-12-19

SAXParseXMLDemo

使用SAX解析XML,并将解析后的数据封装到自定义的XMLObject中

2015-12-12

fileipload

springmvc上传单个文件的demo

2017-06-07

SpinnerDemo

spinner用法的一个小例子 文章地址:http://blog.csdn.net/lom9357bye/article/details/50282791

2015-12-13

springboot

springboot操作mysql

2017-04-09

spring-aop

spring aop的demo http://blog.csdn.net/lom9357bye/article/details/72812089

2017-06-03

spring学习

spring基于注解和XML装配bean的例子 http://blog.csdn.net/lom9357bye/article/details/72802342

2017-05-30

空空如也

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

TA关注的人

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