自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

whfstudio的博客

from zero to hero

  • 博客(50)
  • 资源 (1)
  • 收藏
  • 关注

原创 死磕Java之聊聊ThreadLocal源码(基于JDK1.8)

记得在一次面试中被问到ThreadLocal,答得马马虎虎,所以打算研究一下ThreadLocal的源码模拟当时的面试场景面试官 : 用过ThreadLocal吗? 楼主答 : 用过,当时使用ThreadLocal的时候,使用Spring实现横切整个Controller层,使用ThreadLocal实现了统计每次请求对应方法的执行时间,具体代码如下 public cl...

2018-05-07 20:27:24 471

原创 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负责的模块connector就派上了用场。在楼主的努力下,线上数据同步代码经历了从最初的将近16个小时(并且还出现其他问题这些问题,等后面慢慢细说),到最终25分钟的性能优化。打个广告,楼主自己造的轮子,感兴趣的请点https...

2018-04-23 21:38:57 636

原创 自建脚手架之配置中心--LightConf的实现

常规项目开发过程中, 通常会将配置信息位于在项目resource目录下的properties文件文件中, 配置信息通常包括有: jdbc地址配置、redis地址配置、活动开关……等等。因此每次上线或者服务迁移的时候都要手动修改配置,并一台一台的重启服务器,甚是麻烦,且费时费力。 于是便萌生出了使用配置中心的想法,在考察了github上的apoll,xxl-conf等开源项目后,感觉...

2018-04-22 18:42:07 253

原创 Java实现终止线程池中正在运行的定时任务

源于开发最近项目中遇到了一个新的需求,就是实现一个可以动态添加定时任务的功能。说到这里,有人可能会说简单啊,使用quartz就好了,简单粗暴。然而quartz框架太重了,小项目根本不好操作啊。当然,也有人会说,jdk提供了timer的接口啊,完全够用啊。但是我们项目的需求完全是多线程的模型啊,而timer是单线程的,so,楼主最后还是选择了jdk的线程池。线程池是什么Java通过E

2018-01-17 20:33:01 8414

原创 高性能无锁队列 Disruptor 初体验

原文地址: haifeiWu和他朋友们的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢!最近一直在研究队列的一些问题,今天楼主要分享一个高性能的队列 Disruptor 。 what Disruptor ?它是英国外汇交易公司 LMAX 开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题。基于 Disruptor 开发的系统单...

2018-08-16 21:39:52 488

原创 Netty 源码中对 Redis 协议的实现

原文地址: haifeiWu的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢!近期一直在做网络协议相关的工作,所以博客也就与之相关的比较多,今天楼主结合 Redis的协议 RESP 看看在 Netty 源码中是如何实现的。 RESP 协议RESP 是 Redis 序列化协议的简写。它是一种直观的文本协议,优势在于实现非常简单,解析性...

2018-08-09 11:21:45 376

原创 Redis协议规范(译文)

原文地址: haifeiWu的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢!Redis客户端使用名为RESP(Redis序列化协议)的协议与Redis服务器进行通信。 虽然该协议是专为Redis设计的,但它可以用于其他CS软件项目的通讯协议。 RESP是以下几方面的考虑: - 易于实现 - 快速解析 - 可读性高RESP可以序列...

2018-08-08 13:34:18 315 1

原创 线上 ELK 集群健康值 red 状态问题排查与解决

原文地址: haifeiWu的博客 博客地址:www.hchstudio.cn 欢迎转载,转载请注明作者及出处,谢谢!之前一直运行正常的数据分析平台,最近一段时间没有注意发现日志索引数据一直未生成,大概持续了n多天,当前状态: 单台机器, Elasticsearch(下面称ES)单节点(空集群),1000+shrads, 约200G大小。 问题排查服务器内存,CPU状...

2018-08-08 13:30:27 1729

原创 TCP 粘包问题浅析及其解决方案

最近一直在做中间件相关的东西,所以接触到的各种协议比较多,总的来说有TCP,UDP,HTTP等各种网络传输协议,因此楼主想先从协议最基本的TCP粘包问题搞起,把计算机网络这部分基础夯实一下。 贴个广告楼主的博客已全部搬迁至自己的博客,感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏TCP协议的简单介绍TCP是面向连接的运输层协议简单来说,在使用TCP协议之前,必须先建...

