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);//存入缓存