这里将介绍Java环境下Memcached应用,Memcached主要是集群环境下的缓存解决方案,希望本文对大家有所帮助。
本文将对在Java环境下Memcached应用进行详细介绍。Memcached主要是集群环境下的缓存解决方案,可以运行在Java或者.NET平台上,这里我们主要讲的是Windows下的Memcached应用。
这些天在设计SNA的架构,接触了一些远程缓存、集群、session复制等的东西,以前做企业应用的时候感觉作用不大,现在设计面对internet的系统架构时就非常有用了,而且在调试后看到压力测试的情况还是比较好的。
在缓存的选择上有过很多的思考,虽然说memcached结合java在序列化上性能不怎么样,不过也没有更好的集群环境下的缓存解决方案了, 就选择了memcached。本来计划等公司买的服务器到位装个linux再来研究memcached,但这两天在找到了一个windows下的 Memcached版本,就动手开始调整现有的框架了。
Windows下的Server端很简单,不用安装,双击运行后默认服务端口是11211,没有试着去更改端口,因为反正以后会用Unix版本,到时再记录安装步骤。下载客户端的JavaAPI包,接口非常简单,参考API手册上就有现成的例子。
目标,对旧框架缓存部分进行改造:
1、缓存工具类
2、hibernate的provider
3、用缓存实现session机制
今天先研究研究缓存工具类的改造,在旧框架中部分函数用了ehcache对执行结果进行了缓存处理,现在目标是提供一个缓存工具类,在配置文件 中配置使用哪种缓存(memcached或ehcached),使其它程序对具体的缓存不依赖,同时使用AOP方式来对方法执行结果进行缓存。
首先是工具类的实现:
在Spring中配置
Java代码
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation"> <value>classpath:ehcache.xmlvalue> property> bean> <bean id="localCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="cacheManager" /> <property name="cacheName" value="×××.cache.LOCAL_CACHE" /> bean> <bean id="cacheService" class="×××.core.cache.CacheService" init-method="init" destroy-method="destory"> <property name="cacheServerList" value="${cache.servers}"/> <property name="cacheServerWeights" value="${cache.cacheServerWeights}"/> <property name="cacheCluster" value="${cache.cluster}"/> <property name="localCache" ref="localCache"/> bean> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation"> <value>classpath:ehcache.xmlvalue> property> bean> <bean id="localCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="cacheManager" /> <property name="cacheName" value="×××.cache.LOCAL_CACHE" /> bean> <bean id="cacheService" class="×××.core.cache.CacheService" init-method="init" destroy-method="destory"> <property name="cacheServerList" value="${cache.servers}"/> <property name="cacheServerWeights" value="${cache.cacheServerWeights}"/> <property name="cacheCluster" value="${cache.cluster}"/> <property name="localCache" ref="localCache"/> bean> 在properties文件中配置${cache.servers} ${cache.cacheServerWeights} ${cache.cluster} 具体工具类的代码 Java代码 /** * @author Marc * */ public class CacheService { private Log logger = LogFactory.getLog(getClass()); private Cache localCache; String cacheServerList; String cacheServerWeights; boolean cacheCluster = false; int initialConnections = 10; int minSpareConnections = 5; int maxSpareConnections = 50; long maxIdleTime = 1000 * 60 * 30; // 30 minutes long maxBusyTime = 1000 * 60 * 5; // 5 minutes long maintThreadSleep = 1000 * 5; // 5 seconds int socketTimeOut = 1000 * 3; // 3 seconds to block on reads int socketConnectTO = 1000 * 3; // 3 seconds to block on initial // connections. If 0, then will use blocking // connect (default) boolean failover = false; // turn off auto-failover in event of server // down boolean nagleAlg = false; // turn off Nagle's algorithm on all sockets in // pool MemCachedClient mc; public CacheService(){ mc = new MemCachedClient(); mc.setCompressEnable(false); } /** * 放入 * */ public void put(String key, Object obj) { Assert.hasText(key); Assert.notNull(obj); Assert.notNull(localCache); if (this.cacheCluster) { mc.set(key, obj); } else { Element element = new Element(key, (Serializable) obj); localCache.put(element); } } /** * 删除 */ public void remove(String key){ Assert.hasText(key); Assert.notNull(localCache); if (this.cacheCluster) { mc.delete(key); }else{ localCache.remove(key); } } /** * 得到 */ public Object get(String key) { Assert.hasText(key); Assert.notNull(localCache); Object rt = null; if (this.cacheCluster) { rt = mc.get(key); } else { Element element = null; try { element = localCache.get(key); } catch (CacheException cacheException) { throw new DataRetrievalFailureException("Cache failure: " + cacheException.getMessage()); } if(element != null) rt = element.getValue(); } return rt; } /** * 判断是否存在 * */ public boolean exist(String key){ Assert.hasText(key); Assert.notNull(localCache); if (this.cacheCluster) { return mc.keyExists(key); }else{ return this.localCache.isKeyInCache(key); } } private void init() { if (this.cacheCluster) { String[] serverlist = cacheServerList.split(","); Integer[] weights = this.split(cacheServerWeights); // initialize the pool for memcache servers SockIOPool pool = SockIOPool.getInstance(); pool.setServers(serverlist); pool.setWeights(weights); pool.setInitConn(initialConnections); pool.setMinConn(minSpareConnections); pool.setMaxConn(maxSpareConnections); pool.setMaxIdle(maxIdleTime); pool.setMaxBusyTime(maxBusyTime); pool.setMaintSleep(maintThreadSleep); pool.setSocketTO(socketTimeOut); pool.setSocketConnectTO(socketConnectTO); pool.setNagle(nagleAlg); pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH); pool.initialize(); logger.info("初始化memcached pool!"); } } private void destory() { if (this.cacheCluster) { SockIOPool.getInstance().shutDown(); } } } /** * @author Marc * */ public class CacheService { private Log logger = LogFactory.getLog(getClass()); private Cache localCache; String cacheServerList; String cacheServerWeights; boolean cacheCluster = false; int initialConnections = 10; int minSpareConnections = 5; int maxSpareConnections = 50; long maxIdleTime = 1000 * 60 * 30; // 30 minutes long maxBusyTime = 1000 * 60 * 5; // 5 minutes long maintThreadSleep = 1000 * 5; // 5 seconds int socketTimeOut = 1000 * 3; // 3 seconds to block on reads int socketConnectTO = 1000 * 3; // 3 seconds to block on initial // connections. If 0, then will use blocking // connect (default) boolean failover = false; // turn off auto-failover in event of server // down boolean nagleAlg = false; // turn off Nagle's algorithm on all sockets in // pool MemCachedClient mc; public CacheService(){ mc = new MemCachedClient(); mc.setCompressEnable(false); } /** * 放入 * */ public void put(String key, Object obj) { Assert.hasText(key); Assert.notNull(obj); Assert.notNull(localCache); if (this.cacheCluster) { mc.set(key, obj); } else { Element element = new Element(key, (Serializable) obj); localCache.put(element); } } /** * 删除 */ public void remove(String key){ Assert.hasText(key); Assert.notNull(localCache); if (this.cacheCluster) { mc.delete(key); }else{ localCache.remove(key); } } /** * 得到 */ public Object get(String key) { Assert.hasText(key); Assert.notNull(localCache); Object rt = null; if (this.cacheCluster) { rt = mc.get(key); } else { Element element = null; try { element = localCache.get(key); } catch (CacheException cacheException) { throw new DataRetrievalFailureException("Cache failure: " + cacheException.getMessage()); } if(element != null) rt = element.getValue(); } return rt; } /** * 判断是否存在 * */ public boolean exist(String key){ Assert.hasText(key); Assert.notNull(localCache); if (this.cacheCluster) { return mc.keyExists(key); }else{ return this.localCache.isKeyInCache(key); } } private void init() { if (this.cacheCluster) { String[] serverlist = cacheServerList.split(","); Integer[] weights = this.split(cacheServerWeights); // initialize the pool for memcache servers SockIOPool pool = SockIOPool.getInstance(); pool.setServers(serverlist); pool.setWeights(weights); pool.setInitConn(initialConnections); pool.setMinConn(minSpareConnections); pool.setMaxConn(maxSpareConnections); pool.setMaxIdle(maxIdleTime); pool.setMaxBusyTime(maxBusyTime); pool.setMaintSleep(maintThreadSleep); pool.setSocketTO(socketTimeOut); pool.setSocketConnectTO(socketConnectTO); pool.setNagle(nagleAlg); pool.setHashingAlg(SockIOPool.NEW_COMPAT_HASH); pool.initialize(); logger.info("初始化memcachedpool!"); } } private void destory() { if (this.cacheCluster) { SockIOPool.getInstance().shutDown(); } } }
然后实现函数的AOP拦截类,用来在函数执行前返回缓存内容
Java代码
public class CachingInterceptor implements MethodInterceptor { private CacheService cacheService; private String cacheKey; public void setCacheKey(String cacheKey) { this.cacheKey = cacheKey; } public void setCacheService(CacheService cacheService) { this.cacheService = cacheService; } public Object invoke(MethodInvocation invocation) throws Throwable { Object result = cacheService.get(cacheKey); //如果函数返回结果不在Cache中,执行函数并将结果放入Cache if (result == null) { result = invocation.proceed(); cacheService.put(cacheKey,result); } return result; } } public class CachingInterceptor implements MethodInterceptor { private CacheService cacheService; private String cacheKey; public void setCacheKey(String cacheKey) { this.cacheKey = cacheKey; } public void setCacheService(CacheService cacheService) { this.cacheService = cacheService; } public Object invoke(MethodInvocation invocation) throws Throwable { Object result = cacheService.get(cacheKey); //如果函数返回结果不在Cache中,执行函数并将结果放入Cache if (result == null) { result = invocation.proceed(); cacheService.put(cacheKey,result); } return result; } }
【下载地址】
百度网盘链接:https://pan.baidu.com/s/1sGRHB4ZroLOlsYnmoTLSQg
提取码:cxs4
相关文章
使用-JFreeChart来创建基于web的图表
XStream使用文档
WebService发布过程及常见问题
webpack实战入门进阶调优分享
weblogic调优参数及监控指标
weblogic节点管理
weblogic管理控制台概述
weblogic-部署和启动
WebLogic-Server-性能及调优-调优-Java-虚拟机
Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 Weblogic Server 和应用程序的性能。
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。
Velocity 用户手册是帮助页面设计者和内容提供者认识 Velocity 和其简单而功能强大的脚本语言――Velocity 模板语言(VTL)。在手册上的许多例子,都是用 Velocity 插入动态的内容到网页上,但是所有的 VLT 例子都能应用到其他的页面和模板中。
FlashFXP绿色版网盘下载,附激活教程 1778
FlashFxp百度网盘下载链接:https://pan.baidu.com/s/1MBQ5gkZY1TCFY8A7fnZCfQ。FlashFxp是功能强大的FTP工具
Adobe Fireworks CS6 Ansifa绿色精简版网盘下载 1564
firework可以制作精美或是可以闪瞎眼的gif,这在广告领域是需要常用的,还有firework制作下logo,一些原创的图片还是很便捷的,而且fireworks用法简单,配合dw在做网站这一块往往会发挥出很强大的效果。百度网盘下载链接:https://pan.baidu.com/s/1fzIZszfy8VX6VzQBM_bdZQ
navicat for mysql中文绿色版网盘下载 1623
Navicat for Mysql是用于Mysql数据库管理的一款图形化管理软件,非常的便捷和好用,可以方便的增删改查数据库、数据表、字段、支持mysql命令,视图等等。百度网盘下载链接:https://pan.baidu.com/s/1T_tlgxzdQLtDr9TzptoWQw 提取码:y2yq
火车头采集器(旗舰版)绿色版网盘下载 1706
火车头采集器是站长常用的工具,相比于八爪鱼,简洁好用,易于配置。火车头能够轻松的抓取网页内容,并通过自带的工具对内容进行处理。站长圈想要做网站,火车头采集器是必不可少的。百度网盘链接:https://pan.baidu.com/s/1u8wUqS901HgOmucMBBOvEA
Photoshop(CS-2015-2023)绿色中文版软件下载 1822
安装文件清单(共46G)包含Window和Mac OS各个版本的安装包,从cs到cc,从绿色版到破解版,从安装文件激活工具,应有尽有,一次性打包。 Photoshop CC绿色精简版 Photoshop CS6 Mac版 Photoshop CC 2015 32位 Photoshop CC 2015 64位 Photoshop CC 2015 MAC版 Photoshop CC 2017 64位 Adobe Photoshop CC 2018 Adobe_Photoshop_CC_2018 Photoshop CC 2018 Win32 Photoshop CC 2018 Win64