spring-xmemcached 集成

来源:互联网 发布:小米手机抢购软件 编辑:程序博客网 时间:2024/06/05 10:51

memcached和spring集成   

1、首先安装memcached客户端; 2、导入项目jar 包  xmemcached-2.0.0.jar  memcached-java-2.5.1.jar slf4j-log4j12-1.7.10.jar slf4j-api-1.7.9.jar slf4j-jcl-1.7.10.jar

3 配置spring 配置文件 applicationContext.xml文件

<!-- memcachedClientBuilder配置 -->
<bean id="memcachedClientConfiguration" class="com.google.code.yanf4j.config.Configuration" > 
<property name="sessionIdleTimeout" value="300000"><!--空闲时间-->
</property>
</bean>
<bean id="memcachedClientBuilder" class="net.rubyeye.xmemcached.XMemcachedClientBuilder">  
        <constructor-arg>  
            <list>  
                <bean class="java.net.InetSocketAddress">  
                    <constructor-arg value="localhost"/>  
                    <constructor-arg value="11211"/>  
                </bean>  
            </list>  
        </constructor-arg>  
        <property name="connectionPoolSize" value="5"/>  
        <property name="commandFactory">  
            <bean class="net.rubyeye.xmemcached.command.BinaryCommandFactory"/>  
        </property>  
        <property name="transcoder">  
            <bean class="net.rubyeye.xmemcached.transcoders.SerializingTranscoder" />  
        </property>  
    </bean>  

<!--memcached客户端-->

 <bean id="memcachedClient" factory-bean="memcachedClientBuilder" factory-method="build" destroy-method="shutdown">
     <property name="enableHeartBeat" value="false"  ><!--禁止心跳检测   防止输出日志-->
        </property>
    </bean>  
       

<!--配置缓存管理器-->
    <bean id="cacheManager" class="xxx.MemcachedCacheManager">  
        <property name="memcachedClient" ref="memcachedClient" />  
        <property name="configMap">  
            <map>  
                <!-- key:@Cacheable、@CachePut、@CacheEvict等的name属性。value:缓存过期时间(单位:秒),默认值:0 -->  
                <entry key="typeList" value="3600" />  
            </map>  
        </property>  
    </bean>

    <cache:annotation-driven cache-manager="cacheManager"/>  


cacheManager 缓存管理器类

public class MemcachedCacheManager extends  AbstractTransactionSupportingCacheManager {
    private ConcurrentMap<String, Cache> cacheMap = new ConcurrentHashMap<String, Cache>();   
   private Map<String, Integer> expireMap = new HashMap<String, Integer>();    
   private MemcachedClient memcachedClient;   
 
   public MemcachedCacheManager(){ }     
   @Override  
   protected Collection<? extends Cache> loadCaches()   
   {   
       Collection<Cache> values = cacheMap.values();   
       return values;   
   }   
 
   @Override  
   public Cache getCache(String name)   
   {   
       Cache cache = cacheMap.get(name);   
       if (cache == null)   
       {   
           Integer expire = expireMap.get(name);   
           if (expire == null)   
           {   
               expire = 0;   
               expireMap.put(name, expire);   
           }             
           cache = new MemcachedCache(name, expire.intValue(), memcachedClient);   
           cacheMap.put(name, cache);   
       }   
       return cache;   
   }   
 
   public void setMemcachedClient(MemcachedClient memcachedClient)   
   {   
       this.memcachedClient = memcachedClient;   
   }   
 
   public void setConfigMap(Map<String, Integer> configMap)   
   {   
       this.expireMap = configMap;   
   }   


}


自定义memcached 客户端

public class MemcachedCache implements Cache {


private final String name;   
    private final MemcachedClient memcachedClient;   
    private final MemCache memCache;   
       
    public MemcachedCache(String name, int expire, MemcachedClient memcachedClient)   
    {   
        this.name = name;   
        this.memcachedClient = memcachedClient;    
        this.memCache = new MemCache(name, expire, memcachedClient);   
    }   
  
    @Override  
    public void clear()   
    {   
        memCache.clear();   
    }   
  
    @Override  
    public void evict(Object key)   
    {   
        memCache.delete(key.toString());   
    }   
  
    @Override  
    public ValueWrapper get(Object key)   
    {   
        ValueWrapper wrapper = null;   
        Object value = memCache.get(key.toString());   
        if (value != null)   
        {   
            wrapper = new SimpleValueWrapper(value);   
        }   
        return wrapper;   
    }   
  
    @Override  
    public String getName()   
    {   
        return this.name;   
    }   
  
    @Override  
    public MemcachedClient getNativeCache()   
    {   
        return this.memcachedClient;   
    }   
  
    @Override  
    public void put(Object key, Object value)   
    {   
        memCache.put(key.toString(), value);   
    }


@Override
public <T> T get(Object arg0, Class<T> arg1) {
return null;
}   


}


  配置MemCache .java

public class MemCache {


private static Logger log = LoggerFactory.getLogger(MemCache.class);


private Set<String> keySet = new HashSet<String>();
private final String name;
private final int expire;
private final MemcachedClient memcachedClient;
public MemCache(String name, int expire, MemcachedClient memcachedClient) {
this.name = name;
this.expire = expire;
this.memcachedClient = memcachedClient;
}


public Object get(String key) {
Object value = null;
try {
key = this.getKey(key);
value = memcachedClient.get(key);
} catch (TimeoutException e) {
log.warn("获取 Memcached 缓存超时", e);
} catch (InterruptedException e) {
log.warn("获取 Memcached 缓存被中断", e);
} catch (MemcachedException e) {
log.warn("获取 Memcached 缓存错误", e);
}
return value;
}


public void put(String key, Object value) {
if (value == null)
return;


try {
key = this.getKey(key);
memcachedClient.setWithNoReply(key, expire, value);
keySet.add(key);
} catch (InterruptedException e) {
log.warn("更新 Memcached 缓存被中断", e);
} catch (MemcachedException e) {
log.warn("更新 Memcached 缓存错误", e);
}
}


public void clear() {
for (String key : keySet) {
try {
memcachedClient.deleteWithNoReply(this.getKey(key));
} catch (InterruptedException e) {
log.warn("删除 Memcached 缓存被中断", e);
} catch (MemcachedException e) {
log.warn("删除 Memcached 缓存错误", e);
}
}
}


public void delete(String key) {
try {
key = this.getKey(key);
memcachedClient.deleteWithNoReply(key);
} catch (InterruptedException e) {
log.warn("删除 Memcached 缓存被中断", e);
} catch (MemcachedException e) {
log.warn("删除 Memcached 缓存错误", e);
}
}


private String getKey(String key) {
return name + "_" + key;
}


}


接着在业务类中调用memcached的客户端

cacheManager=(cacheManager)BeanFactory.getMemcachedManager("cacheManager");//获取缓存管理器

Cache cache=cacheManager.getCache("CacheName");//获取缓存名称

ValueWrapper valueWrapper=cache.get("key");

value=valueWrapper.get();//获取缓存内容

cache.put(key,value);//存入缓存


0 0