自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

义臻的博客

知乎ID:义臻

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

原创 Mysql高性能索引的策略

Mysql的explain命令:explain命令显示了mysql如何使用索引来执行select查询语句,可以帮助写出更好的索引和更优化的查询语句。看示例如下:结果如下:explain列的解释:table:显示这一行的数据是关于哪张表的type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、index和all。显示index说明使用索引...

2016-08-11 14:17:26 635

原创 大型网站架构要素及常用手段

“一般来说,设计网站的架构。除了关注功能需求以外,还需要关注性能,可用性,伸缩性,扩展性,安全性。”性能:网站对并发请求的处理能力,有很多衡量指标,比如QPS,响应时间等。可用性:1-网站不能对外提供服务的概率,通常用几个9来衡量。伸缩性:网站能否通过添加硬件资源来提高处理能力。扩展性:网站能否在不改变原有架构的基础上添加新功能。安全性:你懂的。其中,伸缩性和扩展性经常被大家混淆。

2016-08-11 14:13:15 366

原创 Spring事务处理-ThreadLocal的使用

经历了几天的研究,终于是明白了ThreadLocal在Spring事务管理过程中发挥的用途。下面就以图文的形式和大家分享,如有错误,欢迎指正。大家都知道,Spring允许以声明的方式进行事务管理。通过声明的方式,程序员可以仅仅专注于业务代码,事务管理由Spring框架代为进行。以JDBC为例,正常的事务代码可能如下:dbc = new DataBaseConnection();//第1行...

2016-08-11 14:11:32 4479

原创 JVM-体系结构

大家都知道,java号称一次编译,处处运行。之所以能够这么强大,jvm功不可没。直接上图:笔者看过这张图很多次,一直没能理解。一直到最近,觉得能够明白到写博客了。一个java文件通过编译可以得到class文件,class文件就是java虚拟机能够执行的二进制文件。而程序在运行的时候,需要在内存中有数据空间。在jvm中,这个数据空间叫做运行时数据区。运行时数据区,一共有5类空间,分别是:方法区,

2016-08-11 14:09:49 389

原创 JAVA并发-内置锁和ThreadLocal

上一篇博客讲过,当多个线程访问共享的可变变量的时候,可以使用锁来进行线程同步。那么如果线程安全性存在的3个前提条件不同时存在的话,自然就不需要考虑线程安全性了。或者说如果我们能够将某个共享变量变为局部变量,那么自然线程安全性问题就不存在了。我们把“诸如将全局变量变为局部变量”这种将某个对象封闭在一个线程中的技术称为线程封闭,在《JAVA并发编程实践》中是这样说的,这么说有一定道理。但我还是想说说...

2016-08-11 14:08:48 1288

原创 MySQL计数器表

