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这个,代码如下:
public class MemcacheCache implements Cache {
private MemCachedClient client;
private String name;
public MemcacheCache(){
}
public MemcacheCache(String name,MemCachedClient client) {
Assert.notNull(client, "Memcache client must not be null");
// TODO validate memcache "alive"
this.client = client;
this.name = name;
}
@Override
@Cacheable(value="xxxx")
public String getName() {
return this.name;
}
@Override
public Object getNativeCache() {
return this.client;
}
@Override
public ValueWrapper get(Object key) {
Object value = this.client.get(objectToString(key));
return (value != null ? new SimpleValueWrapper(value) : null);
}
@Override
public void put(Object key, Object value) {
this.client.set(objectToString(key), value);
}
@Override
public void evict(Object key) {
this.client.delete(objectToString(key));
}
@Override
public void clear() {
// TODO delete all data
}
private static String objectToString(Object object) {
if (object == null) {
return null;
} else if (object instanceof String) {
return (String) object;
} else {
return object.toString();
}
}
public void setClient(MemCachedClient client){
this.client = client;
}
public MemCachedClient getClient() {
return client;
}
public void setName(String name) {
this.name = name;
}
}
然后是要扩展AbstractCacheManager这个缓存管理抽象类,它主要负责生成和读取Cache,代码如下:
public class MemcacheCacheManager extends AbstractCacheManager {
private Collection<Cache> caches;
private MemCachedClient client = null;
public MemcacheCacheManager() {
}
public MemcacheCacheManager(MemCachedClient client){
setClient(client);
}
@Override
protected Collection<? extends Cache> loadCaches() {
return this.caches;
}
public void setCaches(Collection<Cache> caches) {
this.caches = caches;
}
public void setClient(MemCachedClient client) {
this.client = client;
updateCaches();
}
public Cache getCache(String name){
checkState();
Cache cache = super.getCache(name);
if(cache == null){
cache = new MemcacheCache(name, client);
addCache(cache);
}
return cache;
}
private void checkState() {
if(client == null){
throw new IllegalStateException("MemcacheClient must not be null.");
}
//TODO check memcache state
}
private void updateCaches() {
if(caches != null){
for(Cache cache : caches){
if(cache instanceof MemcacheCache){
MemcacheCache memcacheCache = (MemcacheCache)cache;
memcacheCache.setClient(client);
}
}
}
}
}
配置bean:
<bean id="cacheManager" class="com.youboy.cshop.utils.memcache.MemcacheCacheManager">
<property name="client" value="memcachedClient"/>
<property name="caches">
<set>
<bean class="com.youboy.cshop.utils.memcache.MemcacheCache">
<property name="name" value="testCache"/>
<property name="client" ref="memcachedClient"/>
</bean>
</set>
</property>
</bean>
其中memcachedClient为你memcache的客户端,你可以配置多个MemcacheCache,配置完这里你就你就可以把@Cacheable(value="testCache")添加到方法那来缓存执行结果,这里value="testCache"的值必须和上面bean文件配置的一致,否则无法缓存。这只是做了个简单的集成,还有很多要完善的,比如连接时检查memcache状态。
分享到:
相关推荐
spring与memcache的开发配置!很详细
memcache的客户端,用maven构建,里有用hibernate-memcached与hibernate,spring3.0进行配置,也有与spring3.0单独配置。
Java 高性能缓存(Memcache) ,缓存思路
本人亲自搭建的spring和memcache缓存的项目,项目中说明也很详细,用的是oracle数据库。要是下载着使用的是其他数据库相信你也能快速改用,也可以在service层直接返回数据。目的在于怎么使用memcache。使用之前麻烦...
NULL 博文链接:https://younglibin.iteye.com/blog/2157666
主要封装了memcache的缓存机制。使用者可以通过实例对象直接调用工程中的方法进行存取
在服务器的内存开辟一块内存,可供不同的系统访问,实行不同系统间的缓存共享。memcache
Memcache缓存技术,Memcache配置说明及其文件,PHP5.2.6版本内存缓存技术配置,PHP运行环境PHP5.2.6版本的配置,操作系统是windows下
整理了一个Memcache数据缓存操作类库文件,希望对各位会有帮助,操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以...
文件中包含MemCache和Redis的jar包、下载的exe文件以及相关介绍和配置!
memcache,做session共享,缓存,一个简单的工具,无其他说明哦。
spring整合memcache,测试缓存数据库的增删改查。
springmvc框架配置Memcache缓存示例,使用者需要自己修改db.properties中的memcache缓存服务地址,修改正确地址后可直接运行
memcache介绍及客户端与服务端开发实例
ThinkPHP 3.1.2 官方只能支持一台Memcache缓存,不支持多台分布式Memcache缓存,现在简单改一下官方缓存类库(CacheMemcache.class.php)源代码就可以了。 亲测可用,放心使用,分享万岁!
继上一个留言本之后,在此基础上加入memcache缓存技术,并使用pdo方式连接数据库
介绍一个php封装Memcache队列缓存类,memcache客户端连接,队列是否可更新,缓存队列生命周期时间,当客户断开连接,允许继续执行,取消脚本执行延时上限,当取出元素时,改变队列首的数值,当添加元素时,改变队列尾的...
NULL 博文链接:https://godsend-jin.iteye.com/blog/2261307
Memcache缓存知识
Memcache缓存技术 安装 使用 教程 步骤的讲解