使用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文件。

memcached1-fig1-thumb-100159507-orig

图1 传统的Java缓存架构

在为你的应用程序加入缓存框架之后,通过创建CacheManager对象获取和设置当中的缓存条目(entry)。

这样。你的应用和缓存框架创建的CacheManager会在同样的JVM上执行。

每次添加缓存条目,此对象会加入到由缓存框架维护某类哈希表中。

一旦你的应用server软件执行在多个节点上,你可能须要支持分布式缓存。在分布式缓存系统中。一旦在AppServer1中加入了某个对象,在AppServer2和AppServer3上此对象也变为可用。传统的Java缓存使用复制(replication)实现分布式缓存,这意味着当你为AppServer1加入一个缓存条目,该条目会自己主动拷贝到系统的其他应用server上。

终于,条目会在全部的网站中可用。

使用Memcached

要使用Memcached进行缓存,必须下载并在你的平台上安装Memcachedserver软件。一旦Memcachedserver成功安装。它会通过TCP或者UDPport监听缓存调用。

图2 Memcached架构

接着,下载一个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位机器上开发的,只是是能够在其他平台上执行。

  1. Jellycan code是一个Memcached修订版本号,更易用更有效。我们先从下载win32二进制压缩文件開始。
  2. 解压Memcached-<versionnumber>-win32-bin.zip,注意里面包括memcached.exe。运行此文件完毕server搭建。
  3. 使用 memcached.exe -d install 注冊memcached.exe作为系统服务,你能够在服务控制台开启或者停止Memcachedserver。

当你在缺省状态下执行memcached.exe。Memcachedserver默认占用64兆内存,监听11211port。在某些情形下,也许你想做一些更加细粒度的控制。比方,port11211被本机其它进程占用,你希望Memcached能够监听port12000;或者你想在质量保证或者生产环境中搭建Memcachedserver,须要的默认内存不止64兆。

你能够通过命令行參数定制server行为。执行memcache.exe -help命令会获取全部的命令行选项,例如以下图3所看到的。

memcached1-fig3-thumb-100159509-orig

图3 Memcachedserver命令行选项

通过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等。

memcached1-fig4-thumb-100159510-orig

图4 Telnetclient与Memcachedserver交互案例

第一部分结语

到此。我们简要地讨论了Memcached分布式框架和众多传统Java缓存系统。

在你的开发环境中安装了Memcached,通过Telnet连接Memcached。

教程的下一篇中,我们将调用Javaclientsypmemcached命令,为一个Java演示样例应用建立分布式缓存方案。在此过程中。你会了解很多其它关于Memcached的信息,以及怎样提升你的JavaEE应用性能。

 

posted @ 2017-07-04 15:34  wzjhoutai  阅读(225)  评论(0编辑  收藏  举报