• UID25
  • 登录2016-05-02
  • 粉丝8
  • 关注2
  • 发帖80
  • 主页
  • 金币1443枚
社区居民
原创写手
billy 发布于2016-04-16 17:59
0/905

使用Memcached改进Java企业级应用性能(1):架构和设置

楼层直达
Memcached由Danga Interactive开发,用来提升LiveJournal.com网站性能。Memcached分布式架构支持众多的社交网络应用,Twitter、Facebook还有Wikipedia。在接下来的两部分教程中,Sunil Patil介绍了Memcached分布式哈希表架构,以及利用它帮助你为数据驱动Java企业应用做数据缓存。
本文介绍了如何利用Memcached提升Java企业应用性能。首先,总览了传统的Java缓存框架,并和Memcached做一个比较。当然,也会在你的本机上安装Memcached,如何通过telnet与Memcached交互工作。接着,创建一个”Hello Memcached”Java客户端程序。你会了解如何利用Memcached减少数据库服务器负载,缓存动态生成的页面标记。最后,考虑对spymemcached客户端做一些高级优化配置。

Memcached以及Java缓存架构总览


像EHCache和OSCache这样的Java缓存框架,本质上是存在于应用代码中的HashMap对象。无论何时添加一个新的对象到缓存中,它都保存在你的应用内存中。保存少量数据时,这个策略是没有问题的,但缓存超过GB的数据就有问题了。Memcached服务器的设计者采用一种分布式架构,这种方式便于扩展,因此,可以利用Memcached做海量数据缓存。
Memcached架构包含两部分。首先是一个拥有自身进程的Memcached服务器软件。倘若你想扩展你的应用,可以在其它机器上运行Memcached服务器软件。Memcached服务器软件实例相互独立。Memcached系统的第二部分是Memcached客户端,它确切地知道每台服务器的存在。客户端负责获取缓存录入对应的服务器,以及存储或者获得缓存录入——这一过程,稍后我会做详细地讨论。
如果曾经开发过Java EE 网络应用,你一定用过EHCache或者OSCache之类的Java开源缓存框架。你或许用过DynaCache或者JBoss Cache这样的商业缓存框架作为应用服务器的一部分。在我们亲手实践本教程之前,明白Memcached与那些传统Java缓存框架的不同之处是很重要的。

使用传统的Java缓存


无论选择开源或者是商业方案,使用传统Java缓存架构是很容易。使用类似EHCache或者OSCache这种开源的框架,你需要下载二进制文件,添加必须的JAR文件到你的应用classpath下。同样,你需要创建配置文件,配置缓存、交换分区的大小。由于缓存框架需要与软件绑定,而缓存框架通常会与应用服务器绑定,所以无需下载任何额外的JAR文件。

图1 传统的Java缓存架构

在为你的应用程序添加缓存框架之后,通过创建CacheManager对象获取和设置其中的缓存条目(entry)。这样,你的应用和缓存框架创建的CacheManager会在相同的JVM上运行。每次增加缓存条目,此对象会添加到由缓存框架维护某类哈希表中。
一旦你的应用服务器软件运行在多个节点上,你可能需要支持分布式缓存。在分布式缓存系统中,一旦在AppServer1中添加了某个对象,在AppServer2和AppServer3上此对象也变为可用。传统的Java缓存使用复制(replication)实现分布式缓存,这意味着当你为AppServer1添加一个缓存条目,该条目会自动复制到系统的其它应用服务器上。最终,条目会在所有的站点中可用。

使用Memcached


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

图2 Memcached架构

接着,下载一个JavaMemcached客户端,把客户端JAR文件添加到你的应用中。然后创建一个Memcached客户端对象,就可以调用它的方法获取和设置缓存条目。一旦添加某个对象到缓存中,Memcached客户端会获取该对象、对其序列化并发送字节数组到Memcached服务端保存。这时,缓存对象可能被应用运行的JVM作为垃圾回收。
当你需要缓存对象时,可以调用Memcached客户端的 get() 方法。客户端会得到这个get请求、序列化并将get请求传给Memcached服务器。Memcached服务器通过该请求从缓存中查找这个对象。如果存有此对象,服务器会把这个字节数组返回给客户端。客户端收到字节数组,反序列化并创建对象返回给你的应用。
即使你的应用跑在不止一个应用服务器上,所有的应用都能指向相同的Memcached服务器,通过它获取并设置缓存条目。倘若你拥有不止一台Memcached服务器,服务器互相之间不会知道。因此,你需要配置Memcached客户端,这样它就能知道所有Memcached服务器。比如,应用在AppServer1创建一个Java对象,接着调用Memcached的 set() 方法,Memcached客户端就找到某个Memcached服务器来存放条目。接着它只和此台Memcached服务器通信。同样,一旦存在于AppServer2或者Appserver3的代码尝试去获取某个录入时,Memcached客户端首先会找出哪个服务器存储了此条目,接着只与此服务器通信。

Memcached客户端逻辑


