`

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

 
阅读更多

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

memcached1-fig1-thumb-100159507-orig

图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所示。

memcached1-fig3-thumb-100159509-orig

图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等。

memcached1-fig4-thumb-100159510-orig

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

第一部分结语

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

分享到:
评论

相关推荐

    oracle掉用memcached,得用oracle调用java,java调用memcached

    在IT行业中,数据库系统如Oracle经常需要与其他技术集成以实现更高效的数据管理和处理。在这个场景中,Oracle数据库需要与缓存服务...这种集成技术是现代企业级应用中常见的实践,有助于构建更加高效和可扩展的系统。

    JAVA+MYSQL+Memcached

    首先,Java是一种广泛使用的面向对象的编程语言,尤其在企业级应用中占据主导地位。Java以其跨平台的特性,即“一次编写,到处运行”,赢得了全球开发者的心。它提供了丰富的类库和框架,如Spring、Hibernate等,...

    Java架构专题,高并发架构下性能提升千倍内幕揭秘

    而Java作为目前最主流的企业级开发语言之一,在构建高并发架构方面具有得天独厚的优势。 #### 高并发系统的定义 高并发系统通常指的是能够同时处理大量并发请求的系统。这些系统具备以下特点: - **高可用性**:...

    JavaEE企业级分布式高级架构师培训.zip

    JavaEE企业级分布式高级架构师培训课程主要涵盖了JavaEE技术栈在大型企业中的高级应用,旨在培养具备深厚理论基础和实战经验的分布式系统架构设计师。这个课程内容广泛且深入,通常包括以下几个核心知识点: 1. **...

    29道memcached面试题含答案(很全)

    Memcached是一种广泛应用于Web开发领域的高性能分布式...其简单高效的设计使其成为许多大型网站和应用的首选缓存解决方案,但在使用时也需注意其无持久化存储和安全性较低的特点,需要结合具体应用场景采取相应措施。

    java大型架构三本全书(大型分布式网站架构设计,大型网站系统与java中间件实践,分布式java应用 基础与实践)

    其次,"大型网站系统与Java中间件实践"会深入讲解各种Java中间件的使用,例如Spring框架、MyBatis、Hibernate等,这些工具极大地简化了企业级应用的开发。Spring框架提供了依赖注入和面向切面编程,使得代码更加灵活...

    2021Java高级架构面试知识点整理V1.0

    在IT行业中,面试高级架构师职位通常需要对一系列核心知识点有深入的理解和掌握。以下是对“2021Java高级架构面试知识点整理V1.0”文档中提及的关键知识点的详细解读: 1. 消息队列的应用场景与优缺点 - 使用消息...

    私塾在线 高级java软件架构师实战培训视频教程 阶段一 代码及目录67-72 讲 共148讲

    综上所述,这个阶段的课程旨在提升Java开发者对高性能、高可用架构的理解和实践能力,通过对Memcached、Nginx+Varnish、ActiveMQ等技术的深入学习,帮助学员掌握企业级软件开发的关键技能,为成为一名优秀的Java软件...

    [分布式Java应用:基础与实践].林昊.高清文字版.pdf

    10. JVM优化:JVM内存模型、垃圾收集器的工作原理及调优方法,对提升Java应用性能至关重要。 11. MyBatis框架:MyBatis作为持久层框架,其动态SQL、映射文件配置、事务管理等方面的使用和最佳实践。 以上只是部分...

    大型网站技术架构 核心原理与案例分析+李智慧-高清 和 大型网站系统与JAVA中间件实践

    书中可能会介绍Spring框架,它是Java企业级应用的基石,提供依赖注入、AOP(面向切面编程)等功能,简化了复杂系统的构建。 分布式系统是处理高并发、海量数据的核心技术。书中可能涉及负载均衡,通过将流量分散到...

    艾编程:中小企业到亿级流量从组织架构到系统15次架构演进

    技术栈的应用情况包括:前端开发使用Vue.js和Bootstrap,后端使用SSM架构(SpringMVC、SpringBoot、MyBatis),数据库使用MySQL进行CRUD操作,应用服务器采用Tomcat,缓存技术使用memcached和Redis,反向代理使用...

    分布式Java应用:基础与实践

    10. **监控与日志**:使用ELK(Elasticsearch、Logstash、Kibana)堆栈、Prometheus和Grafana等工具进行分布式系统的性能监控和日志分析,对于问题排查和系统优化至关重要。 通过对以上知识点的深入学习和实践,...

    Java+项目实战+大型分布式+视频教程+架构师

    2. **Spring框架**:作为企业级应用开发的核心,Spring框架的学习必不可少,包括Spring Core、Spring MVC、Spring Boot、Spring Data JPA等,这些都是实现业务逻辑和数据管理的关键工具。 3. **微服务架构**:随着...

    Java中间件技术及其应用开发

    Java中间件技术是现代企业级应用开发的核心组成部分,它为构建大规模、高可用、可扩展的应用提供了基础架构。本文将深入探讨Java中间件的关键概念、技术及其在实际开发中的应用。 中间件是一种软件,它位于操作系统...

    分布式Java应用基础与实践源码.zip

    在当前的互联网时代,分布式系统已经成为企业级应用的主流架构。Java作为广泛使用的编程语言,其在分布式领域的应用非常广泛。本篇将深入探讨分布式Java应用的基础知识和实践要点,通过源码分析帮助读者理解如何构建...

    分布式java应用:基础与实践

    在当今的互联网时代,分布式系统已经成为企业级应用程序开发的核心技术。Java作为一门广泛使用的编程语言,其在分布式应用领域的应用非常广泛。本篇内容将深入探讨分布式Java应用的基础概念、设计原则以及实战技巧。...

    架构设计实践之路

    2. **Java架构设计**:Java作为企业级应用的主流语言,其架构设计涉及模块化、面向对象设计原则、设计模式和框架。例如,Spring框架用于依赖注入和AOP(面向切面编程),Struts或Spring MVC处理Web层交互,MyBatis...

    分布式java应用_林昊_电子版

    分布式Java应用是现代互联网行业中广泛讨论的话题,尤其在大型企业级系统中,为了处理高并发、海量数据等问题,采用分布式架构成为了必要的选择。林昊,作为知名的Java技术专家,他的著作《分布式Java应用》深入浅出...

    大型分布式Java应用电商项目教程pdf+架构师视频资源

    在IT行业中,分布式Java应用和电商项目的结合是现代企业级软件开发的重要方向。这个大型分布式Java应用电商项目教程集合了PDF文档和架构师视频资源,为学习者提供了深入理解这一领域的宝贵材料。以下是对这些资源中...

    Java高并发高性能分布式框架从无到有微服务架构设计(1).doc

    Java高并发高性能分布式框架的设计是现代企业级应用的关键组成部分,特别是在微服务架构的背景下。微服务架构模式近年来受到广泛关注,因为它能应对服务数量的快速增长和云计算技术的不断进步。这种架构模式提倡将...

Global site tag (gtag.js) - Google Analytics