2018-07-19 11:22:21 3365 1

原创 JDK 定时任务 Timer 与 ScheduledExecutorService 排坑记录

正在认真敲代码的楼主,突然收到数据维护系统发过来的报警邮件说楼主凌晨跑的定时任务没有成功,于是便开始了楼主今天的找坑填坑的过程。 定时任务,关于 Timer 与 ScheduledExecutorService 的抉择这事肯定会有小伙伴说了为啥不用Quartz啊,因为楼主的庙小啊,就几个定时任务而已Quartz太重了。Timer 存在的问题Timer的主要问题在于,如果T...

2018-07-19 11:20:12 772

原创 死磕Java之聊聊HashSet源码(基于JDK1.8)

HashSet的UML图HashSet的成员变量及其含义public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable{ static final long serialVersionU...

2018-05-12 22:23:21 154

原创 死磕Java之聊聊LinkedList源码(基于JDK1.8)

工作快一年了,近期打算研究一下JDK的源码,也就因此有了死磕java系列LinkedList 是一个继承于AbstractSequentialList的双向链表,链表不需要capacity的设定,它也可以被当作堆栈、队列或双端队列进行操作。LinkedList 实现 List 接口,能对它进行队列操作,提供了相关的添加、删除、修改、遍历等功能。LinkedList 实现 Deque 接口...

2018-05-07 20:25:56 237

原创 死磕Java之聊聊ArrayList源码(基于JDK1.8)

工作快一年了,近期打算研究一下JDK的源码,也就因此有了死磕java系列ArrayList 是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。ArrayList 继承了AbstractList,实现了List。它是...

2018-05-07 20:22:01 411

原创 测试环境服务器硬盘塞满问题排查

项目中出现的问题某天下午测试环境服务器出现tab无法补全命令,给出的提示大概意思就是说,无可用空间无法创建临时文件,不过这次跟上次出现的问题比较像,上次服务器出现的问题,因此楼主判断可能是服务器数据盘被占满,果不其然,使用df -h命令看到服务器数据盘出现100%被占用的情况。问题排查过程楼主首先想到的是可以看到,linux系统中占用数据盘最大的文件,常情况下,最有可能找出占用磁盘空间...

2018-03-12 18:03:12 279

原创 Java命令之javap初探

javap是jdk自带的一个工具在jdk安装目录的/bin下面可以找到,可以对代码反编译,也可以查看java编译器生成的字节码,对代码的执行过程进行分析,了解jvm内部的工作。下面列举javap命令的常用options及其功能描述,更多功能的使用请自行Google,楼主不做赘述。用法摘要-help 帮助-l 输出行和变量的表-public 只输出public方法和域-protected 只输

2018-02-26 13:22:29 346

原创 shell脚本实现自动保留最近n次备份记录

项目中出现的问题某天上午服务器出现卡顿特别严重,页面加载速度奇慢,并且某些页面刷新出现404的问题,就连服务器的tab命令的自动提示都出现了问题,楼主费了九牛二虎之力,根据服务器排查发现,服务器数据盘出现100%被占用的问题,导致该问题出现的原因是,Jenkins每次部署服务器的时候,都会自动将上一次的war备份,由于开发阶段的频繁部署,最终硬盘被占满,便出现上述描述的情况。解决方案的实现过程获取备

2017-12-08 20:09:38 3695 1

原创 spring aop实现权限管理

问题源于项目开发最近项目中需要做一个权限管理模块,按照之前同事的做法是在controller层的每个接口调用之前上做逻辑判断,这样做也没有不妥,但是代码重复率太高,而且是体力劳动,so,便有了如题所说的使用spring aop做一个切点来实现通用功能的权限管理,这样也就降低了项目后期开发的可扩展性。代码重构之spring 配置文件

2017-12-06 19:42:20 1017

原创 记一次RSA非对称算法的排坑经历

Map<String,Object> encryParam = new HashMap<>(5); encryParam.put("connectorUrl",connectorUrl); encryParam.put("token",token); encryParam.put("plugin",pluginsList); encry

2017-10-23 17:30:20 304

原创 扒一扒spring,dom4j实现模拟实现读取xml

今天leadr提出需求,原来公司项目中读取解析xml文件的代码效率太低,考虑切换一种xml为数据封装格式与读取方式以提高效率。我这灵机一动spring对bean的依赖注入就是读取xml文件,可以尝试扒一扒spring的源码,来实现一个轻量级的方案。重构xml文件,向spring的xml文件格式看齐重构完成的xml文件格式如下:<?xml version="1.0" encoding="UTF-8"

2017-08-23 20:40:44 956

原创 Java编程思想读书笔记之一切皆对象

一切皆对象Java程序运行时,数据保存到哪里寄存器 这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部。然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配。我们对此没有直接的控制权,也不可能在自己的程序里找到寄存器存在的任何踪迹。堆栈中 驻留于常规 RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。堆 一种常规用途的内存池(也在 RA

2017-04-10 20:01:39 457 1

原创 spring mvc常用注解标签

@Controller在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一

2017-04-10 17:08:10 795

原创 SpringMVC基础入门,创建一个HelloWorld程序

新建maven工程,添加maven依赖<properties> <spring.version>4.1.3.RELEASE</spring.version> </properties> <dependencies> <!-- 添加servlet-api --> <dependency> <groupId>java

2017-04-06 17:51:48 439

原创 HTTP协议学习笔记

URL详解http是一个基于请求与相应模式的,无状态的,应用层的协议,常基于TCP链接,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:http://host[“:”port][path] 其中,http表示要通过HTTP协议来定位网络资源

2017-03-22 15:50:31 515

原创 ubuntu安装MySQL

Ubuntu上安装MySQL非常简单只需要几条命令就可以完成。sudo apt-get install mysql-serverapt-get isntall mysql-client3. sudo apt-get install libmysqlclient-dev安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使用如下命令来检查是否安装成功:sudo netstat -

2017-03-20 09:37:23 281

转载 linux文件链接

我的github,欢迎关注 链接:一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。 Linux中包括两种链接:硬链接(HardLink)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。我们首先来了解一下几个名词:索引节点(inode)要了解链接,我们首先得了解一个概念,叫索引节点(inode)。在Linux系统中,内核为每一个新创建的文件分配

2017-03-03 22:13:53 430

原创 redis配置文件常用配置介绍

参数说明redis.conf 配置项说明如下:Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定。指定Redis监听端口,默认端口为6379。 port 6379绑定的主机地址。 bind 127.

2017-03-02 12:20:38 572

原创 tomcat配置文件server.xml详解

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成

2017-03-01 19:30:02 364

原创 Hexo下Next主题配置与优化

使用Next主题在这里Downloads Next主题代码将下载的代码放在myBlog/theme/next目录下设置站点myBlog/_config.yml的theme字段值为next生成新页面hexo g开启服务hexo s –debug发布代码hexo d注:此时登录网站,发现是空白的,打开控制台,提示很多vendors目录下的文件404,解决办法是将next主题下即myBlog

2017-03-01 12:05:40 492

原创 解决无限创建的子文件夹删除不了的问题

能用代码解决的问题都不是问题废话不多说,直接上代码/** * 解决无限创建的子文件夹删除不了的问题 * @author wuhaifei */public class ForeverDelete { // 删除文件夹方法 private void deleteDir(File file) { if (file.listFiles().length == 0

2017-02-27 17:07:41 1194

原创 Maven安装教程

下载Maven 是 Apache 软件基金会组织维护的一款自动化构建工具, 专注服务于 Java 平台的项目构建和依赖管理。 Maven 这个单词的本意是: 专家,内行。 读音是[‘meɪv(ə)n]或[‘mevn]。maven下载地址点击下载地址,如下所示: 解压maven的压缩包到相应的硬盘中(比如D盘下)设置环境变量复制环境变量路径右键我的电脑->属性->高级系统设置->环境变量->P

2017-02-25 11:21:55 697

原创 MySQL的索引单表优化案例分析

建表建立本次优化案例中所需的数据库及数据表CREATE DATABASE db0206;USE db0206;CREATE TABLE `db0206`.`article`( `id` INT(11) NOT NULL AUTO_INCREMENT, `author_id` INT(11) UNSIGNED NOT NULL, `category_id` INT(11) UNS

2017-02-08 12:13:29 1509

原创 Mysql的七种join

对于SQL的Join,在学习起来可能是比较乱的。我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚。Coding Horror上有一篇文章(实在不清楚为什么Coding Horror也被墙)通过 文氏图 Venn diagrams解释了SQL的Join。建表在这里呢我们先来建立两张有外键关联的张表。CREAT

2017-02-06 21:35:54 3200 3

转载 Java NIO学习笔记

Java NIO学习笔记一 基本概念IO 是主存和外部设备 ( 硬盘、终端和网络等 ) 拷贝数据的过程。 IO 是操作系统的底层功能实现,底层通过 I/O 指令进行完成。 所有语言运行时系统提供执行 I/O 较高级别的工具。在java编程中,标准低版本IO使用流的方式完成I/O操作,所有的I/O都被视为单个的字节流动,称为一个Stream的对象一次移动一个字节。 NIO是在JDK1.4之后出现的

2017-02-03 20:07:16 322

原创 volatile关键字小结

Java 提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程。可以将 volatile 看做一个轻量级的锁,但是又与锁有些不同: 1. 对于多线程,不是一种互斥关系 2. 不能保证变量状态的“原子性操作”在没有用volatile关键字修饰的demo/** * Volatile 关键字:当多线程操作共享数据时,可以保证内存数据的可见性, * 相较于sy

2017-01-23 16:44:39 289

原创 java实现生产者消费者模式

生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,显然生产者和消费者之间必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。

2017-01-23 13:52:22 314

原创 原子变量与CAS算法小结

CAS算法CAS(compare-and-swap)是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问。CAS是一种无锁非阻塞算法的实现。CAS 包含了 3 个操作数: 需要读写的内存值V 进行比较的值A 拟写入的新值B当且仅当V的值等于A时,CAS通过原子方式用新值更新V的值,否则不会执行任何操作。CAS操作过程如下所示CAS算法模

2017-01-22 17:02:54 803

原创 Java开发环境的搭建-JDK的安装

一、下载JDK是个免费的东东,所以不要去百度啥破解版了,直接去官网下载最新版本吧,比较安全, 下载地址 如下图所示 - 点击上图中的圈中部分,之后会下图的部分。 根据你的电脑系统是64位,还是32位选择下载的版本。注意选中Accept License Agreement二、安装过程点击下一步 建议更改路径,我的jdk安装在d盘 新建文件夹 点击确定,之后点击下一步 等待安装jdk

2017-01-22 11:23:09 420

转载 Git问题Everything up-to-date解决

今天push代码的时候遇到了一个小问题,提示『Everything up-to-date』 ,导致不能push代码,说这里解决了记下小记。提交代码遇到『Everything up-to-date』上网查了下,发现中文大多答非所问,少数能解决的并没有阐述原理,所以我写这篇文章记录下。这里先上stackoverflow的回答,基础好的可以看这个。接下来说我自己的理解,出现这个问题的...

2017-01-11 18:00:51 903

转载 HTTP协议详解

本书是介绍怎么编写一个Web服务器,而Web服务器是基于HTTP(HyperText Transfer Protocol)协议实现的,所以要实现一个Web服务器就必须了解HTTP协议,本章主要介绍HTTP协议的相关知识,让我们对HTTP协议有个理性的认识。1.1 HTTP协议简介我们日常生活中经常会使用浏览器访问Web站点,但是大家有思考过在这个过程中到底发生了什么吗?为什么我们在浏览器地址栏上面

2017-01-09 17:51:23 274

原创 Linux上jmeter-server启动失败

Jmeter-server启动失败:Cannot start. Unable to get local host IP address. is a loopback address在Windows下启动Jmeter非常顺利,转到Linux下居然启动失败。根据抛出的异常的信息来看,这个跟ip有关。 不出意料,果然是这个问题。 127.0.0.1 localhost localhost

2017-01-05 16:21:52 7282 1

空空如也

空空如也

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

TA关注的人

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