自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 RabbitMQ学习(三):高并发、高吞吐量、高可用的集群实现

一、概述高吞吐量与其他中间件产品类似,RabbitMQ也是通过集群的方式来解决单节点在处理海量消息时的性能瓶颈,通过集群的方式来实现高吞吐量,如单个RabbitMQ节点每秒只能处理1000个消息,而通过集群方式拓展,则可以进一步达到每秒10万个消息的处理或者更高的吞吐量。不过RabbitMQ的集群在处理海量消息时,是通过在集群的多个节点建立多个不同的队列来分散消息到多个不同节点的,所以在业...

2019-06-06 01:06:06 11451

原创 RabbitMQ学习(二):高可靠之持久化与高可用之镜像队列

概述RabbitMQ是对内存队列,如Java的阻塞队列BlockingQueue的一种升级,即作为一个进程队列实现不同进程之间的消息通信交互,而内存队列,如BlockingQueue则通常用于实现一个Java进程的不同线程之间的消息通信交互。这也是顺应从单体应用到分布式系统的演变所必须的消息队列的演进,解决了分布式系统不同系统之间的消息传递问题。由于RabbitMQ主要用于实现不同进程或者说...

2019-06-05 01:05:08 3082

原创 RabbitMQ学习(一):RabbitMQ的架构设计与核心组件剖析

概念RabbitMQ是基于erlang语言开发的一个消息队列系统,是对AMQP协议的实现,其中AMQP的全称为Advanced Message Queuing Protocl,即高级消息队列协议,该协议主要用于制定基于队列进行消息传递的一个开放标准。AMQP的核心概念包括:虚拟主机vhost,连接Connection,信道Channel,数据交换器Exchanger,队列Queue,交换器与...

2019-06-04 00:16:57 4869 2

原创 SSL方式连接Netty服务端失败:OpenSslEngine类无法加载NoSuchMethodError异常排查分析

一. netty客户端通过ssl方式连接服务端失败最近在重构项目代码,在测试时在本地通过ssl的方式连接服务端,服务端通过SniHandler处理ssl连接时,报一下异常:2019-05-27 17:32:26,104 110948 [nioEventLoopGroup-3-2] ERROR c.t.p.b.m.h.ChannelDisconnectedHandler(128) - Co...

2019-05-27 22:19:54 6804

原创 Spring的构造函数注入的循环依赖问题

一、循环依赖spring的循环依赖主要是指两个类相互之间通过@Autowired自动依赖注入对方,即类A包含一个类B的对象引用并需要自动注入,类B包含一个类A的对象引用也需要自动注入。对于循环依赖问题,spring根据注入方式的不同,采取不同的处理策略,对于双方都是使用属性值注入或者setter方法注入,则spring可以自动解决循环依赖注入问题,应用程序可以成功启动;对于双方都是使用构造函...

2019-05-26 11:02:18 16354 13

原创 Spring的三种依赖注入方式的使用和源码实现分析

一、自动依赖注入的方式注解类型spring提供了基于注解的属性自动注入特性,其中可以可用的注解包括spring自身提供的@Autowired和@Value,其中@Autowired是我们在项目中最常用来注入对象属性的,@Value注解通常用于注入属性文件properties的值,除此之外还可以使用JSR-330提供的注解@Inject,类型为javax.inject.Inject。如下:...

2019-05-26 00:14:00 8056

原创 Java类加载失败异常:NoClassDefFoundError与ClassNotFoundException

一、NoClassDefFoundError:运行时加载不到类在运行时,需要使用该类时,如调用该类的静态static方法或者创建该类的对象,无法从类路径加载该类而发生错误。无法加载可能类路径和mavne仓库确实是没有这个类,或者该类对当前的类加载器不可见,如tomcat容器中的不同应用使用不同类加载器。出现场景:常出现在:当通过手动安装某个第三方jar包,假如为A包,而A包又引用了另外一个...

2019-05-18 17:33:10 8417 5

原创 Code Review的基本思路

