自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(47)
  • 收藏
  • 关注

转载 一行JAVA代码

一、写在前面 写这篇文章主要是为了记录和分析前段时间对JVM的一些学习成果,虽然最近事情有点多,但是为了防止过段时间忘记了又要花一些时间去学习,所以还是决定抽出一些时间把已经获得的知识沉淀下来。再声明一点本文是基于JDK7的,其他版本不在本文的讨论范围之内。 二、一行JAVA代码 大家注...

2018-11-11 10:48:00 465

转载 论“锁”的基本实现

真正的、绝对的、数学意义上的时间,就其自身及其自身的自然属性而言,总是平稳平静地流动着,而与外界任何事物无关。——牛顿 同步与互斥 术语“同步”在不同的上下文之中有不同的具体含义,比如同步IO与异步IO中的“同步”指的是用户线程与内核线程之间的协作形式,而java Synchronize...

2017-07-09 12:47:00 381

转载 从"耦合"角度看异步交互模式

核心概念 耦合:产生依赖关系即耦合,关系越强,耦合越强。 交互:可以理解为不同实体之间的“互动”或“通信”。 实体:这里的实体可能是不同的领域、不同的分布式部署的应用、不同的进程、不同的线程等任何、但是你一定是可以描述他们之间的边界的。 耦合表面积:各方面耦合的总和。 同步...

2017-05-21 23:18:00 759

转载 我所理解的2PC和3PC