在Web开发中经常会遇到需要计数器表的场景,如果将计数器保存在表中,在操作表时可能会遇到并发问题。因此,通常的做法是为计数器单独建立一个表,在写入操作时通过事务在处理业务表的同时处理计数器。        比如一个典型的场景:记录新闻的浏览量。这个场景的表结构可能如下所示:create table article( article_id int unsigned auto_increment p...

2016-08-30 18:50:46 2318

原创 mybatis自动切换多个数据源

假设现在有两个数据库myone和mytwo,读者可以理解为一个写库,一个读库,数据库中都各自有一个表,表的格式都一样,如下:------------------------------------------------------------id int(11) PRI auto_incrementusername varchar(20)password varchar(2...

2016-08-11 14:17:17 7882 1

原创 mybatis是如何防止SQL注入的

SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见。究其原因不外乎:No patch for stupid。为什么这么说,下面就以JAVA为例进行说明:假设数据库中存在这样的表:table user(id varchar(20) PRIMARY KEY , name varchar(20) ,age varchar(20) ); ...

2016-08-11 14:17:06 32306 8

原创 JAVA的四种引用类型

Java四种引用类型1.引用的基本概念强引用:当我们使用new创建对象时,被创建的对象就是强引用,如Object object = new Object(),其中的object就是一个强引用了。如果一个对象具有强引用,JVM就不会去GC它,JVM宁可会报OOM来终止程序,也不回收该对象。软引用: 如果一个对象只具备软引用,如果内存空间足够,那么JVM就不会GC它,如果内存空间不足了,就会GC该对象...

2016-08-11 14:16:54 6499

原创 sed简明用法

本文旨在帮助sed新手快速熟悉sed的常见用法。首先,用如下文件作为源文件pets.txt:This is my cat my cat's name is bettyThis is my dog my dog's name is frankThis is my fish my fish's name is georgeThis is my goat my

2016-08-11 14:16:46 1121

原创 awk简明用法

这几天在写数据库脚本,需要频繁的处理字符文件,笔者之前都是用java程序处理字符文件,结果看到同事用awk几秒钟就搞定了一个处理,觉得太牛逼了,于是花时间学习了下。本文旨在帮助awk新手快速熟悉awk的常见用法,笔者会尽量把文章写得像清纯的女神一样撩起你的兴趣,不过最终还得你花力气自己撸。首先,我们使用netstat的输出作为源文件:netstat -ano >> netstat.t

2016-08-11 14:16:37 1027

原创 tomct处理请求的流程

在讲项目之前,先讲解一些基础知识。1. HTTP请求格式,一个HTTP请求包括以下三个部分:请求方法(POST,GET等) URI 协议版本请求头部请求实体举例如下:POST /examples/default.jsp HTTP/1.1 Accept: text/plain; text/html Accept-Language: en-gb Connection: Keep

2016-08-11 14:16:27 1418

原创 JUC之AQS

AQS是同步框架,它进行两个方面的工作:资源的管理和资源申请者的管理。对应由两部分组成:一个volatile int state(代表共享资源)和一个FIFO线程等待队列(多线程争用资源被阻塞时会进入此队列)。state的访问方式有三种: getState() setState() compareAndSetState()AQS定义两种资源共享方式:Exclusive(独占,只有

2016-08-11 14:16:18 938

原创 JUC之CAS

JUC是java.util.concurrent包的简称,该包提供了并发编程的解决方案(当然,JAVA并发编程的解决方案还有synchronized)。从概括的层面来说,JUC包有两大核心:CAS和AQS。其中CAS是java.util.concurrent.atomic包的基础,AQS是java.util.concurrent.locks包以及一些常用类比如Semophore等类的基础。我们先来

2016-08-11 14:16:09 1326

原创 理解OAuth2.0

1. 为了理解OAuth的适用场合,让我举一个假设的例子。有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来。用户为了使用该服务,必须让"云冲印"能够读取用户自己储存在Google上的照片。如何让云冲印能够访问位于Google上的照片呢?传统方法是,用户将自己的Google用户名和密码,告诉"云冲印",后者就可以读取用户的照片了。这样的做法有很多的缺点,比如:a) 云冲印

2016-08-11 14:15:58 1009

原创 JAVA并发-线程状态和线程组

在Java中,线程有6种基本状态,理解这6种基本状态之间的关系可以让我们对多线程有更好的理解.如下图所示:在Java中,所有的线程都存在于线程组中,每个线程组中可以包含多个线程或者线程组.运行下面的程序,从结果中可以看出默认的线程组层次结构.system是Java中的根线程组.从system开始,有一层层的线程和线程组.类似目录结构./** * Java线程组的结构,见运行结果

2016-08-11 14:15:51 480

原创 一名3年工作经验的程序员应该具备的技能

http://www.cnblogs.com/xrq730/p/5260294.html

2016-08-11 14:15:43 759

原创 使用Junit4和JMockit进行单元测试

首先介绍下在Idea中如何安装Juni插件:1. 安装JUnitGenerator V2.0在idea中,打开File-Setting-Plugins,在右侧弹出的搜索框中搜索JUnitGenerator V2.0,安装之后重启idea。2. 设置JUnitGenerator V2.0的属性在idea中,打开File-Setting-Other Settings-JUnitGeneratora) ...

2016-08-11 14:15:34 8614

原创 JAVA并发-条件队列

在JVM系列博客http://yizhenn.iteye.com/blog/2290864中讲过,Java语言的同步机制在底层实现上只有两种手段:"互斥"和"协同".体现在Java语言层面上,就是内置锁和内置条件队列.内置锁即synchronized,这个相关的博客有很多,不再多讲.内置条件队列这个词大家或许没有听过,他指的是Object.wait(),Object.notify(),Object...

2016-08-11 14:15:25 2964

原创 JAVA并发-中断处理和任务取消

中断处理在java程序中,当使用Thread.sleep()或者BlockingQueue.take()等阻塞方法时,需要处理InterruptedException。对于这种异常,通常有2种方案进行处理。1. 传递异常:将异常传递给方法的调用者。示例如下:BlockingQueue queue;public String getNextString() throws Interrupt

2016-08-11 14:15:16 623

原创 计算机中的随机数

随机数的性质从弱到强分为3类:1. 随机性2. 不可预测性3. 不可重现性在上面的三个性质中,越往下就越严格。具备随机性,不代表一定具备不可预测性;具备不可预测性,不代表一定具备不可重现性;但如果具备不可重现性,一定具备随机性和不可预测性。满足上面的3性依次对应着:弱伪随机数,强伪随机数,真随机数。在计算机中,用软件生成的随机数都是伪随机数,即弱伪随机数和强伪随机数。由于弱伪随机数不

2016-08-11 14:15:05 1172

原创 基于SSL的HTTPS协议

Http协议是常用的传输层协议,但有些时候我们需要更加安全的http协议,即Https协议。Https协议与Http协议的区别在于:Https协议在Http与传输层之间添加了一个用于加密的SSL(安全套接层)。首先来分析下,一个信息想在网络中安全的传输,需要能够做到一下几点:1. 防偷听(你在购物网站上填写你的银行卡密码,肯定不希望这个密码北其他人知道)2. 防篡改(你在付款时,想某东转账

2016-08-11 14:14:55 792

原创 JAVA并发-显式锁(二)

在上一篇博客《JAVA并发-显式锁(一)》中介绍了Lock和ReadWriteLock的基本用法,下面来看看如何使用Lock的tryLock()方法来避免死锁。在博客《JAVA并发-3种典型的死锁》中有一个动态的锁顺序死锁。我们使用System.identifyHashCode()来固定线程获取锁的顺序,从而解决了死锁问题。学习了Lock之后,可以使用tryLock()来解决动态的锁顺序死锁问题。...

2016-08-11 14:14:43 374

原创 JAVA并发-显式锁(一)

JAVA语言除了提供内置锁synchronized,还在JDK6之后提供了高级的显式锁Lock作为功能上的补充。在大多数情况下,内置锁都能很好的工作,我们也尽量使用内置锁。但必须承认的是,内置锁存在一些局限性。比如:无法中断一个正在等待获取锁的线程;无法在请求一个锁时无限等待下去;无法实现非阻塞的加锁规则。当程序中需要这些高级的功能时,考虑使用显式锁。我们来介绍2种显示锁,Lock和ReadWri...

2016-08-11 14:14:33 283

原创 JAVA并发-减少锁的竞争

降低锁的竞争可以提高并发程序的性能和可伸缩性,有3种方式可以降低锁的竞争:1. 减少锁的持有时间(缩小锁的范围)2. 降低锁的请求频率(降低锁的粒度)3. 放弃使用独占锁,使用并发容器,原子变量,读写锁等等来代替它。减少锁的持有时间(减小锁的范围):减少锁的持有时间实际上就是减小锁的控制范围,将一些并不需要锁的操作从同步代码块中移除。如下所示,需要进行同步操作的只有attributes.get(k...

2016-08-11 14:14:24 267

原创 JAVA并发-3种典型的死锁

在JAVA并发编程中,我们使用锁来确保可变共享变量的安全性。要注意的是,不正确的使用锁很容易导致死锁。死锁的4个必要条件:1. 互斥访问2. 非抢占3. 持有并等待4. 循环等待在JAVA编程中,有3种典型的死锁类型:静态的锁顺序死锁,动态的锁顺序死锁,协作对象之间发生的死锁。静态的锁顺序死锁:a和b两个方法都需要获得A锁和B锁。一个线程执行a方法且已经获得了A锁,在等待B锁;另一个线...

2016-08-11 14:14:16 1869

原创 JAVA并发-ThreadPoolExecutor线程池的使用

在博客JAVA并发-Executor任务执行框架中曾说过,Executors有4种工厂方法,即newFixedThreadPool,newCachedThreadPool,newSingleThreadExecutor,newScheduledThreadPool。这些工厂方法其实都是创建了一些不同执行策略的ThreadPoolExecutor。我们可以创建自定义执行策略的ThreadPool

2016-08-11 14:14:07 879

原创 JAVA并发-Executor任务执行框架

首先介绍两个重要的接口,Executor和ExecutorService,定义如下:public interface Executor { void execute(Runnable command);}public interface ExecutorService extends Executor { //不再接受新任务,待所有任务执行完毕后关闭Executor

2016-08-11 14:13:57 466

原创 大型网站架构之JAVA中间件

中间件就是在大型网站中,帮助各子模块间实现互相访问,消息共享或统一访问等功能的软件产品。常见的有:远程服务框架中间件:主要解决各子模块之间互相访问的问题。消息队列中间件:主要解决各子模之间消息共享的问题。数据访问中间件:用于简化应用层对数据层的访问。关于远程服务框架中间件,国内目前较多应用的是阿里巴巴的开源分布式服务框架Dubbo。其原理如图:消息队列中间件是一种EDA架构(eve

2016-08-11 14:13:48 3644

原创 大型网站架构之分布式缓存

缓存是优化网站性能的第一手段。在大型网站中,缓存通常用来保存热点数据,或者保存应用上下文相关信息。比如之前提到的session服务器集群就可以用分布式缓存来搭建。当然,分布式缓存还可用于缓存数据库中的热点数据以减轻数据库的压力。分布式缓存的架构方式通常有两种:一种是以JBoss为代表的需要同步的分布式缓存,一种是一MemCached为代表的不互相通信的分布式缓存。JBoss在所有服务器中保

2016-08-11 14:13:41 1172 1

原创 大型网站架构之应用服务器集群化

随着网站的发展,一台应用服务器无法处理太多用户请求,考虑部署多台应用服务器组成集群来提供服务。此时问题来了?问题1:扩展到多台应用服务器时,可能同一个用户的先后两次请求由不同的应用服务器处理,这个时候不同的应用服务器如何进行session的管理。(应用服务器集群的session管理)问题2:如何将请求均匀的分发给集群中的应用服务器。(应用服务器集群的负载均衡)应用服务器集群的sessio

2016-08-11 14:13:31 2584

原创 大型网站架构之WEB前端优化

回顾下之前博客中提到的大型网站架构:这张图中,有很多经典的模块。比如CDN服务器,反向代理服务器,负载均衡系统,应用服务器,分布式缓存系统等等。之后的几篇博客中我会逐个来介绍。今天先来看看WEB前端优化,在上图中,负载均衡服务器之前的部分都可以看成WEB前端,其中自然少不了浏览器。WEB前端优化包括浏览器优化,使用CDN缓存加速,使用反向代理缓存加速。在浏览器优化时,可以采用减少htt

2016-08-11 14:13:23 433

原创 大型网站架构演变

第二遍阅读《大型网站技术架构》,真心觉得书中的内容很好,推荐大家去阅读。下面是书中对大型网站架构演变过程的介绍。对于一个小型企业级网站,通常的架构如下图:随着用户数量的增多,可以将应用服务与数据服务分离以提高性能,如下图:用户继续增多,数据库的压力太大,此时考虑使用缓存,如下图:(缓存在网站性能优化中是一种很重要的手段,可以极大的减轻缓存所在位置后端的压力,缓存分为本地缓存和分布式缓

2016-08-11 14:13:06 427

原创 业务对象的贫血模型与充血模型

业务对象是指那些从实际业务场景中抽象出来的对象,这些对象在代码中对应的就是一些业务对象类。在常见的SSH框架的开发中,一般的做法是将每一个业务对象对应一个POLO,当然这是为了方便使用ORM框架。当我们把业务对象实现为POJO的时候,我们实际上是在使用业务对象贫血模式。下面是业务对象贫血模型图:(业务对象类既领域层的model)在贫血模型中,业务对象仅仅包含数据而不包含行为,他的作用

2016-08-11 14:12:55 1209 1

原创 B+树在mysql数据库索引中的使用

一:B-树是一种平衡的多路查找树,它在文件系统中很有用。定义:一棵m 阶的B-树,或者为空树,或为满足下列特性的m 叉树:⑴树中每个结点至多有m 棵子树。⑵若根结点不是叶子结点,则至少有两棵子树。⑶除根结点之外的所有非叶结点至少有[m/2] 棵子树;⑷所有的非终端结点中包含以下信息数据:(n,A0,K1,A1,K2,…,Kn,An)其中:n 为关键码的个数,Ki(i=1,2,…,n)为

2016-08-11 14:12:42 2012

原创 常见RAID

笔者在做桌面云的过程中,就使用过raid。最近阅读《大型网站技术架构》,觉得作者总结的很到位,在此转发。http://book.51cto.com/art/201310/412862.htmRAID(廉价磁盘冗余阵列)技术主要是为了改善磁盘的访问延迟,增强磁盘的可用性和容错能力。目前服务器级别的计算机都支持插入多块磁盘(8块或者更多),通过使用RAID技术,实现数据在多块磁盘上的并发读写和数据

2016-08-11 14:12:33 409

原创 Time33算法与位运算

最近不是很忙,阅读了下《大型网站技术架构》一书。在4.3.4代码优化小节有这样的一句话:“目前比较好的字符串hash算法有Time33算法”。Time33算法,就是hash(i)=33*hash(i-1)+str[i]。在jdk源码中String类的hashCode()方法使用的是Time31算法。源码如下: public int hashCode() { int h =

2016-08-11 14:12:23 471

原创 JVM-内存泄漏闲谈

最近,参加了一个JAVA工程师的面试,被问及内存泄露的一些问题,回来又详细的了解了一下,在此和大家分享。垃圾回收是JVM的一大特色,它能够让java程序员无需关注对象的释放过程。理论上来讲,JVM是不存在内存泄露的问题的。但程序是人写的,难免犯错误。其中最常见的错误就是在程序中,明明某个对象已经是垃圾对象,但是我们还不经意间保留着到这些对象的引用。如下代码:import java.util.

2016-08-11 14:12:15 486

原创 JVM-ClassLoader装载class的流程

在JVM中,有三种默认的类加载器,分别为Bootstrap ClassLoader,Extension CLassLoader以及App ClassLoader。其中,Bootstrap Classloader用于加载JAVA的核心类库,Extension Classloader用于加载JAVA的扩展类库,而App ClassLoader则用于装载类路径中的用户自定义的类。具体的流程如下:

2016-08-11 14:12:07 293

原创 hashCode和equals

最近在复习的时候,又重新的理解了下equals()和hashCode().equals()用于判断两个对象是否相等,这是大家公认的。hashCode()被设计是用来使得哈希容器能高效的工作。为什么这么说?在java中,有一些哈希容器,比如Hashtable,HashMap等等。当我们调用这些类的诸如get(Object obj)方法时,容器的内部肯定需要判断一下当前对象obj在容器中是否存在,...

2016-08-11 14:11:58 13719

操作系统重点总结

本文档对操作系统的基础知识进行总结,详细凝练,适用于进行操作系统期末考试的复习。

2016-08-30

空空如也

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

TA关注的人

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