一、业务检查1. 业务流程正确性代码实现的业务流程是否合理,是否按照产品需求设计,或者是否对之前的业务流程有影响。2. 业务的可拓展性如某项业务数据的存储和结构是否能够支持未来业务的变化,如现在是统计A项数据,而未来可能统计与A相关的B项数据。二、设计检查1. 接口和方法设计(1)传参是否合理,如是否存在冗余传参,参数数据类型是否合理;(2)方法内部的相关判断和边界检查是否合理,如...

2019-05-16 11:09:51 4594 1

原创 Zookeeper学习(二):ZAB原子广播和集群leader选举策略

一、概述zookeeper作为分布式系统协调者和管理者,承担着联结分布式系统的各组件来组成一个完整服务的职责,如kafka作为一个分布式集群,在kafka的内部体系结构中包含消息生产者,消费消费者,消息存储broker三个核心组件,kafka通过在zookeeper中维护这三大组件的运作信息,并且这三大组件分别通过zookeeper获取其他组件的运作信息或者获取组件内部其他子组件的运作状态来协...

2019-05-13 00:09:09 8493

原创 Zookeeper学习(一):核心设计与运用场景剖析

概述Zookeeper的设计目的,可以根据它的名字“zoo”和“keeper”推断,即动物园的管理者,而这样命名的起因是很多分布式组件,如Hadoop是大象,tomcat是猫等,故zookeeper是一种分布式协调和分布式组件管理服务,即负责管理和协调一个复杂的分布式系统的各个组件,使得这些组件能够相互协作,共同构成一个分布式系统。具体来说,Zookeeper是Hadoop生态的中的一个用于...

2019-05-12 01:19:34 3985 2

原创 秒杀系统设计思路与实战(含源码实现)

一、限流与降级客户端限流按钮置灰js控制每秒只能发送一个请求站点层限流1. Nginx限流Nginx官方版本限制IP的连接和并发分别有两个模块:limit_req_zone: 用来限制单位时间内的请求数,即速率限制,采用的漏桶算法。limit_req_conn: 用来限制同一时间连接数,即并发限制。2. 站点层限流客户端限流一般可以限制住普通用户,对于高端用户,则可能使...

2019-05-08 22:38:15 15986 19

原创 Kafka学习(二):基于磁盘顺序IO和零拷贝技术实现高性能文件读写

概述Kafka作为一个支持大数据量写入写出的消息队列,由于是基于Scala和Java实现的,而Scala和Java均需要在JVM上运行,所以如果是基于内存的方式,即JVM的堆来进行数据存储则需要开辟很大的堆来支持数据读写,从而会导致GC频繁影响性能。考虑到这些因素,kafka是使用磁盘而不是内存来进行数据存储,并且基于磁盘顺序读写和MMAP技术来实现高性能。存储结构目录与文件结构由...

2019-04-27 22:31:36 8239 7

原创 Kafka学习(一):Kafka的整体架构与核心组件设计剖析

概述Kafka是一个具有高吞吐量,高拓展性,高性能和高可靠的基于发布订阅模式的消息队列,是由领英基于Java和Scala语言开发。通常适合于大数据量的消息传递场景,如日志分类,流式数据处理等。Kafka的体系结构的核心组件包括:消息生产者,消息消费者,基于消息主题进行消息分类,使用Broker集群进行数据存储。同时使用Zookeeper进行集群管理,包括主题的分区信息,分区存放的broker...

2019-04-27 11:26:50 8817 1

原创 maven编译警告解决之-Xlint:unchecked

当我们通过mvn命令来编译代码时,如mvn clean compile,有时会出现WARNING编译警告,如下只是提示某个类,但是没有提示具体哪行代码,提示加上-Xlint:unchecked来查看详细信息。所以根据提示执行命令:mvn clean compile -Xlint:unchecked,但是提示没有lint这个插件,如下:针对以上错误,解决版本就是在maven-co...

2019-04-16 17:17:27 25693 2

原创 MySQL学习(九):SQL查询语句的用法和优化

一、概述MySQL的性能优化可以从机器硬件,如磁盘,内存等;MySQL服务器配置,如线程数,查询缓存等;MySQL的主从分离和分库分表等;SQL语句优化等。其中SQL语句优化是与日常开发密切相关的,而且也是MySQL优化中最重要的一个环节,因为MySQL服务器,机器等的资源是一定的,故当出现性能瓶颈时,首先需要排除是否为SQL执行问题,如通过开启MySQL慢日志统计执行慢的SQL,或者使用p...

