自定义博客皮肤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)
  • 问答 (1)
  • 收藏
  • 关注

原创 将博客搬至CSDN

很多人都认为 finally 语句块是肯定要执行的,其中也包括一些很有经验的 Java 程序员。可惜并不像大多人所认为的那样,对于这个问题,答案当然是否定的,我们先来看下面这个例子。清单 1. 1 public class Test { 2 public static void main(String[] args) { 3 Syste...

2020-03-26 20:13:50 145

原创 纪要

博客迁移到csdn

2020-03-25 19:41:15 131

原创 Arraylist Vector

ArrayList和Vector都是继承了相同的父类和实现了相同的接口。如下 Java代码  public class Vector<E>      extends AbstractList<E>      implements List<E>, RandomAccess, Cloneable, java.io.Serializ...

2014-01-15 11:46:08 194

原创 进程 线程

线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)地址空间:进程内的一个执行单元;进程至少有一个线程;它们共享进程的地址空间;而进程有自己独立的地址空间;(2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源(3)线程是处理器调度的基本单位,但进程不是.4)二者均可并发执行.进程和线程都是由操作系统所体会的程序运行的基本单元,系统利用该基本单元实...

2014-01-15 11:35:27 106

原创 设计与开发应用服务器--相关技术

服务器的设计与开发涉及到诸多技术和问题,归纳一下大致可以分为以下几种:服务器启动和接收数据过程多线程策略NIO长连接同步与异步配置化支持责任链模式集群与负载均衡数据包设计服务端连接协议客户端连接技术服务器启动和数据请求过程各种服务器所提供的功能和实现机制都不尽相同,但在启动和数据请求这块都长得差不多,遵循固定的一些流程和模式,启动过程一般按...

2013-12-02 18:26:33 107

原创 设计与开发应用服务器--常见模式

设计与开发服务器算是一个技术含量比较高的领域,需要涉及到网络编程、IO、多线程、分布式、性能和可扩展性等较为复杂的技术细节,比起JSP/servlet或SSH框架开发业务系统来说,开发服务器比较偏重于技术一些,许多开发人员会有些束手无措,但却无法避免,比如基于HTTP协议的服务不适用时,或需要提供某种协议的容器时。其实服务器的设计与开发也是有模式可借鉴,只不过没有框架或是书籍来这么一些模式,...

2013-12-02 18:25:26 186

原创 数据拆分

一个大型系统里各个环节中最容易出性能和可用性问题的往往是数据库,因此分布式设计与开发的一个重要领域就是如何让数据层具有可扩展性,数据库的扩展分为Scale Up 和Scale Out,而Scale Up说白了是通过升级服务器配置来完成,因此不在分布式设计的考虑之内。Scale Out是通过增加机器的方式来提升处理能力,一般需要考虑以下两个问题:数据拆分数据库高可用架构数据拆分是最...

2013-12-02 18:22:34 413

原创 几种必须了解的分布式算法

Paxos算法1)问题描述分布式中有这么一个疑难问题,客户端向一个分布式集群的服务端发出一系列更新数据的消息,由于分布式集群中的各个服务端节点是互为同步数据的,所以运行完客户端这系列消息指令后各服务端节点的数据应该是一致的,但由于网络或其他原因,各个服务端节点接收到消息的序列可能不一致,最后导致各节点的数据不一致。举一个实例来说明这个问题,下面是客户端与服务端的结构图:当cli...

2013-12-02 18:07:31 367

原创 java难度大算法

