使用Memcached改进Java企业级应用性能:架构和设置
Posted wzjhoutai
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Memcached改进Java企业级应用性能:架构和设置相关的知识,希望对你有一定的参考价值。
Memcached由Danga Interactive开发。用来提升LiveJournal.com站点性能。
Memcached分布式架构支持众多的社交网络应用,Twitter、Facebook还有Wikipedia。
在接下来的两部分教程中,Sunil Patil介绍了Memcached分布式哈希表架构,以及利用它帮助你为数据驱动Java企业应用做数据缓存。
本文介绍了怎样利用Memcached提升Java企业应用性能。
首先,总览了传统的Java缓存框架。并和Memcached做一个比較。当然。也会在你的本机上安装Memcached,怎样通过telnet与Memcached交互工作。
接着,创建一个”Hello Memcached”Javaclient程序。你会了解怎样利用Memcached降低数据库server负载,缓存动态生成的页面标记。最后,考虑对spymemcachedclient做一些高级优化配置。
Memcached以及Java缓存架构总览
像EHCache和OSCache这种Java缓存框架,本质上是存在于应用代码中的HashMap对象。不管何时加入一个新的对象到缓存中,它都保存在你的应用内存中。保存少量数据时。这个策略是没有问题的,但缓存超过GB的数据就有问题了。Memcachedserver的设计者採用一种分布式架构,这种方式便于扩展,因此。能够利用Memcached做海量数据缓存。
Memcached架构包括两部分。首先是一个拥有自身进程的Memcachedserver软件。倘若你想扩展你的应用,能够在其他机器上执行Memcachedserver软件。Memcachedserver软件实例相互独立。Memcached系统的第二部分是Memcachedclient,它确切地知道每台server的存在。client负责获取缓存录入相应的server,以及存储或者获得缓存录入——这一过程,稍后我会做具体地讨论。
假设以前开发过Java EE 网络应用,你一定用过EHCache或者OSCache之类的Java开源缓存框架。你也许用过DynaCache或者JBoss Cache这种商业缓存框架作为应用server的一部分。
在我们亲手实践本教程之前,明确Memcached与那些传统Java缓存框架的不同之处是非常重要的。
使用传统的Java缓存
不管选择开源或者是商业方案,使用传统Java缓存架构是非常easy。
使用类似EHCache或者OSCache这样的开源的框架。你须要下载二进制文件。加入必须的JAR文件到你的应用classpath下。相同,你须要创建配置文件,配置缓存、交换分区的大小。因为缓存框架须要与软件绑定。而缓存框架一般会与应用server绑定,所以无需下载不论什么额外的JAR文件。
在为你的应用程序加入缓存框架之后,通过创建CacheManager对象获取和设置当中的缓存条目(entry)。
这样。你的应用和缓存框架创建的CacheManager会在同样的JVM上执行。
每次添加缓存条目,此对象会加入到由缓存框架维护某类哈希表中。
一旦你的应用server软件执行在多个节点上,你可能须要支持分布式缓存。在分布式缓存系统中。一旦在AppServer1中加入了某个对象,在AppServer2和AppServer3上此对象也变为可用。传统的Java缓存使用复制(replication)实现分布式缓存,这意味着当你为AppServer1加入一个缓存条目,该条目会自己主动拷贝到系统的其他应用server上。
终于,条目会在全部的网站中可用。
使用Memcached
要使用Memcached进行缓存,必须下载并在你的平台上安装Memcachedserver软件。一旦Memcachedserver成功安装。它会通过TCP或者UDPport监听缓存调用。
接着,下载一个JavaMemcachedclient,把clientJAR文件加入到你的应用中。
然后创建一个Memcachedclient对象,就能够调用它的方法获取和设置缓存条目。
一旦加入某个对象到缓存中。Memcachedclient会获取该对象、对其序列化并发送字节数组到Memcached服务端保存。这时。缓存对象可能被应用执行的JVM作为垃圾回收。
当你须要缓存对象时,能够调用Memcachedclient的 get() 方法。client会得到这个get请求、序列化并将get请求传给Memcachedserver。Memcachedserver通过该请求从缓存中查找这个对象。假设存有此对象。server会把这个字节数组返回给client。client收到字节数组,反序列化并创建对象返回给你的应用。
即使你的应用跑在不止一个应用server上。全部的应用都能指向相同的Memcachedserver,通过它获取并设置缓存条目。
倘若你拥有不止一台Memcachedserver,server互相之间不会知道。
因此,你须要配置Memcachedclient。这样它就能知道全部Memcachedserver。比方,应用在AppServer1创建一个Java对象,接着调用Memcached的 set() 方法,Memcachedclient就找到某个Memcachedserver来存放条目。接着它仅仅和此台Memcachedserver通信。
相同,一旦存在于AppServer2或者Appserver3的代码尝试去获取某个录入时。Memcachedclient首先会找出哪个server存储了此条目,接着仅仅与此server通信。
Memcachedclient逻辑
在缺省状态下。Memcachedclient使用很easy的逻辑选择server进行get或set操作。
一旦调用get()或者set(),client就会得到缓存键(key)调用hashcode()方法得到整数值,比方11。
接着用这个数除以Memcachedserver可用数量(比方2),本例中得到的余数为1。缓存条目就会指向Memcachedserver1。这个简单的算能够确保应用server所在的Memcachedclient为给定的缓存键选择同样的server。
Memcached安装
Memcached能够执行在Unix、Linux、windows以及MacOSX上。你能够下载Memcached源代码编译,或者直接下载编译好的二进制文件安装Memcached。
这里我会展示为特定平台下载二进制文件的安装过程。假设你更倾向于编译。请參见这里。
接下来的安装指令针对Windows XP 32位机器。若平台是linux等其他平台,查看这里。注意本文案例代码是在Windows XP 32位机器上开发的,只是是能够在其他平台上执行。
- Jellycan code是一个Memcached修订版本号,更易用更有效。我们先从下载win32二进制压缩文件開始。
- 解压Memcached-<versionnumber>-win32-bin.zip,注意里面包括memcached.exe。运行此文件完毕server搭建。
- 使用 memcached.exe -d install 注冊memcached.exe作为系统服务,你能够在服务控制台开启或者停止Memcachedserver。
当你在缺省状态下执行memcached.exe。Memcachedserver默认占用64兆内存,监听11211port。在某些情形下,也许你想做一些更加细粒度的控制。比方,port11211被本机其它进程占用,你希望Memcached能够监听port12000;或者你想在质量保证或者生产环境中搭建Memcachedserver,须要的默认内存不止64兆。
你能够通过命令行參数定制server行为。执行memcache.exe -help命令会获取全部的命令行选项,例如以下图3所看到的。
通过Telnet与Memcached交互
一旦Memcachedserver開始监听你指定的port,Memcachedclient就能够通过TCP或者UDPport与之连接,发送命令或者接受响应,最后关闭连接。
连接Memcachedserver方式有多种,我会在本教程的第二部分採用Javaclient连接,你将可以利用简单的API从缓存中存储或者获取对象。或者你可以採用Telnetclient直接与server连接。懂得利用Telnetclient与Memcachedserver交互对调试Javaclient非常重要。因此我们就从这里開始。
Telnet命令
首先你须要用Telnetclient连接Memcachedserver。在WindowsXP平台上,假设Memcachedserver也执行在这台机器上并缺省监听port11211,仅仅要执行telnet localhost 11211。接下来的命令对Telnet管理Memcached非常重要:
- set加入一个新的项目到缓存中,使用格式是 Set <keyName> <flags> <expiryTime> <bytes>,你能够将敲入的值存入下一行。倘若不想缓存录入过期,能够输入0。
- get返回缓存键的值,调用get <keyName>获得keyName的值。
- add加入一个新的键,前提是此键之前并不存在。比方add <keyName> <flags> <expiryTime> <bytes>。
- replace会替代某个键的值,前提是此键已存在。比方replace <keyName> <flags> <expiryTime> <bytes>。
- delete删除某个键的缓存录入,调用delete <keyName>删除keyName的值。
图4的截图展示了通过Telnet与Memcachedserver交互案例。正如你所示,Memcachedserver会对每一个命令做出回应,比方STORED、NOT_STORED等。
第一部分结语
到此。我们简要地讨论了Memcached分布式框架和众多传统Java缓存系统。
在你的开发环境中安装了Memcached,通过Telnet连接Memcached。
教程的下一篇中,我们将调用Javaclientsypmemcached命令,为一个Java演示样例应用建立分布式缓存方案。在此过程中。你会了解很多其它关于Memcached的信息,以及怎样提升你的JavaEE应用性能。
以上是关于使用Memcached改进Java企业级应用性能:架构和设置的主要内容,如果未能解决你的问题,请参考以下文章