设为首页 收藏本站
查看: 1011|回复: 0

[经验分享] spring缓存集成memcache

[复制链接]

尚未签到

发表于 2015-11-18 09:36:38 | 显示全部楼层 |阅读模式
  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(&quot;MemcacheClient must not be null.&quot;);
}
//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=&quot;cacheManager&quot; class=&quot;com.youboy.cshop.utils.memcache.MemcacheCacheManager&quot;>
<property name=&quot;client&quot; value=&quot;memcachedClient&quot;/>
<property name=&quot;caches&quot;>
<set>
<bean class=&quot;com.youboy.cshop.utils.memcache.MemcacheCache&quot;>
<property name=&quot;name&quot; value=&quot;testCache&quot;/>
<property name=&quot;client&quot; ref=&quot;memcachedClient&quot;/>
</bean>
</set>
</property>
</bean>
  

其中memcachedClient为你memcache的客户端,你可以配置多个MemcacheCache,配置完这里你就你就可以把@Cacheable(value=&quot;testCache&quot;)添加到方法那来缓存执行结果,这里value=&quot;testCache&quot;的&#20540;必须和上面bean文件配置的一致,否则无法缓存。这只是做了个简单的集成,还有很多要完善的,比如连接时检查memcache状态。

版权声明:本文为博主原创文章,未经博主允许不得转载。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-140592-1-1.html 上篇帖子: memcache实现基于IP的控制发帖次数 下篇帖子: spring集成memcache 示例一
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表