使用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文件。
图1 传统的Java缓存架构
在为你的应用程序加入缓存框架之后,通过创建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所看到的。
图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等。
图4 Telnetclient与Memcachedserver交互案例
第一部分结语
到此。我们简要地讨论了Memcached分布式框架和众多传统Java缓存系统。
在你的开发环境中安装了Memcached,通过Telnet连接Memcached。
教程的下一篇中,我们将调用Javaclientsypmemcached命令,为一个Java演示样例应用建立分布式缓存方案。在此过程中。你会了解很多其它关于Memcached的信息,以及怎样提升你的JavaEE应用性能。
使用Memcached改进Java企业级应用性能:架构和设置的更多相关文章
- Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构
Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...
- 一步一步理解 Java 企业级应用的可扩展性
摘要:本文主要介绍如何理解 Java 应用的扩展方式以及不同类型的扩展技术和具体技巧,介绍一些有关 Java 企业级应用的一般扩展策略. 老实说,"可扩展性"是个全面且详尽的话题, ...
- 如何利用缓存机制实现JAVA类反射性能提升30倍
一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> ...
- JAVA企业级应用服务器之TOMCAT实战
JAVA企业级应用服务器之TOMCAT实战 链接:https://pan.baidu.com/s/1c6pZjLeMQqc9t-OXvUM66w 提取码:uwak 复制这段内容后打开百度网盘手机App ...
- .NET应用架构设计—重新认识分层架构(现代企业级应用分层架构核心设计要素)
阅读目录: 1.背景介绍 2.简要回顾下传统三层架构 3.企业级应用分层架构(现代分层架构的基本演变过程) 3.1.服务层中应用契约式设计来解决动态条件不匹配错误(通过契约式设计模式来将问题在线下暴露 ...
- MemCached Cache Java Client封装优化历程
1.什么是memcached?(从官网翻译翻译) 免费和开源.高性能.分布式内存对象缓存系统,通用在自然界,但用于加速动态web应用程序,减轻数据库负载. Memcached是一个内存中的键值存储为小 ...
- 高吞吐高并发Java NIO服务的架构(NIO架构及应用之一)
高吞吐高并发Java NIO服务的架构(NIO架构及应用之一) http://maoyidao.iteye.com/blog/1149015 Java NIO成功的应用在了各种分布式.即时通信和中 ...
- Mysql实现企业级数据库主从复制架构实战
场景 公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公司业务中断,损失100万,老王做出深刻反省,公司 ...
- 项目实战7—Mysql实现企业级数据库主从复制架构实战
Mysql实现企业级数据库主从复制架构实战 环境背景:公司规模已经形成,用户数据已成为公司的核心命脉,一次老王一不小心把数据库文件删除,通过mysqldump备份策略恢复用了两个小时,在这两小时中,公 ...
随机推荐
- 332 Reconstruct Itinerary 重建行程单
Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], r ...
- Laravel5.1学习笔记12 系统架构4 服务容器
Service Container 介绍 绑定的用法 绑定实例到接口 上下文绑定 标签 解析 容器事件 #介绍 The Laravel service container is a powerful ...
- 实现微信小程序的wxml文件和wxss文件在phpstrom的支持
最近下载了微信小程序准备好好看看,但是发现微信小程序用的后缀名是不一样的,.wxml代表的就是平时用的.html,.wxss代码的就是平时用的.css.但是phpstorm无法识别,为了更方便的码代码 ...
- Angular——事件指令
基本介绍 angular的事件指令都是ng-click,ng-blur....的形式,类似于js的事件 基本使用 <!DOCTYPE html> <html lang="e ...
- 微信小程序获取二维码并把logo替换为自己的头像
$avatarUrl = 'http://cms-bucket.nosdn.127.net/2018/05/28/a1a44ffdc2d24f928c1860d4fbf54703.jpeg?image ...
- css知识框架
- ubuntu14.0开机guest账号禁用方法
在终端里进入/usr/share/lightdm/lightdm.conf.d/目录 sudo vim 50-unity-greeter.conf 然后在文件里输入: [SeatDefaults] a ...
- js 字符串,数组扩展
console.log(Array.prototype.sort)//ƒ substring() { [native code] } console.log(String.prototype.subs ...
- Chat Group gym101775A(逆元,组合数)
传送门:Chat Group(gym101775A) 题意:一个宿舍中又n个人,最少k(k >= 3)个人就可以建一个讨论组,问最多可以建多少个不同的讨论组. 思路:求组合数的和,因为涉及除法取 ...
- axios请求中跨域及post请求问题解决方案
闲话不多说,用到vue的童鞋们应该大部分都会遇到请求中的各种奇葩问题,昨天研究一天,终于搞出来个所以然了,写篇文章拯救一下广大的童鞋们,某度娘当然也可以搜到,但一般解决了一个问题后就会出现另外一个问题 ...