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

图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应用性能。

时间: 2024-07-28 21:10:20

使用Memcached改进Java企业级应用性能:架构和设置的相关文章

Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式百度云实战分享

muke慕课实战课程分享QQ313675301 新增课程: Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式百度云实战分享 后端开发: 1.高级java软件架构师实战培训视频教程2.大型SpringMVC,Mybatis,Redis,Solr,Nginx,SSM分布式电商项目视频教程3.Spark Streaming实时流处理项目实战4.Java校招面试 Google面试官亲授5.Java开发企业级权限管理系统6.Java大牛 带你从0到上线开发企业级电商项目7.Java

39套精品Java从入门到架构师|高并发|高性能|高可用|分布式|集群|电商缓存|性能调优|设计项目实战|视频教程

精品Java高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,大型分布式电商项目实战视频教程   视频课程包含: 39套Java精品高级课架构课包含:java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,架构设计,web安全,高并发,高性能,高可用,高可扩展,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,工作流,程序调优,负载均衡,Solr

36套精品Java高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,大型分布式电商项目实战视频教程

新年伊始,学习要趁早,点滴记录,学习就是进步! QQ:1225462853 视频课程包含: 36套Java精品高级课架构课包含:java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,架构设计,web安全,高并发,高性能,高可用,高可扩展,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,工作流,程序调优,负载均衡,Solr集群与应用,主从复制,中间件,全文检索,Spring boot,Spring cloud,Dubbo,Elasticsearch,Redis,ActiveMQ

Java企业级电商项目架构演进之路Tomcat集群与Redis分布式

Java企业级电商项目架构演进之路Tomcat集群与Redis分布式网盘地址:https://pan.baidu.com/s/1taAooW3AhdGcdGSvOLqjkg 密码:nwip备用地址(腾讯微云):https://share.weiyun.com/5JdkNHX 密码:s9pm74 第1章 课程介绍[赠送一期源码+一期内容回顾]第2章 Lombok框架集成及原理解析第3章 Maven环境隔离应用场景及验证实战第4章 Tomcat集群演进详解及环境搭建第5章 Redis基础强化第6章

Java从入门到架构师|高并发|高性能|高可用|分布式|性能调优|设计模式|大型电商项目

没有设计的思想,你就不能成为一名架构师.架构师是一个能撸的了一手好代码,画的了一个漂亮的UML/原型,写的了一篇技术文档,更加能解决好项目关键技术的综合人才.架构师=前端工程师+后端程序员+系统分析师+关键技术解决+各种技术搭配+设计模式+部署调优+其他,可见架构师是多面手,在项目当中起到连接管理与项目成员的重要角色.因此,在通往大神级的架构师的道路上,你需要懂需求.设计.代码.部署.架构.服务器.运维.调优等等. 简单系统架构图 一个能担负起企业级应用的架构师,脑海里常出现的词会是这些:负载均

Java企业级电商项目架构演进之路 Tomcat集群与Redis分布式

Java企业级电商项目架构演进之路  Tomcat集群与Redis分布式 Redisson介绍Redisson是架设在Redis基础上的一个java驻内存数据网格.Redisson在基于NIO的Netty框架上,充分的利用了Redis键值数据库提供的一系列优势.在java使用工具包中常用接口的基础上,为使用者提供了一系列具有分布式特性的常用工具类.使得原本作为协调单机多线程并发程序的工具包获得了协调分布式多机多线程并发系统的能力,大大降低了设计和研发大规模分布式系统的难度.同时结合各富特色的分布

一步一步理解 Java 企业级应用的可扩展性

摘要:本文主要介绍如何理解 Java 应用的扩展方式以及不同类型的扩展技术和具体技巧,介绍一些有关 Java 企业级应用的一般扩展策略. 老实说,“可扩展性”是个全面且详尽的话题,而且往往得不到充分理解.人们通常认为可扩展性等同于高可用性,笔者见过编程新手和架构师“老手”都建议将集群作为可扩展性和高可用性的解决方案.建议确实没错,但问题是,人们通常是通过互联网搜索,而非实际理解应用本身的情况来实现集群. 笔者并未自称“专家”,只想通过这篇文章介绍一些有关 Java 企业级应用的一般扩展策略. 问

如何利用缓存机制实现JAVA类反射性能提升30倍

一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> 分享者:宜信支付结算部支付研发团队高级工程师陶红 原文首发于宜信支付结算技术团队公号:野指针 在实际工作中的一些特定应用场景下,JAVA类反射是经常用到.必不可少的技术,在项目研发过程中,我们也遇到了不得不运用JAVA类反射技术的业务需求,并且不可避免地面临这个技术固有的性能瓶颈问题. 通过近两年的研究.尝

How to improve Java&amp;#39;s I/O performance( 提升 java i/o 性能)

原文:http://www.javaworld.com/article/2077523/build-ci-sdlc/java-tip-26--how-to-improve-java-s-i-o-performance.html JDK 1.0.2 的 java.io 包暴露了非常多I/O性能问题.这里将介绍一个优化方案,附加一个关闭同步的方法. Java的I/O性能以前是非常多Java应用的瓶颈.主要原因就是JDK1.0.2的java.io包的不良设计和实现.关键问题是缓冲.绝大多数java.i