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

[经验分享] spring集成memcache 示例一

[复制链接]

尚未签到

发表于 2015-11-18 09:37:56 | 显示全部楼层 |阅读模式
  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这个,代码如下:
[java] view plaincopy

  • 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,代码如下:
[java] view plaincopy

  • 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:
[html] view plaincopy

  • <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-140593-1-1.html 上篇帖子: spring缓存集成memcache 下篇帖子: 转载和积累系列
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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