2019-04-14 23:38:44 2441

原创 SQL优化(三):子查询和IN,EXISTS用法和优化方法

用法1. 与IN结合使用子查询与IN结合使用时,通常通过子查询查询出某个表单列的值,然后作为外层的SELECT的IN查询的数据源,如下,查询今天进行了购物的用户列表,首先通过子查询在订单表t_order查出所有今天进行了购物的用户的user_id,然后在外层SELECT中对于用户表t_user的每个用户都通过IN来判断自己的user_id是否在里面:mysql> select * ...

2019-04-14 22:53:38 6283

原创 SQL优化(二):MySQL索引失效的六种场景与优化方法

概述以下基于用户订单表t_order和订单清单条目表t_order_item来分析,二者通过order_id来建立外键约束。mysql> show create table t_order;+---------+--------------------------------------------------------------------------------------...

2019-04-14 17:34:43 4081

原创 SQL优化(一):MySQL多表查询FROM和JOIN的用法与性能优化

概述from和join均是用于指定需要从哪些表查询数据,from可以是一个表或多个表,如果是多个表则是生成一个笛卡尔集,会涉及到大量数据。所以通常在涉及到多个表的查询时,通常通过join来拼接多个表。join主要是通过多个表之间的外键关联来进行拼接,注意用于拼接的列需要加上索引,如果没有则MySQL也会默认加上,不过前提是外键列和引用的主键列需要是相同的数据类型,如数字类型需要是相同的...

2019-04-10 23:57:08 15732 1

原创 MySQL学习(七):Innodb存储引擎索引的实现原理

概述在数据库当中,索引就跟树的目录一样加快数据的查找速度,对于一个SQL查询操作,根据索引快速过滤掉不符合要求的数据并定位到符合要求的数据,从而不需要扫描整个表来获取所需的数据。在innodb存储引擎中,主要是基于B+树来实现索引,在非叶子节点存放索引关键字,在叶子节点存放数据记录或者执行数据记录的指针,所有的数据记录都在同一层,叶子节点,即数据记录直接之间通过指针相连,从而可以方便地遍历到...

2019-04-07 21:13:49 7713 1

原创 MySQL学习(六):Innodb存储引擎的事务实现机制

概述事务机制主要用于实现数据库对并发访问的支持和在并发访问下的数据一致性和可靠性。MySQL的myisam存储引擎是不支持事务的,通过表锁来实现数据的可靠性,类似于Java多线程的同步锁synchronized,避免并发修改,但是并发性能较差,比较适合OLAP的应用,同时数据库奔溃恢复比较麻烦。innodb存储引擎是支持事务的,支持多个客户端高性能地进行并发操作,相对myisam并发性能较好...

2019-04-07 17:19:11 4976

原创 MySQL学习(五):Innodb存储引擎锁与MVCC机制的实现原理

概述锁的主要作用是在并发访问时,锁住所操作的数据表,数据页或者数据行,MySQL中不同的存储引擎存在差异,从而避免多个客户端对同一个数据进行操作,导致数据不一致现象的发生。锁根据是否需要对数据修改分为共享锁和排它锁,分记为S锁和X锁,其中S锁与S锁是共享的,S锁与X锁是互斥的,X锁与X锁也是互斥的,即数据读取SELECT操作使用共享锁,数据更新相关操作使用互斥锁。在MySQL当中,myis...

2019-04-07 12:17:18 5985

原创 Intellij IDEA上的git代码合并与冲突解决

代码合并代码合并:当我们通过idea来合并其他分支的代码的时候,如将功能分支合并到测试分支,首先需要切换到测试分支,然后拉一下最新代码,最后合并你的功能分支,如下:git checkout testgit pull(或者git fetch)git merge feature_xx代码冲突如果发生冲突,则针对冲突文件,通常会包含三个选项,分别为:Accept Yours,Ac...

2019-04-04 11:46:59 8608

原创 Linux命令存放目录bin的体系结构分析

