`

Java环境下Memcached应用详解

    博客分类:
  • java
阅读更多
转自:http://developer.51cto.com  2009-09-17 10:59  yxq375  ITPUB 

这里将介绍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;  }  } Spring的AOP配置如下:

Java代码

<aop:config proxy-target-class="true">     <aop:advisor     pointcut="execution(* ×××.PoiService.getOne(..))"    advice-ref="PoiServiceCachingAdvice" />     aop:config>      <bean id="BasPoiServiceCachingAdvice"    class="×××.core.cache.CachingInterceptor">     <property name="cacheKey" value="PoiService" />     <property name="cacheService" ref="cacheService" />     bean> 
分享到:
评论

相关推荐

    Java环境下Memcached应用详解.docx

    【Java环境下Memcached应用详解】 Memcached是一款高性能的分布式内存对象缓存系统,常用于缓解数据库的压力,提高网站性能。在Java环境下,Memcached能够作为集群环境下的缓存解决方案,适用于处理大量数据并需要...

    java环境下Memcached应用详解

    Java环境下Memcached应用详解 Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。在Java环境下,我们可以利用各种客户端库来与Memcached服务器进行...

    java 写的memCached小例子.

    **Java实现Memcached小例子详解** Memcached是一种高性能的分布式内存对象缓存系统,它能够将数据存储在内存中,从而提高应用程序的响应速度。在Java中,我们可以使用各种库来与Memcached进行交互,例如...

    Java生产环境下性能监控与调优详解课程笔记(完整版)

    这份"Java生产环境下性能监控与调优详解课程笔记(完整版)"涵盖了多个重要的知识点,旨在帮助开发者和运维人员提升Java应用的性能。 一、Java性能监控工具 1. JVisualVM:集成在JDK中的一个多用途工具,可以进行...

    Memcached-Java-Client-release_2.6.1.zip

    《Java与Memcached整合详解——基于Memcached-Java-Client 2.6.1》 在现代Web开发中,缓存技术是提升系统性能的重要手段之一。Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于缓解数据库负载,提高响应...

    memcached缓存使用演示

    **Memcached缓存系统详解与应用实践** Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于Web应用中,用于减轻数据库的负载,提高数据访问速度。它通过将数据存储在内存中,使得数据的读取速度大大提高,...

    memcached java客户端驱动包

    **Memcached Java客户端驱动包详解** Memcached是一种高性能的分布式内存对象缓存系统,用于减少数据库负载,提高网站性能。Java连接Memcached的驱动包使得Java开发者能够方便地与Memcached进行交互,实现数据的...

    memcached与JAVA实例文档

    在Java开发环境中,Memcached被广泛用于存储临时数据,提升应用响应速度。本文将深入探讨Memcached的基本概念、安装过程以及如何在Java项目中使用它。 ### 1. Memcached基本概念 - **分布式存储**:Memcached通过...

    memcached 完整的项目,服务端(win) 客户端 包括jar包

    **Memcached 完整项目详解** Memcached 是一个高性能、分布式的内存对象缓存系统,用于在应用服务器之间共享数据,减少数据库负载。这个项目包含了 Memcached 的服务端(适用于 Windows)以及 Java 客户端,是开发...

    Memcached基于Linux的安装详解以及需要的jar包

    Memcached是一种高性能、分布式内存对象缓存系统,用于在分布式计算环境中缓解数据库负载,提高应用程序的性能。在Linux操作系统上安装Memcached涉及多个步骤,包括下载源码、编译、配置以及启动服务。以下是详细的...

    memcached安装包以及MemCachedClient

    **Memcached 安装与使用详解** Memcached 是一款高性能的分布式内存缓存系统,用于在Web应用中减轻数据库负载。它将数据存储在内存中,以键值对的形式提供快速访问,尤其适用于高并发场景。Memcached 使用简单,可...

    Memcached之java客户端开发

    **Memcached之Java客户端开发详解** Memcached是一种高性能、分布式内存对象缓存系统,用于减少数据库负载,提高网站性能。它通过将数据存储在内存中,以快速响应来自应用程序的请求,避免了反复读取数据库的开销。...

    java MemCached window从安装到使用详细文档

    ### Java MemCached Window 从安装到使用的详细指南 #### 一、MemCached简介 Memcached是一种高性能、分布式内存对象...通过这些指导,你可以轻松地将Memcached集成到Java应用中,从而提高数据访问速度和应用性能。

    memcached缓存

    本文将深入探讨memcached与Java的结合使用,以及在Windows和Linux环境下的安装步骤。 **1. memcached的基本概念** - **分布式缓存**:memcached是一种分布式缓存解决方案,它可以将数据分散存储在多台服务器上,...

    Memcached网站应用实战

    ### Memcached网站应用实战知识点详解 #### 一、Memcached简介 Memcached是一个高性能的分布式内存对象缓存系统,主要用于缓解数据库压力,提高动态网页应用的响应速度。它通过在内存中维护一个巨大的hash表来存储...

    MemCached Cache Java Client封装优化历程.docx

    【Memcached 缓存系统详解】 Memcached 是一个高性能、分布式的内存对象缓存系统,主要用于减少数据库的负载,提高应用程序的性能。它通过在内存中存储数据来提供快速访问,而不是每次请求时都去查询数据库。...

    memcached版本包

    **Memcached版本包详解** Memcached是一款高性能、分布式内存对象缓存系统,它广泛应用于Web应用中,用于减轻数据库负载,提升数据访问速度...正确理解和使用Memcached,对于优化高并发环境下的应用程序具有重要意义。

    Memcached_原理和使用详解

    - **事件驱动**:利用libevent库进行事件处理,支持多种事件模型如poll、select、epoll、kqueue等,能够在高并发环境下保持高效的响应速度。 - **内存存储**:所有数据都存储在内存中,不涉及磁盘操作,从而实现了...

Global site tag (gtag.js) - Google Analytics