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這個,代碼如下:

[java] view plaincopy
  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.       
  73. }  


然後是要擴展AbstractCacheManager這個緩存管理抽象類,它主要負責生成和讀取Cache,代碼如下:

[java] view plaincopy
  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.      
  59. }  

配置bean:

[html] view plaincopy
  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>  


其中memcachedClient爲你memcache的客戶端,你可以配置多個MemcacheCache,配置完這裏你就你就可以把@Cacheable(value="testCache")添加到方法那來緩存執行結果,這裏value="testCache"的值必須和上面bean文件配置的一致,否則無法緩存。這只是做了個簡單的集成,還有很多要完善的,比如連接時檢查memcache狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章