概括在Linux系统当中,通常在/bin,/sbin,/user/bin,/user/sbing来存放可执行命令。具体如下:/bin存放系统操作的最基本的,必须的执行命令,即对所有用户都可执行的命令,如下为mac系统下的bin目录,标准的Linux服务器包含更多:xyzdeMacBook-Pro:bin xyz ls[ cp df hostname link mv rm...

2019-04-03 23:55:58 5267

原创 Linux权限控制之su与sudo的差别与sudo的配置

su与sudo的差别在Linux系统中,当我们需要以普通用户身份执行某条系统命令时,通常会显示:Permission denied,这时需要通过su切换到root用户,或者使用sudo命令来执行该命令,如下:xyzdeMacBook-Pro:linux xyz$ su - rootPassword:su: SorryxyzMacBook-Pro:linux xyz$ sudo vi...

2019-04-03 23:13:39 2700

原创 free命令详解:内存使用与可用情况统计

free命令参数概括free命令主要用于查看当前系统的物理内存使用情况,包含内存总量,已使用的内存和可使用的内存,如下:[xyz@linux ~]$ free -mh total used free shared buffers cachedMem: 5.7G 5.5G 19...

2019-04-02 13:13:08 7217

原创 top命令详解:CPU,内存,进程信息统计

top的使用方法top命令主要用于分析Linux服务器当前的实时CPU和内存消耗情况,以及进程的运行情况统计。命令使用:top ,具体top命令的使用方法和以下截图的各个信息的含义,可通过man top命令来查看。其中比较常用的是:按1显示各个核的统计,使用-p参数指定所要监控的进程号。top - 11:32:29 up 109 days, 20:46, 1 user, lo...

2019-04-01 23:58:28 8413

原创 数据结构-树(三):多路搜索树B树、B+树

多路搜索树完全二叉树高度:O(log2N),其中2为对数完全M路搜索树的高度:O(logmN),其中M为对数,树每层的节点数所以每层的节点数越多,则树的高度越矮。M路搜索树主要用于解决数据量大无法全部加载到内存的数据存储。通过增加每层节点的个数和在每个节点存放更多的数据来在一层中存放更多的数据,从而降低树的高度,在数据加载时减少磁盘访问次数。B树B树是一种M路搜索树,B树主要用于...

2019-03-31 16:23:15 3141

原创 leetcode 226. 翻转二叉树(递归与非递归)

题目描述翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1递归版本:首先对根节点的左右节点进行反转,然后在对左右子树进行反转。/** * Definition for a binary t...

2019-03-30 22:49:34 2700

原创 数据结构-树(二):平衡树AVL树

设计初衷树主要是链表数据结构的变形,目的是实现各种操作的O(logN)时间复杂度,从而优化链表的O(N)时间复杂度。对于二叉查找树来说,对于每个节点,左子树的值均小于该节点的值,右节点的值均大于该节点值。故当数据分布不均匀时,可能会导致所有节点都在根节点的左子树或者右子树,从而退化回了链表,造成性能问题。所以为了解决这个问题,AVL树通过对树节点的旋转操作,保证每个节点的左右子树高度差最大...

2019-03-30 21:17:19 2304

原创 数据结构-树(一):树的设计初衷与二叉树的前序、中序、后序遍历(递归与循环两种版本)

树的设计初衷操作时间复杂度树这种数据结构的出现主要是对链表数据结构的优化,链表数据结构是线性结构,操作一般需要O(N)的时间复杂度,树是链表的变形,即链表的每个节点包含一个节点,而树的节点可以包含多个节点,如二叉树为根节点,左节点,右节点三个字节组成一个大节点,所以相对链表来说,相同的节点个数由于这种大节点的存在,故长度变小了,每次可以获取更多个子节点的信息,操作时间复杂度也减小了,如二叉树...

2019-03-30 14:43:36 3722

原创 leetcode142. 环形链表 II(环的第一个节点),O(N)时间复杂度与O(1)空间复杂度

题目描述分析:可以使用一个map来记录每个遍历过的节点,当遍历到一个之前遍历过的节点时(第一次出现这种情况),则说明链表存在环了且这个节点是环的第一个节点,实现如下:/** * Definition for singly-linked list. * class ListNode { * int val; * ListNode next; * Lis...

2019-03-29 22:35:12 2693 1

原创 leetcode 141. 环形链表(链表是否有环)

题目描述:分析:如果链表存在环,则遍历的时候永远会在这个环打转,如果不存在环则遍历到最后一个节点的下一个节点就是空的了,即是null。所以如果要判断一个链表是否存在环,则使用两个指针来遍历,一个慢指针一次走一格,一个快指针一次走两格,故如果存在环则在快的肯定会在环上撞见慢的,就跟人走路一样。具体实现如下:/** * Definition for singly-linked list...

2019-03-29 21:44:45 3136

原创 MySQL学习(八):SQL解析顺序与MySQL底层实现

SQL语句的核心元素SQL语句的核心组成如下:其他复杂查询,如子查询,UNION等也是基于这些元素来构成的,只是MySQL服务器对结果进行了处理。SELECT DISTINCT < select_list > FROM < left_table > < join_type >JOIN < right_table > O...

2019-03-27 00:39:14 3210

原创 leetcode 222. 完全二叉树的节点个数

题目描述说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。示例:输入: 1 / \ 2 3 / \ /4 5 6输出: 6分析:二叉树的左右子树都是二叉树,故二叉树的相关问题一般基于分...

2019-03-26 22:43:41 2195

原创 leetcode 34. 在排序数组中查找元素的第一个和最后一个位置

题目描述:给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。你的算法时间复杂度必须是 O(log n) 级别。如果数组中不存在目标值,返回 [-1, -1]。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: [3,4]示例 2:输入: nums = [5,7,7,...

2019-03-26 22:30:22 2419

原创 SQL优化(四):explain命令详解:SQL性能分析利器

explain命令的使用很简单,主要用于对SELECT语句的执行情况进行分析,示例如下:mysql> EXPLAIN SELECT DISTINCT(trade_date) FROM order WHERE user_id=1 ORDER BY trade_date DESC LIMIT 10;+----+-------------+-------------------+-----...

2019-03-26 15:44:15 6105

原创 GC日志配置与格式

GC日志配置与日志格式-XX:+PrintGC或者-verbose:gc:开启日志打印功能,即JVM会将运行期间的每次GC事件都以日志方式输出出来。配置之后打印如下:[GC 118250K->113543K(130112K), 0.0094143 secs][Full GC 121376K->10414K(130112K), 0.0650971 secs]GC表示为Mi...

2019-03-24 23:48:26 4612

原创 并行并发CMS垃圾回收器:-XX:+UseConcMarkSweepGC

概述CMS为基于标记清除算法实现的多线程老年代垃圾回收器。CMS为响应时间优先的垃圾回收器,适合于应用服务器,如网络游戏,电商等和电信领域的应用。为了实现这个目的,与其他垃圾回收器不同的是,CMS是与应用程序并发执行的,即在CMS对老年代进行垃圾回收时,应用程序大部分时间里是可以继续执行的,应用程序只需进行非常短暂的停顿。由于与应用程序并发执行,同一时刻同时存在垃圾回收线程和应用线程,故对服...

2019-03-24 21:34:38 38664

原创 JVM GC垃圾回收算法与调优参数

概述在C++程序当中,对于每一个通过new动态创建的对象,在不再需要时,需要通过delete显示删除对象,释放该对象占用的内存空间,否则会发生内存泄露。在Java当中,为了简化内存管理,JVM提供了自动垃圾回收机制,统一由JVM来进行垃圾对象回收,在Java应用程序当中只需要按需创建对象即可,不需要在应用程序中手动删除对象。由之前的文章分析可知,在JVM的运行时数据区中,主要是在堆中存放新创...

2019-03-24 21:31:37 4859

原创 Java对象的强、软、弱、虚引用

Java的方法的对象参数是按值传递的,而不是按引用传递的,即传递的是对象引用的值。对象引用通常是存放在栈中的,而对象引用所引用的对象是存放在堆中的。在Java中,为了优化内存使用,降低OOM发生的风险,提高垃圾回收的效率,可以在应用程序中根据对象的特点来设置不同类型的对象引用来协助JVM进行垃圾回收。对象引用包括以下类型:除了强引用之外,其他三种引用类型,在GC roots可达的情况下,也可以...

2019-03-24 16:15:53 2267

空空如也

空空如也

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

TA关注的人

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