在缺省状态下,Memcached客户端使用非常简单的逻辑选择服务器进行get或set操作。一旦调用get()或者set(),客户端就会得到缓存键(key)调用hashcode()方法得到整数值,比如11。接着用这个数除以Memcached服务器可用数量(比如2),本例中得到的余数为1。缓存条目就会指向Memcached服务器1。这个简单的算可以确保应用服务器所在的Memcached客户端为给定的缓存键选择相同的服务器。

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,执行此文件完成服务器搭建。
  3. 使用 memcached.exe -d install 注册memcached.exe作为系统服务,你可以在服务控制台开启或者停止Memcached服务器。

当你在缺省状态下执行memcached.exe,Memcached服务器默认占用64兆内存,监听11211端口。在某些情形下,或许你想做一些更加细粒度的控制。比如,端口11211被本机其他进程占用,你希望Memcached可以监听端口12000;或者你想在质量保证或者生产环境中搭建Memcached服务器,需要的默认内存不止64兆。你可以通过命令行参数定制服务器行为。运行memcache.exe -help命令会获取所有的命令行选项,如下图3所示。

图3 Memcached服务器命令行选项


通过Telnet与Memcached交互


一旦Memcached服务器开始监听你指定的端口,Memcached客户端就可以通过TCP或者UDP端口与之连接,发送命令或者接受响应,最后关闭连接。
连接Memcached服务器方式有多种,我会在本教程的第二部分采用Java客户端连接,你将能够利用简单的API从缓存中存储或者获取对象。或者你可以采用Telnet客户端直接与服务器连接。懂得利用Telnet客户端与Memcached服务器交互对调试Java客户端很重要,因此我们就从这里开始。

Telnet命令


首先你需要用Telnet客户端连接Memcached服务器。在WindowsXP平台上,如果Memcached服务器也运行在这台机器上并缺省监听端口11211,只要执行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与Memcached服务器交互案例。正如你所看到的,Memcached服务器会对每个命令做出回应,比如STORED、NOT_STORED等。

图4 Telnet客户端与Memcached服务器交互案例


第一部分结语


到此,我们简要地讨论了Memcached分布式框架和众多传统Java缓存系统。在你的开发环境中安装了Memcached,通过Telnet连接Memcached。教程的下一篇中,我们将调用Java客户端sypmemcached命令,为一个Java示例应用建立分布式缓存方案。在此过程中,你会了解更多关于Memcached的信息,以及如何提升你的JavaEE应用性能。


原文链接: javaworld 翻译: ImportNew.com- 乔永琪
译文链接: http://www.importnew.com/16074.html

0人打赏
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 76999/375   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 44075/191   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 43705/0   Python爬虫:常用浏览器的useragent

  • 40218/259   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 37956/145   省时省力的Android组件群来了,非常棒的原型参考

  • 29218/142   2016抢红包软件及源码

  • 28975/2   超全!整理常用的iOS第三方资源

  • 28846/71   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 23562/159   Android版类似UC浏览器:非常赞,产品级的源码

  • 22587/30   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 22270/25   Android工程师面试题大全

  • 22145/27   2016程序员跳槽全攻略

  • 21735/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 20701/20   码魂:程序员的牛B漫画

  • 18795/10   2016年最全的Android面试考题+答案 精编版

  • 18644/85   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 18528/3   吐槽那些程序员的搞笑牛逼注释

  • 18517/42   一个绚丽的loading动效分析与实现!

  • 18504/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 17453/1   iOS 动画总结

  • 17300/45   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 17097/81   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 16925/104   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 16838/23   个人收集的Android 各类功能源代码

  • 16324/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 16247/10   女程序员的梦,众网友的神回复

  • 16242/21   Android福利第三波【Android电子书】

  • 16109/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 16082/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 16001/81   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 15938/11   年会上现场review代码是怎么样的体验!

  • 15744/23   珍藏多年的素材,灵感搜寻网站

  • 15742/0   iOS中文版资源库,非常全

  • 15048/18   65条最常用正则表达式,你要的都在这里了

  • 14573/15   基于Android支付宝支付设计和开发方案

  • 13999/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 13968/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 13654/46   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 13480/0   GitHub iOS 库和框架Top100 

  • 13332/7   一张图搞定iOS学习路线,非常全面

  • 13325/7   用程序员的姿势抢过年的火车票

  • 13198/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 12958/10   成为Java顶尖程序员 ,看这11本书就够了

  • 12875/10   微信支付终于成功了(安卓,iOS),在此分享

  • 12800/18   一张图搞定Android学习路线,非常全面

  • 12542/29   【持续更新中】Android福利贴(一):资料源码

  • 12475/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 12185/4   46 个非常有用的 PHP 代码片段

  • 11740/3   即时通信第三方库

  • 11252/8   流媒体视频直播方案

  • 11170/18   八个最优秀的Android Studio插件

  • 11052/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 10882/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 10785/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 10692/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 10056/6   开箱即用!Android四款系统架构工具

  • 9876/10   十大技巧快速提升Android应用开发性能

  • 9798/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 9696/1   Android性能优化视频,文档以及工具

  • 9659/3   一张图看清Linux 内核运行原理

  • 返回顶部