Java环境下Memcached应用详解

c#小王子 c#小王子 2022-03-01 466 Java

这里将介绍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的图表

使用-JFreeChart来创建基于web的图表

XStream使用文档

XStream使用文档

WebService发布过程及常见问题

WebService发布过程及常见问题

webpack实战入门进阶调优分享

webpack实战入门进阶调优分享

weblogic调优参数及监控指标

weblogic调优参数及监控指标

weblogic节点管理

weblogic节点管理

weblogic管理控制台概述

weblogic管理控制台概述

weblogic-部署和启动

weblogic-部署和启动

WebLogic-Server-性能及调优-调优-Java-虚拟机

Java 虚拟机(Java virtual machine,简称 JVM)是一种虚拟“执行引擎”实例,可在微处理器上执行 Java 类文件中的字节码。调整 JVM 的方式会影响 Weblogic Server 和应用程序的性能。

Velocity用户教程

Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。

Velocity用户手册

Velocity 用户手册是帮助页面设计者和内容提供者认识 Velocity 和其简单而功能强大的脚本语言――Velocity 模板语言(VTL)。在手册上的许多例子,都是用 Velocity 插入动态的内容到网页上,但是所有的 VLT 例子都能应用到其他的页面和模板中。


文章热度: 166291
文章数量: 333
推荐阅读

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

知之

知之平台是全球领先的知识付费平台。提供各个领域的项目实战经验分享,提供优质的行业解决方案信息,来帮助您的工作和学习

使用指南 建议意见 用户协议 友情链接 隐私政策 Powered by NOOU ©2020 知之