题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。static int[] bits = new int[] { 1, 2, 3, 4, 5 };/** * @param args */public static void main(String[] args) {s...

2013-11-14 13:44:46 168

原创 linux查找替换字符串

1、在vi中使用的查找替换方法利用 :s 命令可以实现字符串的替换。具体的用法包括::s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1:1,$ s/str1/str2/g 用字符...

2013-11-14 09:07:40 120

原创 HBase Metrics机制、架构

HBase MetricsHBase Metrics是一种监控信息实时收集机制。它负责收集的信息有:功能性信息(Compaction Queue、Store Files个数等)JVM使用信息 (Heap Memory 的变化)rpc访问信息借助与Hadoop Metrics同样的方式,向Ganglia汇报。Ganglia is a scalable distrib...

2013-11-13 11:49:24 902

原创 java future模式

Future介绍用过Java并发包的朋友或许对Future (interface) 已经比较熟悉了,其实Future 本身是一种被广泛运用的并发设计模式,可在很大程度上简化需要数据流同步的并发应用开发。 Future模式可以简单的看成是 Proxy 模式 与 Thread-Per-Message 模式 的结合,在Proxy模式中,用一个Proxy来代替真正的目标(Subject)生成,目...

2013-11-11 10:58:12 84

原创 in exists区别及应用

  这两个函数是差不多的,但由于优化方案不同,通常NOT Exists要比NOT IN要快,因为NOT EXISTS可以使用结合算法而NOT IN就不行了,而EXISTS则不如IN快,因为这时候IN可能更多的使用结合算法。    Select * from tableA Where exists(Select * From tableB Where tableB.ID=tableA.ID)...

2013-11-08 19:52:48 86

原创 hadoop体系结构(转)

简介Hadoop Distributed File System(HDFS)是一个运行在商用硬件平台上的分布式文件系统。它和很多现存的分布式文件系统有很多相似之处。当然,和其他的分布式文件系统的区别也是很明显的。HDFS在廉价硬件平台上提供高可靠的文件服务,提供数据访问的高吞吐量,适合那些运行在大数据集上的应用。HDFS并不完全符合POSIX文件系统方面的标准,这是因为HDFS运行环境和P...

2013-11-01 08:47:10 131

原创 memcache原理

Consistent Hashing原理,Consistent Hashing如下所示:首先求出memcached服务器(节点)的哈希值, 并将其配置到0~232的圆(continuum)上。 然后用同样的方法求出存储数据的键的哈希值,并映射到圆上。然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第一个服务器上。 如果超过232仍然找不到服务器,就会保存到第一台memcached服务器...

2013-10-30 20:10:42 85

原创 java 内存区域划分

堆(Heap)和非堆(Non-heap)内存按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,...

2013-10-30 11:39:32 105

原创 dubbo框架

alibaba有好几个分布式框架,主要有:进行远程调用(类似于RMI的这种远程调用)的(dubbo、hsf),jms消息服务(napoli、notify),KV数据库(tair)等。这个框架/工具/产品在实现的时候,都考虑到了容灾,扩展,负载均衡,于是出现一个配置中心(ConfigServer)的东西来解决这些问题。 基本原理如图: 在我们的系统中,经常会有一些跨系统的调用,如在A系统中要调用B系...

2013-10-29 20:58:23 82

原创 Top K

1. 问题描述在大规模数据处理中,常遇到的一类问题是,在海量数据中找出出现频率最高的前K个数,或者从海量数据中找出最大的前K个数,这类问题通常称为“top K”问题,如:在搜索引擎中,统计搜索最热门的10个查询词;在歌曲库中统计下载率最高的前10首歌等等。2. 当前解决方案针对top k类问题,通常比较好的方案是【分治+trie树/hash+小顶堆】,即先将数据集按照hash方法分解...

2013-10-28 15:50:11 101

原创 java线程基础

ConcurrentHashMap是HashMap的线程安全版本,ConcurrentSkipListMap是TreeMap的线程安全版本在HashMap中首先由一个对象数组table是不可避免的,修饰符transient只是表示序列号的时候不被存储而已。size描述的是Map中元素的大小,threshold描述的是达到指定元素个数后需要扩容,loadFactor是扩容因子(loadFac...

2013-10-24 23:06:01 133

原创 java 动态代理 cglib

AOP有三种植入切面的方法:其一是编译期织入,这要求使用特殊的Java编译器,AspectJ是其中的代表者;其二是类装载期织入,而这要求使用特殊的类装载器,AspectJ和AspectWerkz是其中的代表者;其三为动态代理织入,在运行期为目标类添加增强生成子类的方式,Spring AOP采用动态代理织入切面。Spring AOP使用了两种代理机制,一种是基于JDK的动态代理,另一种是基于...

2013-10-24 22:58:02 71

原创 java 字符串split

使用StringTokenizer比使用Spring.split()提高接近一倍的性能。要是用indexOf来逐步查找,性能还能进一步提高25%左右。很显然,越接近底层的方法性能越得到满足。不过,这个只是在于对性能要求高的需求底下才有真正的意义。普通应用,String.split()足以 补充一点:使用String.indexOf()去扫描的时候,如果使用ArrayList或...

2013-10-24 08:23:57 79

原创 java队列

在JDK 5之前LinkedList就已经存在,而且本身实现都是一种双向队列。所以到了JDK 5以后就将LinkedList同时实现Deque接口,这样LinkedList就又属于Queue的一部分了。通常情况下Queue都是靠链表结构实现的,但是链表意味着有一些而外的引用开销,如果是双向链表开销就更大了。所以为了节省内存,一种方式就是使用固定大小的数组来实现队列。在这种情况下队列的大小是...

2013-10-22 13:56:51 65

原创 java线程池

在没有Future之前我们检测一个线程是否执行完毕通常使用Thread.join()或者用一个死循环加状态位来描述线程执行完毕。现在有了更好的方法能够阻塞线程,检测任务执行完毕甚至取消执行中或者未开始执行的任务。newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会...

2013-10-22 13:56:31 64

原创 linux权限

从左至右,第一位数字代表文件所有者的权限,第二位数字代表同组用户的权限,第三位数字代表其他用户的权限。 而具体的权限是由数字来表示的,读取的权限等于4,用r表示;写入的权限等于2,用w表示;执行的权限等于1,用x表示; 通过4、2、1的组合,得到以下几种权限:0(没有权限);4(读取权限);5(4+1 | 读取+执行);6(4+2 | 读取+写入);7(4+2+1 | 读取+写入...

2013-10-18 18:31:12 72

原创 java线程间通信

进程间通信的方法主要有以下几种:  (1)管道(Pipe):管道可用于具有亲缘关系进程间的通信,允许一个进程和另一个与它有共同祖先的进程之间进行通信。  (2)命名管道(named pipe):命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关 系 进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。  (3...

2013-10-18 00:24:20 499

原创 mina架构

本文以mina 2.0.7为基础,记录mina nio网络接口的内部结构及消息流。Java代码  public static void main(String[] args) {          SocketAcceptor acceptor = new NioSocketAcceptor();          acceptor.getFilterChain(...

2013-10-17 23:54:09 175

原创 spring mvc PK struts2

Spring MVC PK Struts2 我们用struts2时采用的传统的配置文件的方式,并没有使用传说中的0配置。spring3 mvc可以认为已经100%零配置了(除了配置spring mvc-servlet.xml外)。Spring MVC和Struts2的区别:1. 机制:spring mvc的入口是servlet,而struts2是filter(这里要指出,filt...

2013-10-17 22:58:10 82

原创 java LRU实现

LRU缓存:LRU缓存利用了这样的一种思想。LRU是Least Recently Used 的缩写,翻译过来就是“最近最少使用”,也就是说,LRU缓存把最近最少使用的数据移除,让给最新读取的数据。而往往最常读取的,也是读取次数最多的,所以,利用LRU缓存,我们能够提高系统的performance.实现:要实现LRU缓存,我们首先要用到一个类 LinkedHashMap。 用这个类有...

2013-10-17 16:26:38 230

原创 zkClient

直接使用zk的api实现业务功能比较繁琐。因为要处理session loss,session expire等异常,在发生这些异常后进行重连。又因为ZK的watcher是一次性的,如果要基于wather实现发布/订阅模式,还要自己包装一下,将一次性订阅包装成持久订阅。另外如果要使用抽象级别更高的功能,比如分布式锁,leader选举等,还要自己额外做很多事情。这里介绍下ZK的第三方客户端包装小工具,...

2013-10-17 12:44:01 78

原创 spring中的线程池

多线程并发处理起来通常比较麻烦,如果你使用spring容器来管理业务bean,事情就好办了多了。spring封装了java的多线程的实现,你只需要关注于并发事物的流程以及一些并发负载量等特性,具体来说如何使用spring来处理并发事务: 1.了解 TaskExecutor接口Spring的TaskExecutor接口等同于java.util.concurrent.Executor接口...

2013-10-17 11:24:02 96

原创 java泛型

Java泛型(generics)是JDK 5中引入的一个新特性,允许在定义类和接口的时候使用类型参数(type parameter)。声明的类型参数在使用时用具体的类型来替换。泛型最主要的应用是在JDK 5中的新集合类框架中。对于泛型概念的引入,开发社区的观点是褒贬不一。从好的方面来说,泛型的引入可以解决之前的集合类框架在使用过程中通常会出现的运行时刻类型错误,因为编译器可以在编译时刻就发现很多...

2013-10-15 19:49:37 45

原创 LVS+Keepalived

LVS+Keepalived 介绍LVSLVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。目前有三种IP负载均衡技术(VS/NAT、VS/TUN和VS/DR);十种调度算法(rrr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq)。Kee...

2013-10-15 19:31:18 68

原创 负载均衡算法

分类:  平衡算法设计的好坏直接决定了集群在负载均衡上的表现,设计不好的算法,会导致集群的负载失衡。一般的平衡算法主要任务是决定如何选择下一个集群节点,然后将新的服务请求转发给它。有些简单平衡方法可以独立使用,有些必须和其它简单或高级方法组合使用。而一个好的负载均衡算法也并不是万能的,它一般只在某些特殊的应用环境下才能发挥最大效用。因此在考察负载均衡算法的同时,也要注意算法本...

2013-10-15 19:26:08 97

原创 shell样例

按ip统计访问日志top 命令1: Shell代码  time awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -5                             78129 192.168.13.166    75165 192.168.12.52    58657 192....

2013-10-15 18:32:33 102

原创 struts2异常日志记录

struts2配合log4j打印异常栈信息关于配置struts2全局异常后控制台无法打印异常信息问题[html] view plaincopy <global-results>        <result name="error">/exception/error.jsp</result>    </glob...

2013-10-14 20:40:22 387

原创 Hadoop MapTask / ReducerTask

学习MapTask的内部实现。                   整体执行流程           如上图示,MapTask的整个处理流程分五个阶段:          ●read阶段:通过RecordReader从InputSplit分片中将数据解析成一个个key/value。          ●map阶段:将由RecordReader解析出的key/value交给map()方法处理,并生...

2013-10-14 08:03:27 139

原创 hadoop作业提交 初始化

下面我们来熟悉一下MapReduce作业的提交和初始化的过程:          作业的提交过程         第一步,使用Hadoop提供的shell命令提交作业,命令行作业提交命令:Java代码  $HADOOP_HOME/bin/hadoop jar job.jar \      -D mapred.job.name="task-test" \      ...

2013-10-14 07:52:23 151

原创 HDFS读写 DataNode NameNode

HDFSHDFS client 分析客户端的功能今天开始分析HDFS源代码,首先从HDFS的client端分析。对于分布式文件系统,Client端的功能,就是接收用户的请求,通过网络,与 NameNode 和 DataNode交互。首先确定的是,client端是一个hdfs提供的lib库,用户的应用程序需要包含该库,调用该库提供的函数来访问NameNode和DataNode...

2013-10-13 23:45:02 271

原创 zookeeper应用场景

Zookeeper的主流应用场景实现思路(除去官方示例) (1)配置管理集中式的配置管理在应用集群中是非常常见的,一般商业公司内部都会实现一套集中的配置管理中心,应对不同的应用集群对于共享各自配置的需求,并且在配置变更时能够通知到集群中的每一个机器。Zookeeper很容易实现这种集中式的配置管理,比如将APP1的所有配置配置到/APP1 znode下,APP1所有机器一启动就对/APP1这个节...

2013-10-13 23:12:59 171

原创 Mysql 存储引擎中InnoDB与MyISAM的主要区别

1, 事务处理innodb 支持事务功能,myisam 不支持。Myisam 的执行速度更快,性能更好。 2,select ,update ,insert ,delete 操作MyISAM:如果执行大量的SELECT,MyISAM是更好的选择InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表 3,...

2013-10-13 18:57:22 77

空空如也

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

TA关注的人

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