背景 本地事务通过ACID特性能够很好地解决原子性、一致性以及隔离性问题,然而当今大部分的软件架构对系统都有扩展的诉求,系统扩展引发了资源的分布,分布的资源可以很好地支持系统的可伸缩性,但是也同时带来分布式一致性问题,避免太过抽象,我们可以通过一个场景理解这个问题:一个完整的业务流程(全局...

2017-03-25 18:04:00 332

转载 缓存级别与缓存更新问题

There are only two hard things in Computer Science: cache invalidation and naming things. -- Phil Karlton 缓存失效问题被认为是计算机科学中最难的两件事之一,这篇文章来自翻译,内容主要包...

2017-03-19 18:06:00 717

转载 MySQL统计信息

摘要 我们将一条查询SQL提交给MySQL之后,MySQL在进行真正的查询操作之前通常会经历两个阶段:SQL解析和查询优化。在SQL解析过程中,MySQL会将SQL解析为一个树状结构,而在查询优化阶段,MySQL会决定以什么方式进行查询,那么MySQL以什么方式进行查询的抉择依据是什么呢?...

2017-02-19 22:06:00 296

转载 MySQL线程池内幕

摘要 在MySQL中,线程池指的是用来管理处理MySQL客户端连接任务的线程的一种机制,我厂用的percona版本已经是集成了线程池,只需要通过如下参数开启即可。 thread_handling=pool-of-threads 本文在介绍MySQL线程池核心参数的基础之上对线程池内部实...

2017-01-07 17:11:00 143

转载 关于InnoDB Double Write

Double Write解决什么问题 Double Write是InnoDB存储引擎关键特性之一,解决的是InnoDB存储引擎的可靠性问题。 页 页是InnoDB存储引起的最小存储单位,固定大小通常为16KB,InnoDB中最常见的页有两种类型:索引页(index page)和und...

2016-12-18 23:53:00 126

转载 一致性非锁定读与一致性锁定读

背景 innodb存储引擎实现了两种标准的行级锁:S锁和X锁,S锁被称为共享锁,允许事务读一行数据,X锁被称为排它锁,允许事务删除或更新一行数据。 一致性非锁定读指的是如果一条记录被加了X锁,其他事务还能读取这条记录。 一致性锁定读指的是一个事务可以通过SELECT语句给某条记录加X锁...

2016-12-12 00:17:00 186

转载 Log4j日志体系结构

摘要 我们在写日志的时候首先要获取logger,在每一个使用log4j的项目都有很多个地方要获取logger,这些logger是真实的被实例化的Logger对象,他们有可能被分散在无数不同的类中,日志体系结构讲的是这些logger对象是如何组织的,他们之间又有什么样的关系。 体系...

2016-11-27 00:16:00 183

转载 一个小栗子聊聊JAVA泛型基础

背景 周五本该是愉快的,可是今天花了一个早上查问题,为什么要花一个早上?我把原因总结为两点: 日志信息严重丢失,茫茫代码毫无头绪。 对泛型的认识不够,导致代码出现了BUG。 第一个原因可以通过以后编码谨慎的打日志来解决,我们今天主要来一起回顾下JAVA泛型基础。 一个...

2016-11-26 00:28:00 119

转载 Redis内存淘汰机制

摘要 Redis是一款优秀的、开源的内存数据库,我在阅读Redis源码实现的过程中,时时刻刻能感受到Redis作者为更好地使用内存而费尽各种心思,例如最明显的是对于同一种数据结构在不同应用场景下提供了基于不同底层编码的实现(如压缩列表、跳跃表等)。今天我们暂时放下对Redis不同数据结构的...

2016-09-03 18:16:00 519

转载 Redis压缩列表原理与应用分析

摘要 Redis是一款著名的key-value内存数据库软件,同时也是一款卓越的数据结构服务软件。它支持字符串、列表、哈希表、集合、有序集合五种数据结构类型,同时每种数据结构类型针对不同的应用场景又支持不同的编码方式。这篇文章主要介绍压缩列表编码,在理解压缩列表编码原理的基础上介绍Redi...

2016-07-20 23:13:00 268

转载 Redis Cluster分区实现原理

摘要 Redis Cluster本身提供了自动将数据分散到Redis Cluster不同节点的能力,分区实现的关键点问题包括:如何将数据自动地打散到不同的节点,使得不同节点的存储数据相对均匀;如何保证客户端能够访问到正确的节点和数据;如何保证重新分片的过程中不影响正常服务。这篇文章通...

2016-07-02 00:51:00 351

转载 Redis异步化组件模型

摘要 Redis对客户端的IO事件处理是由主线程串行执行的,除了IO事件之外,这个线程还负责过期键的处理、复制协调、集群协调等等,这些除了IO事件之外的逻辑会被封装成周期性的任务由主线程周期性的处理,对于一些没有必要放在主线程的逻辑,由Redis封装成异步任务交给异步线程来处理,这篇文章主...

2016-06-18 23:55:00 108

转载 聊聊线程技术与线程实现模型

摘要 做多线程应用开发,对于线程的理解是非常重要的,我们要为我们创建的每一个线程负责。这篇文章主要聊聊操作系统线程相关的主题,在了解线程定义、用户态与内核态、模态切换、线程上下文切换的基础之上再对常见的三种线程模型进行进一步介绍,希望对大家能够有所帮助。 线程概论 线程定义 ...

2016-06-10 01:23:00 117

转载 【译】Redis Cluster官方教程

概要 这篇文章主要介绍redis cluster可用性和一致性相关的特性,值得一提的是,redis cluster需要高于等于redis3.0版本。 Redis Cluster 101 Redis Cluster提供了一种数据自动分片到不同Redis实例中的解决方案,Redis Cl...

2016-06-04 15:43:00 140

转载 Redis复制实现原理

摘要 我的前一篇文章《浅析Redis复制》已经介绍了Redis复制相关特性,这篇文章主要在理解Redis复制相关源码的基础之上介绍Redis复制的实现原理。 Redis复制实现原理 应用场景化 为了更好地表达与理解,我们先举个实际应用场景例子来看看Redis复制是怎么工作的,我们...

2016-06-04 01:02:00 121

转载 浅析Redis复制

摘要 早期的RDBMS被设计为运行在单个CPU之上,读写操作都由经单个数据库实例完成,复制技术使得数据库的读写操作可以分散在运行于不同CPU之上的独立服务器上,Redis作为一个开源的、优秀的key-value缓存及持久化存储解决方案,也提供了复制功能,本文主要介绍Redis的复制原理及特...

2016-05-29 15:36:00 299

转载 Redis缓存失效机制

Redis缓存失效的故事要从EXPIRE这个命令说起,EXPIRE允许用户为某个key指定超时时间,当超过这个时间之后key对应的值会被清除,这篇文章主要在分析Redis源码的基础上站在Redis设计者的角度去思考Redis缓存失效的相关问题。 Redis缓存失效机制 Redis缓...

2016-05-22 00:45:00 975

转载 Redis网络架构及单线程模型

最近略有闲暇时间,于是对Redis进行了一些学习,学习途径除了官方文档还有Redis源代码,我看的版本是2.8.13,Redis源码总行数不到5W行,不同组件拆分非常细致,阅读起来也很清晰。这篇博客主要介绍我对Redis网络层架构以及线程模型的一些了解,希望能对大家有所帮助。 Red...

2016-05-20 22:51:00 583

转载 基于Redis实现简单的分布式锁

摘要 分布式锁在很多应用场景下是非常有效的手段,比如当运行在多个机器上的不同进程需要访问同一个竞争资源的时候,那么就会涉及到进程对资源的加锁和释放,这样才能保证数据的安全访问。分布式锁实现的方案有很多,比如基于ZooKeeper实现、或者基于Mysql实现等等,今天我们来一起看看如何基于R...

2016-05-18 23:56:00 95

转载 Redis分区实现原理

摘要 Redis Partitioning即Redis分区,简单的说就是将数据分布到不同的redis实例中,因此对于每个redis实例所存储的内容仅仅是所有内容的一个子集。分区(Partitioning)不仅仅是Redis中的概念,几乎是所有数据存储系统都会涉及到的概念,这篇文章将会在理解...

2016-05-16 23:45:00 784

转载 Redis字符串类型实现内幕

摘要 Redis不仅仅是一个key-value存储,它更是一个数据结构服务,支持不同类型的值。这意味着在传统的key-value存储中,我们用string的key关联string的value。而在Redis中,我们可以存储的值不受限于string,我们还可以存储复杂的数据结构。string...

2016-05-15 22:51:00 202

转载 memcached分布式实现原理

摘要 在高并发环境下,大量的读、写请求涌向数据库,此时磁盘IO将成为瓶颈,从而导致过高的响应延迟,因此缓存应运而生。无论是单机缓存还是分布式缓存都有其适应场景和优缺点,当今存在的缓存产品也是数不胜数,最常见的有redis和memcached等,既然是分布式,那么他们是怎么实现分布式的呢?本...

2016-05-08 11:00:00 198

转载 【译】可以不要再使用Double-Checked Locking了

Double-Checked Locking方法被广泛的使用于实现多线程环境下单例模式的懒加载方式实现,不幸的是,在JAVA中,这种方式有可能不能够正常工作。在其他语言环境中,如C++,依赖于处理器的内存模型、编译器的重排序以及编译器和同步库之间的工作方式。由于这些问题在C++中并不确定,因此...

2016-05-03 01:00:00 369

转载 更好地理解与使用Future

一个多月没有写东西了,今天想写的也是想记录下来的一些学习及思考结果,记忆能力有限,避免时间长久就忘记了,今天想写的也还是一些基础的东西,为什么我总是关注这些平时码业务代码很少能用到的又比较基础东西呢,主要是因为我觉得可能光写简单的业务代码可能很少有机会会遇到难题,但是也有万一,万一遇到了怎么解...

2016-05-02 01:41:00 106

转载 扒一扒ReentrantLock以及AQS实现原理

摘要 提到JAVA加锁,我们通常会想到synchronized关键字或者是Java Concurrent Util(后面简称JCU)包下面的Lock,今天就来扒一扒Lock是如何实现的,比如我们可以先提出一些问题:当我们通实例化一个ReentrantLock并且调用它的lock或unlock...

2016-04-03 11:45:00 1183

转载 更好的使用JAVA线程池

这篇文章结合Doug Lea大神在JDK1.5提供的JCU包,分别从线程池大小参数的设置、工作线程的创建、空闲线程的回收、阻塞队列的使用、任务拒绝策略、线程池Hook等方面来了解线程池的使用,其中涉及到一些细节包括不同参数、不同队列、不同拒绝策略的选择、产生的影响和行为、为更好的使用线程池...

2016-03-27 15:02:00 121

转载 基准测试之构建性能模型

序 基准测试业务逻辑是非常困难的,很多时候基准测试是基于时间来衡量的,很多人认为这些时间很容易得到,并且认为获取系统时间的消耗很微不足道,我们可以基于获取系统的时间来测量任何我们想测量的东西。这边文章我们来探索一些上面的这些误区。 这篇文章会涉及到基准测试方法论,如果你还没有了解JMH的话...

2016-03-19 21:04:00 286

转载 Netty精粹之玩转NIO缓冲区

在JAVA NIO相关的组件中,ByteBuffer是除了Selector、Channel之外的另一个很重要的组件,它是直接和Channel打交道的缓冲区,通常场景或是从ByteBuffer写入Channel,或是从Channel读入Buffer;而在Netty中,被精心设计的ByteBuf则...

2016-03-13 19:21:00 157

转载 MySQL数据库复制概论

每当我们讨论一项(新的)领域技术的时候,最好的方式通常是首先抛出一些问题,这些问题大致分为三类:诶?这项技术又是什么玩意(What)?这项技术为什么会存在?我们已经有那么多解决方案(Method)了,我们问什么要用它(Why)?如果这项技术那么好且我们正好有场景可以用到这项技术,且能使我们的系...

2016-03-05 22:04:00 353

转载 Netty精粹之TCP粘包拆包问题

粘包拆包问题是处于网络比较底层的问题,在数据链路层、网络层以及传输层都有可能发生。我们日常的网络应用开发大都在传输层进行,由于UDP有消息保护边界,不会发生这个问题,因此这篇文章只讨论发生在传输层的TCP粘包拆包问题。 什么是粘包、拆包? 对于什么是粘包、拆包问题,我想先举两个简单的应...

2016-02-27 23:14:00 306

转载 Netty精粹之基于EventLoop机制的高效线程模型

Infoq有篇文章提到通过Netty4+Thrift压缩二进制编码技术有人实现了10W TPS(1K的复杂POJO对象)跨节点远程服务调用,对于RPC应用来说高性能的三个主题永远是IO模型、数据协议、线程模型,10W TPS的测试结果一方面归功于Thrift方面压缩二进制编码技术的高效(这里有...

2016-02-21 13:04:00 194

转载 Netty精粹之轻量级内存池技术实现原理与应用

在Netty中,通常会有多个IO线程独立工作,基于NioEventLoop的实现,每个IO线程负责轮询单独的Selector实例来检索IO事件,当IO事件来临的时候,IO线程开始处理IO事件。最常见的IO事件即读写事件,那么这个时候就会涉及到IO线程对数据的读写问题,具体到NIO方面即从内核缓...

2016-02-12 19:17:00 237

转载 Netty精粹之设计更快的ThreadLocal

Netty是一款优秀的开源的NIO框架,其异步的、基于IO事件驱动的设计以及简易使用的API使得用户快速构建基于NIO的高性能高可靠性的网络服务器成为可能。Netty除了使用Reactor设计模式加上精心设计的线程模型之外,对于线程创建的具体细节也进行了重新设计,由于Netty的应用场景主要面...

2016-02-09 17:18:00 188

转载 Netty精粹之JAVA NIO开发需要知道的

学习Netty框架以及相关源码也有一小段时间了,恰逢今天除夕,写篇文章总结一下。Netty是个高效的JAVA NIO框架,总体框架基于异步非阻塞的设计,基于网络IO事件驱动,主要贡献在于可以让用户基于Netty提供的API快速开发高性能、高可靠性的网络应用。这篇文章主要是介绍Netty框架的基...

2016-02-07 22:52:00 153

转载 基于JAVA的Promise模式实现

Promise模式是一种异步编程模式,即我们可以先开始一个任务,拿到这个任务的凭据而并不需要立即得到这个任务的执行结果才继续往下执行,我们拿着这个凭证可以在之后任何需要的时候去兑换结果。这篇文章主要介绍一种基于JAVA的Promise模式实现并结合一些例子。 原始实现 为了能够让大家对...

2016-01-23 23:23:00 721

转载 [译]RabbitMQ系列教程(一):Hello World

RabbitMQ是一个消息中间件。基本思想非常简单:接收和转发消息。你可以把它想象成一个邮局:当我们往邮箱里面投递一个信件的时候,我们非常确信邮政快递员能够把我们的邮件送达到接受者的手中。使用这个隐喻,RabbitMQ是一个邮箱,是一个邮政局,是一个邮政快递员。 与传统的邮政局不同的是,Ra...

2016-01-19 23:17:00 106

转载 源码解析线程池调度器之任务延迟调度实现机制

调度线程执行器ScheduledThreadPoolExecutor是线程执行器ThreadPoolExecutor的扩展,在ThreadPoolExecutor基础之上添加了在一定时间间隔之后调度任务的核心功能,也包括之后的按既定时间间隔去调度任务的功能。同时ScheduledThreadP...

2016-01-17 01:17:00 316

空空如也

空空如也

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

TA关注的人

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