Spring使用注解式@Cache集成xmemcache

转自:http://tom-seed.iteye.com/blog/2104416

需要注意的是扩展支持注解需要Spring AOP的支持,需要导入相应的jar包:

1.aopalliance-1.0.jar

2.aopalliance-alpha1.jar

3.slf4j-api-1.7.5.jar

其中slf4j-api-1.7.5.jar提供的是日志的接口规范,如果工程目录下使用的是log4j,则slf4j-api-1.7.5.jar会绑定调用log4j.jar。

具体说明可以访问http://blog.csdn.net/tengdazhang770960436/article/details/18006127

 

从头开始进行配置,步骤如下:

1.添加xmemcache.jar包至工程中;

  • aopalliance-1.0.jar
  • aopalliance-alpha1.jar
  • slf4j-api-1.7.5.jar
  • xmemcached-1.3.8.jar

2.在web.xml文件中添加配置

 

Xml代码   收藏代码
  1. <context-param>    
  2.     <param-name>contextConfigLocation</param-name>    
  3.     <param-value>    
  4.         /WEB-INF/conf/spring/*-beans.xml    
  5.     </param-value>    
  6. </context-param>  

 

 

3.在属性文件中添加如下配置:

 

Java代码   收藏代码
  1. #memcache配置    
  2. memcache.ip=127.0.0.1    
  3. memcache.port=11211    
  4. memcache.pool.size=5    

 

 

4.在/WEB-INF/conf/spring/目录下添加配置文件memcache-beans.xml

 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:cache="http://www.springframework.org/schema/cache"  
  4.     xsi:schemaLocation="    
  5.         http://www.springframework.org/schema/beans    
  6.         http://www.springframework.org/schema/beans/spring-beans-3.2.xsd    
  7.         http://www.springframework.org/schema/cache    
  8.         http://www.springframework.org/schema/cache/spring-cache-3.2.xsd"  
  9.     default-autowire="byName">  
  10.   
  11.     <bean id="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">  
  12.         <constructor-arg>  
  13.             <list>  
  14.                 <bean class="java.net.InetSocketAddress">  
  15.                     <constructor-arg value="${memcache.ip}" />  
  16.                     <constructor-arg value="${memcache.port}" />  
  17.                 </bean>  
  18.             </list>  
  19.         </constructor-arg>  
  20.         <property name="connectionPoolSize" value="${memcache.pool.size}" />  
  21.         <property name="commandFactory">  
  22.             <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory" />  
  23.         </property>  
  24.         <property name="transcoder">  
  25.             <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />  
  26.         </property>  
  27.     </bean>  
  28.   
  29.     <bean id="memcachedClient" factory-bean="memcachedClientBuilder"  
  30.         factory-method="build" destroy-method="shutdown" />  
  31.           
  32.     <bean id="cacheManager" class="com.iaccount.framework.cache.memcache.MemcachedCacheManager">  
  33.         <property name="memcachedClient" ref="memcachedClient" />  
  34.         <property name="configMap">  
  35.             <map>  
  36.                 <!-- key:@Cacheable、@CachePut、@CacheEvict等的value属性。value:缓存过期时间(单位:秒),默认值:0 -->  
  37.                 <entry key="defaultCache" value="0" /><!-- 默认缓存区 不过期 -->  
  38.                 <entry key="inTimeCache" value="3600" /><!-- 实时缓存区 一小时过期 -->  
  39.             </map>  
  40.         </property>  
  41.     </bean>  
  42.   
  43.     <cache:annotation-driven cache-manager="cacheManager" />  
  44. </beans>  

 

 

5.参考了EHCacheCacheManager的源码,写了一个基于XMemcached的MemcachedCacheManager

a.memcache缓存连接类 MemCache.java  

 

Java代码   收藏代码
  1. import java.util.HashSet;  
  2. import java.util.Set;  
  3. import java.util.concurrent.TimeoutException;  
  4.   
  5. import net.rubyeye.xmemcached.MemcachedClient;  
  6. import net.rubyeye.xmemcached.exception.MemcachedException;  
  7.   
  8. import org.slf4j.Logger;  
  9. import org.slf4j.LoggerFactory;  
  10.   
  11. public class MemCache {  
  12.       
  13.     private static Logger log = LoggerFactory.getLogger(MemCache.class);  
  14.   
  15.     private Set<String> keySet = new HashSet<String>();  
  16.     private final String name;  
  17.     private final int expire;  
  18.     private final MemcachedClient memcachedClient;  
  19.   
  20.     public MemCache(String name, int expire, MemcachedClient memcachedClient) {  
  21.         this.name = name;  
  22.         this.expire = expire;  
  23.         this.memcachedClient = memcachedClient;  
  24.     }  
  25.   
  26.     public Object get(String key) {  
  27.         Object value = null;  
  28.         try {  
  29.             key = this.getKey(key);  
  30.             value = memcachedClient.get(key);  
  31.         } catch (TimeoutException e) {  
  32.             log.warn("获取 Memcached 缓存超时", e);  
  33.         } catch (InterruptedException e) {  
  34.             log.warn("获取 Memcached 缓存被中断", e);  
  35.         } catch (MemcachedException e) {  
  36.             log.warn("获取 Memcached 缓存错误", e);  
  37.         }  
  38.         return value;  
  39.     }  
  40.   
  41.     public void put(String key, Object value) {  
  42.         if (value == null)  
  43.             return;  
  44.         try{  
  45.             key = this.getKey(key);  
  46.             memcachedClient.setWithNoReply(key, expire, value);  
  47.             keySet.add(key);  
  48.         }catch (InterruptedException e){  
  49.             log.warn("更新 Memcached 缓存被中断", e);  
  50.         }catch (MemcachedException e){  
  51.             log.warn("更新 Memcached 缓存错误", e);  
  52.         }  
  53.     }  
  54.   
  55.     public void clear(){  
  56.         for (String key : keySet){  
  57.             try{  
  58.                 memcachedClient.deleteWithNoReply(this.getKey(key));  
  59.             }catch (InterruptedException e){  
  60.                 log.warn("删除 Memcached 缓存被中断", e);  
  61.             }catch (MemcachedException e){  
  62.                 log.warn("删除 Memcached 缓存错误", e);  
  63.             }  
  64.         }  
  65.     }  
  66.   
  67.     public void delete(String key){  
  68.         try{  
  69.             key = this.getKey(key);  
  70.             memcachedClient.deleteWithNoReply(key);  
  71.         }catch (InterruptedException e){  
  72.             log.warn("删除 Memcached 缓存被中断", e);  
  73.         }catch (MemcachedException e){  
  74.             log.warn("删除 Memcached 缓存错误", e);  
  75.         }  
  76.     }  
  77.   
  78.     private String getKey(String key){  
  79.         return name + "_" + key;  
  80.     }  
  81. }  

 

 

b.缓存类  MemcachedCache.java  

 

Java代码   收藏代码
  1. import net.rubyeye.xmemcached.MemcachedClient;  
  2.   
  3. import org.springframework.cache.Cache;  
  4. import org.springframework.cache.support.SimpleValueWrapper;  
  5.   
  6. public class MemcachedCache implements Cache{  
  7.     private final String name;  
  8.     private final MemcachedClient memcachedClient;  
  9.     private final MemCache memCache;  
  10.       
  11.     public MemcachedCache(String name, int expire, MemcachedClient memcachedClient){  
  12.         this.name = name;  
  13.         this.memcachedClient = memcachedClient;   
  14.         this.memCache = new MemCache(name, expire, memcachedClient);  
  15.     }  
  16.   
  17.     @Override  
  18.     public void clear(){  
  19.         memCache.clear();  
  20.     }  
  21.   
  22.     @Override  
  23.     public void evict(Object key){  
  24.         memCache.delete(key.toString());  
  25.     }  
  26.   
  27.     @Override  
  28.     public ValueWrapper get(Object key){  
  29.         ValueWrapper wrapper = null;  
  30.         Object value = memCache.get(key.toString());  
  31.         if (value != null){  
  32.             wrapper = new SimpleValueWrapper(value);  
  33.         }  
  34.         return wrapper;  
  35.     }  
  36.   
  37.     @Override  
  38.     public String getName(){  
  39.         return this.name;  
  40.     }  
  41.   
  42.     @Override  
  43.     public MemcachedClient getNativeCache(){  
  44.         return this.memcachedClient;  
  45.     }  
  46.   
  47.     @Override  
  48.     public void put(Object key, Object value){  
  49.         memCache.put(key.toString(), value);  
  50.     }  
  51. }  

 

 

c.缓存管理类  MemcachedCacheManager.java

 

Java代码   收藏代码
  1. import java.util.Collection;  
  2. import java.util.HashMap;  
  3. import java.util.Map;  
  4. import java.util.concurrent.ConcurrentHashMap;  
  5. import java.util.concurrent.ConcurrentMap;  
  6.   
  7. import net.rubyeye.xmemcached.MemcachedClient;  
  8.   
  9. import org.springframework.cache.Cache;  
  10. import org.springframework.cache.transaction.AbstractTransactionSupportingCacheManager;  
  11.   
  12. public class MemcachedCacheManager extends AbstractTransactionSupportingCacheManager {  
  13.     private ConcurrentMap<String, Cache> cacheMap = new ConcurrentHashMap<String, Cache>();  
  14.     private Map<String, Integer> expireMap = new HashMap<String, Integer>();  
  15.   
  16.     private MemcachedClient memcachedClient;  
  17.   
  18.     public MemcachedCacheManager(){  
  19.     }  
  20.   
  21.     @Override  
  22.     protected Collection<? extends Cache> loadCaches(){  
  23.         Collection<Cache> values = cacheMap.values();  
  24.         return values;  
  25.     }  
  26.   
  27.     @Override  
  28.     public Cache getCache(String name){  
  29.         Cache cache = cacheMap.get(name);  
  30.         if (cache == null){  
  31.             Integer expire = expireMap.get(name);  
  32.             if (expire == null){  
  33.                 expire = 0;  
  34.                 expireMap.put(name, expire);  
  35.             }  
  36.             cache = new MemcachedCache(name, expire.intValue(), memcachedClient);  
  37.             cacheMap.put(name, cache);  
  38.         }  
  39.         return cache;  
  40.     }  
  41.   
  42.     public void setMemcachedClient(MemcachedClient memcachedClient){  
  43.         this.memcachedClient = memcachedClient;  
  44.     }  
  45.   
  46.     public void setConfigMap(Map<String, Integer> configMap){  
  47.         this.expireMap = configMap;  
  48.     }  
  49. }  

 

 

6.数据操作类

 

Java代码   收藏代码
  1. @Cacheable(value="defaultCache")  
  2. public List<FmSupplier> getEnableSuppliers(){  
  3.     FmSupplierQuery query = new FmSupplierQuery();  
  4.     query.setIsDeleted(YesNoType.NO.getCode());  
  5.     query.setSupplierStatus(SupplierStatus.ENABLE.getCode());  
  6.     return fmSupplierMapper.selectListByQuery(query);  
  7. }  
  8.   
  9. @Cacheable(value="defaultCache", key="#id")  
  10. public FmSupplier selectByPrimaryKey(Long id){  
  11.     return fmSupplierMapper.selectByPrimaryKey(id);  
  12. }  

 

 

1.在缓存区defaultCache中获取数据,第一次请求时无数据,则会从数据库中获取并放至缓存中;

2.第二次请求时则直接从缓存中获取;

猜你喜欢

转载自fanfeiyang.iteye.com/blog/2217235