- 博客(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
原创 使用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
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人