`
半糖主义
  • 浏览: 21527 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

XMemcached与Spring3.2缓存框架集成

 
阅读更多

从Spring3.1开始,增加了抽像缓存框架,利用Spring3.1提供的注释,可以很方便的使用缓存,Spring官方给出基于Map和EHCache的实现,正好最近在用Memcached,参考了EHCacheCacheManager的源码,写了一个基于XMemcached的MemcachedCacheManager。

直接上代码(注:只支持Spring3.2以上版本)

 

1、MemcachedCacheManager.java

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;
	}

}

 2、MemcachedCache.java

 

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);
	}
}

 3、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;
	}
}

 4、配置文件 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:cache="http://www.springframework.org/schema/cache"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
		http://www.springframework.org/schema/cache
		http://www.springframework.org/schema/cache/spring-cache-3.2.xsd"
		default-autowire="byName">
	
	<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>
	
	<bean id="memcachedClient" factory-bean="memcachedClientBuilder" factory-method="build" destroy-method="shutdown"/>
	
	<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"/>
	
</beans>

 至于如何使用Spring的@Cachable,google上一大堆,我就不再重复了。

分享到:
评论
6 楼 hahashuxue 2015-03-16  
configMap是什么memcachedManager里面也没有 运行报错
5 楼 yellowatumn 2014-12-09  
<property name="configMap"> 
            <map> 
                <!-- key:@Cacheable、@CachePut、@CacheEvict等的name属性。value:缓存过期时间(单位:秒),默认值:0 --> 
                <entry key="typeList" value="3600" /> 
            </map> 
        </property>
个人觉的这一段配置可以不要
4 楼 junxu1206 2013-09-03  
请问下楼主这个是什么意思
<property name="configMap"> 
            <map> 
                <!-- key:@Cacheable、@CachePut、@CacheEvict等的name属性。value:缓存过期时间(单位:秒),默认值:0 --> 
                <entry key="typeList" value="3600" /> 
            </map> 
        </property>
这个configMap哪儿定义了,还有关于 @Cacheable这样有个value的值是在哪儿获取的或者怎么设置的,可能我不太明白这个,如果有时间看到了谢谢解答一下,先谢
3 楼 半糖主义 2013-08-23  
ufohjl 写道
我觉得楼主对AbstractTransactionSupportingCacheManager的理解有点偏差

Spring自带的EhCacheManager也这样写
2 楼 ufohjl 2013-08-03  
我觉得楼主对AbstractTransactionSupportingCacheManager的理解有点偏差
1 楼 peter_wwhe 2013-07-18  

相关推荐

    征服 Kestrel + XMemcached + Spring TaskExecutor

    通过XMemcached,开发者可以方便地在Java应用中集成缓存功能,优化数据读取速度,降低对后端数据库的依赖。 Spring TaskExecutor是Spring框架的一部分,提供了异步任务执行的能力。它允许开发者创建线程池,调度和...

    xmemcached

    8. **易于集成**:Xmemcached与Spring框架有很好的兼容性,可以方便地与Spring的缓存抽象层集成,简化开发工作。 **Xmemcached版本1.3.3** 版本1.3.3是Xmemcached的一个稳定版本,可能包含了一些错误修复、性能...

    Xmemcached/jedis springdemo

    【Xmemcached/jedis Spring Demo】是一个整合了Xmemcached和jedis的Spring示例项目,旨在帮助开发者理解和学习如何在Spring框架中集成并使用这两种流行的NoSQL客户端库。Xmemcached是Java编写的高效、易用的...

    Xmemcached官方中文手册

    这份手册不仅包含了基础的API使用方法,还涵盖了如何将Xmemcached与Spring等主流框架进行集成的详细配置信息。 **1. Xmemcached框架介绍** Xmemcached由Kafka Chen发起,设计目标是提供一个简单易用且高效的...

    Ehcache+xmemcached+redis 整合spring注解demo

    本项目" Ehcache+xmemcached+redis 整合spring注解demo"旨在演示如何将这三种主流的缓存技术——Ehcache、xmemcached和Redis——与Spring框架的注解功能相结合,以实现高效、灵活的缓存管理。以下是对这些知识点的...

    spring-xmemcached

    spring+xmemcached aop切面 需要xmemcached-1.2.5+spring-2.5.6 class="net.rubyeye.xmemcached.utils.XMemcachedClientFactoryBean" destroy-method="shutdown"&gt; ${XMemcached_servers} &lt;!-- ...

    memcache.spymemcached,和xmemcached 三种缓存实例

    与spymemcached相比,xmemcached提供了更全面的API,支持更多的Memcached命令。它的特点包括: - 支持多线程并发操作 - 使用NIO(非阻塞I/O)进行通信,提供更好的并发性能 - 支持文本和二进制协议 - 提供连接池...

    xmemcached 中文开发手册

    XMemcached作为一款高度优化的memcached客户端,不仅支持memcached的所有功能,还提供了许多额外的功能,如动态节点管理、与Spring框架的集成等,使其成为现代Web应用程序的理想选择。通过本文的详细介绍,希望能...

    Memcached与Spring、Mybatis集成.doc

    本文档主要讲述了如何将Memcached缓存系统与Spring框架以及MyBatis ORM工具进行集成。通过这种方式,可以有效地提高应用程序性能,尤其是在处理大量数据读取操作时,能够极大地减少数据库的压力。 #### 二、simple-...

    kestrel-task-executor:Kestrel + XMemcached + Spring TaskExecutor

    这个项目名为"kestrel-task-executor",它结合了Kestrel消息队列、XMemcached缓存客户端以及Spring的TaskExecutor框架,构建了一个强大的任务处理平台。以下将详细解析这个项目的组成部分和它们如何协同工作。 1. *...

    Memcached spring 的集成

    在Spring框架中集成Memcached,主要是为了利用其高性能的分布式内存缓存特性来提升应用程序的性能。Xmemcached是Java实现的一个Memcached客户端,提供了丰富的功能和良好的性能。下面我们将深入探讨如何进行集成以及...

    xmemcache与SPRING整合

    【Xmemcached与SPRING整合】是将Xmemcached客户端库与Spring框架集成,以便在Spring应用程序中方便地使用memcached缓存服务。Xmemcached是一个高性能的Java NIO实现的memcached客户端,具备多种特性,如高性能、支持...

    xmemcached 2.4.6.rar

    《深入解析xmemcached 2.4.6:构建高效分布式缓存系统》 xmemcached是Java领域中一个高效、稳定且易于使用的Memcached客户端库,它为开发者提供了便捷的接口来操作Memcached服务器。在2.4.6这个版本中,xmemcached...

    Xmemcached 缓存开源项目源码及API

    虽然Java的memcached库已经很多,但是这些Java开源memcached库并没有一个是基于NIO框架编写,因此并不能够充分发挥Java NIO的性能优势.... xmemcached的项目主页在:http://code.google.com/p/xmemcached/

    Xmemcached用户指南

    此外,XMemcached还支持与Hibernate-Memcached集成,后者允许将Memcached用作Hibernate的二级缓存。 **8. 客户端连接池** - **提升并发性能**:尽管Java NIO模型通常每个Memcached节点只需要一个连接,但XMemcached...

    阿里ocs客户端与spring集成,生命周期由spring管理

    阿里ocs的java客户端demo,我测试了xmemcached和spymemcached。两个都可用,但xmc可以交由spring管理client对象的生命周期,而spymc却是spring...ocs spring xmemcached spymemcached(本机测试用memcached1.4.13版本)

    mule ce xmemcached

    这里给出的解决方案是通过Spring Bean来与XMemcached配合,创建一个简单的缓存应用实例。这种方式可以帮助用户在不支付额外费用的情况下,利用开源组件实现缓存功能。 **知识点详解:** 1. **Mule ESB**: Mule是一...

    simple-spring-memcached集成memcache

    在IT行业中,Spring框架是Java应用开发中的一个关键组件,它提供了一整套服务和工具,使得开发者可以更高效地构建可维护、可扩展的应用。而Memcached则是一种高性能、分布式内存对象缓存系统,常用于缓解数据库负载...

    xmemcached-1.4.3.jar

    它采用了非阻塞I/O模型,基于NIO(New IO)框架,这使得xmemcached在处理大量并发请求时表现出色。通过非阻塞I/O,服务器可以在等待数据返回时执行其他任务,显著提高了系统资源利用率和整体性能。 其次,...

    xmemcached api doc

    xmemcached 可以集成监控框架如 JMX,用于实时查看客户端状态和性能指标。同时,通过配置日志框架,可以记录操作日志,便于排查问题。 ### 六、apidocs `apidocs` 文件夹包含了 xmemcached 的 JavaDoc,是学习和...

Global site tag (gtag.js) - Google Analytics