spring缓存集成memcache

spring3.1.0开始支持注解方式的缓存实现,非常方便,不过它目前只支持java内置的ConcurrentMap和ehcache这两种缓存方式,因为项目用到memcache,就想把memcache集成到spring内置的缓存中,使memcache也能用注解方式来调用。于是参考ehcache的集成方式,把memcache集成到项目中。spring把所有缓存都抽象为一个cache,相当于一个缓存集合,即spring缓存注解@Cacheable(value="xxx")中xxx对应的结果集合。首先我们要实现Cache这个接口,memcache的java客户端我们用的是com.danga.MemCached.MemCachedClient这个,代码如下:

  1. public class MemcacheCache implements Cache { 
  2.    
  3.   private MemCachedClient client; 
  4.   private String name; 
  5.    
  6.   public MemcacheCache(){ 
  7.      
  8.   } 
  9.    
  10.   public MemcacheCache(String name,MemCachedClient client) { 
  11.     Assert.notNull(client, "Memcache client must not be null"); 
  12.     // TODO validate memcache "alive" 
  13.     this.client = client; 
  14.     this.name = name; 
  15.   } 
  16.    
  17.   @Override 
  18.   @Cacheable(value="xxxx"
  19.   public String getName() { 
  20.     return this.name; 
  21.   } 
  22.    
  23.   @Override 
  24.   public Object getNativeCache() { 
  25.     return this.client; 
  26.   } 
  27.    
  28.   @Override 
  29.   public ValueWrapper get(Object key) { 
  30.     Object value = this.client.get(objectToString(key)); 
  31.     return (value != null ? new SimpleValueWrapper(value) : null); 
  32.   } 
  33.    
  34.   @Override 
  35.   public void put(Object key, Object value) { 
  36.     this.client.set(objectToString(key), value); 
  37.      
  38.   } 
  39.    
  40.   @Override 
  41.   public void evict(Object key) { 
  42.     this.client.delete(objectToString(key)); 
  43.      
  44.   } 
  45.    
  46.   @Override 
  47.   public void clear() { 
  48.     // TODO delete all data    
  49.   } 
  50.    
  51.   private static String objectToString(Object object) { 
  52.     if (object == null) { 
  53.       return null
  54.     } else if (object instanceof String) { 
  55.       return (String) object; 
  56.     } else
  57.       return object.toString(); 
  58.     } 
  59.   } 
  60.    
  61.   public void setClient(MemCachedClient client){ 
  62.     this.client = client; 
  63.   } 
  64.  
  65.   public MemCachedClient getClient() { 
  66.     return client; 
  67.   } 
  68.  
  69.   public void setName(String name) { 
  70.     this.name = name; 
  71.   } 
  72.      
public class MemcacheCache implements Cache {
  
  private MemCachedClient client;
  private String name;
  
  public MemcacheCache(){
    
  }
  
  public MemcacheCache(String name,MemCachedClient client) {
    Assert.notNull(client, "Memcache client must not be null");
    // TODO validate memcache "alive"
    this.client = client;
    this.name = name;
  }
  
  @Override
  @Cacheable(value="xxxx")
  public String getName() {
    return this.name;
  }
  
  @Override
  public Object getNativeCache() {
    return this.client;
  }
  
  @Override
  public ValueWrapper get(Object key) {
    Object value = this.client.get(objectToString(key));
    return (value != null ? new SimpleValueWrapper(value) : null);
  }
  
  @Override
  public void put(Object key, Object value) {
    this.client.set(objectToString(key), value);
    
  }
  
  @Override
  public void evict(Object key) {
    this.client.delete(objectToString(key));
    
  }
  
  @Override
  public void clear() {
    // TODO delete all data   
  }
  
  private static String objectToString(Object object) {
    if (object == null) {
      return null;
    } else if (object instanceof String) {
      return (String) object;
    } else {
      return object.toString();
    }
  }
  
  public void setClient(MemCachedClient client){
    this.client = client;
  }

  public MemCachedClient getClient() {
    return client;
  }

  public void setName(String name) {
    this.name = name;
  }
    
}


然后是要扩展AbstractCacheManager这个缓存管理抽象类,它主要负责生成和读取Cache,代码如下:

  1. public class MemcacheCacheManager extends AbstractCacheManager { 
  2.    
  3.   private Collection<Cache> caches; 
  4.   private MemCachedClient client = null
  5.    
  6.   public MemcacheCacheManager() { 
  7.  
  8.   } 
  9.    
  10.   public MemcacheCacheManager(MemCachedClient client){ 
  11.     setClient(client); 
  12.   } 
  13.    
  14.   @Override 
  15.   protected Collection<? extends Cache> loadCaches() {     
  16.     return this.caches; 
  17.   } 
  18.    
  19.   public void setCaches(Collection<Cache> caches) { 
  20.     this.caches = caches; 
  21.   } 
  22.    
  23.   public void setClient(MemCachedClient client) { 
  24.     this.client = client; 
  25.     updateCaches(); 
  26.   } 
  27.    
  28.   public Cache getCache(String name){ 
  29.     checkState(); 
  30.      
  31.     Cache cache = super.getCache(name); 
  32.     if(cache == null){ 
  33.       cache = new MemcacheCache(name, client); 
  34.       addCache(cache); 
  35.     } 
  36.     return cache; 
  37.   } 
  38.    
  39.   private void checkState() { 
  40.     if(client == null){ 
  41.       throw new IllegalStateException("MemcacheClient must not be null."); 
  42.     } 
  43.     //TODO check memcache state 
  44.      
  45.   } 
  46.  
  47.   private void updateCaches() { 
  48.     if(caches != null){ 
  49.       for(Cache cache : caches){ 
  50.         if(cache instanceof MemcacheCache){ 
  51.           MemcacheCache memcacheCache = (MemcacheCache)cache; 
  52.           memcacheCache.setClient(client); 
  53.         } 
  54.       } 
  55.     } 
  56.      
  57.   } 
  58.     
public class MemcacheCacheManager extends AbstractCacheManager {
  
  private Collection<Cache> caches;
  private MemCachedClient client = null;
  
  public MemcacheCacheManager() {

  }
  
  public MemcacheCacheManager(MemCachedClient client){
    setClient(client);
  }
  
  @Override
  protected Collection<? extends Cache> loadCaches() {    
    return this.caches;
  }
  
  public void setCaches(Collection<Cache> caches) {
    this.caches = caches;
  }
  
  public void setClient(MemCachedClient client) {
    this.client = client;
    updateCaches();
  }
  
  public Cache getCache(String name){
    checkState();
    
    Cache cache = super.getCache(name);
    if(cache == null){
      cache = new MemcacheCache(name, client);
      addCache(cache);
    }
    return cache;
  }
  
  private void checkState() {
    if(client == null){
      throw new IllegalStateException("MemcacheClient must not be null.");
    }
    //TODO check memcache state
    
  }

  private void updateCaches() {
    if(caches != null){
      for(Cache cache : caches){
        if(cache instanceof MemcacheCache){
          MemcacheCache memcacheCache = (MemcacheCache)cache;
          memcacheCache.setClient(client);
        }
      }
    }
    
  }
   
}

配置bean:

  1. <bean id="cacheManager" class="com.youboy.cshop.utils.memcache.MemcacheCacheManager"> 
  2.     <property name="client" value="memcachedClient"/> 
  3.     <property name="caches"> 
  4.         <set> 
  5.             <bean class="com.youboy.cshop.utils.memcache.MemcacheCache"> 
  6.                 <property name="name" value="testCache"/> 
  7.                 <property name="client" ref="memcachedClient"/> 
  8.             </bean> 
  9.         </set> 
  10.     </property> 
  11. </bean> 
<bean id="cacheManager" class="com.youboy.cshop.utils.memcache.MemcacheCacheManager">
	<property name="client" value="memcachedClient"/>
	<property name="caches">
		<set>
			<bean class="com.youboy.cshop.utils.memcache.MemcacheCache">
				<property name="name" value="testCache"/>
				<property name="client" ref="memcachedClient"/>
			</bean>
		</set>
	</property>
</bean>


其中memcachedClient为你memcache的客户端,你可以配置多个MemcacheCache,配置完这里你就你就可以把@Cacheable(value="testCache")添加到方法那来缓存执行结果,这里value="testCache"的值必须和上面bean文件配置的一致,否则无法缓存。这只是做了个简单的集成,还有很多要完善的,比如连接时检查memcache状态。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值