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 plain copy
  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 plain copy
  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 plain copy
  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状态。

你可能感兴趣的:(spring集成memcache 示例一)