spring集成memcache 示例一

2024-04-23 09:32

本文主要是介绍spring集成memcache 示例一,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 plain copy
  1. public class MemcacheCache implements Cache {  
  2.     
  3.   private MemCachedClient client;  
  4.   private String name;  
  5.     
  6.   public MemcacheCache(){  
  7.       
  8.   }  
  9.     
  10.   public MemcacheCache(String name,MemCachedClient client) {  
  11.     Assert.notNull(client, "Memcache client must not be null");  
  12.     // TODO validate memcache "alive"  
  13.     this.client = client;  
  14.     this.name = name;  
  15.   }  
  16.     
  17.   @Override  
  18.   @Cacheable(value="xxxx")  
  19.   public String getName() {  
  20.     return this.name;  
  21.   }  
  22.     
  23.   @Override  
  24.   public Object getNativeCache() {  
  25.     return this.client;  
  26.   }  
  27.     
  28.   @Override  
  29.   public ValueWrapper get(Object key) {  
  30.     Object value = this.client.get(objectToString(key));  
  31.     return (value != null ? new SimpleValueWrapper(value) : null);  
  32.   }  
  33.     
  34.   @Override  
  35.   public void put(Object key, Object value) {  
  36.     this.client.set(objectToString(key), value);  
  37.       
  38.   }  
  39.     
  40.   @Override  
  41.   public void evict(Object key) {  
  42.     this.client.delete(objectToString(key));  
  43.       
  44.   }  
  45.     
  46.   @Override  
  47.   public void clear() {  
  48.     // TODO delete all data     
  49.   }  
  50.     
  51.   private static String objectToString(Object object) {  
  52.     if (object == null) {  
  53.       return null;  
  54.     } else if (object instanceof String) {  
  55.       return (String) object;  
  56.     } else {  
  57.       return object.toString();  
  58.     }  
  59.   }  
  60.     
  61.   public void setClient(MemCachedClient client){  
  62.     this.client = client;  
  63.   }  
  64.   
  65.   public MemCachedClient getClient() {  
  66.     return client;  
  67.   }  
  68.   
  69.   public void setName(String name) {  
  70.     this.name = name;  
  71.   }  
  72.       
  73. }  


然后是要扩展AbstractCacheManager这个缓存管理抽象类,它主要负责生成和读取Cache,代码如下:

[java] view plain copy
  1. public class MemcacheCacheManager extends AbstractCacheManager {  
  2.     
  3.   private Collection<Cache> caches;  
  4.   private MemCachedClient client = null;  
  5.     
  6.   public MemcacheCacheManager() {  
  7.   
  8.   }  
  9.     
  10.   public MemcacheCacheManager(MemCachedClient client){  
  11.     setClient(client);  
  12.   }  
  13.     
  14.   @Override  
  15.   protected Collection<? extends Cache> loadCaches() {      
  16.     return this.caches;  
  17.   }  
  18.     
  19.   public void setCaches(Collection<Cache> caches) {  
  20.     this.caches = caches;  
  21.   }  
  22.     
  23.   public void setClient(MemCachedClient client) {  
  24.     this.client = client;  
  25.     updateCaches();  
  26.   }  
  27.     
  28.   public Cache getCache(String name){  
  29.     checkState();  
  30.       
  31.     Cache cache = super.getCache(name);  
  32.     if(cache == null){  
  33.       cache = new MemcacheCache(name, client);  
  34.       addCache(cache);  
  35.     }  
  36.     return cache;  
  37.   }  
  38.     
  39.   private void checkState() {  
  40.     if(client == null){  
  41.       throw new IllegalStateException("MemcacheClient must not be null.");  
  42.     }  
  43.     //TODO check memcache state  
  44.       
  45.   }  
  46.   
  47.   private void updateCaches() {  
  48.     if(caches != null){  
  49.       for(Cache cache : caches){  
  50.         if(cache instanceof MemcacheCache){  
  51.           MemcacheCache memcacheCache = (MemcacheCache)cache;  
  52.           memcacheCache.setClient(client);  
  53.         }  
  54.       }  
  55.     }  
  56.       
  57.   }  
  58.      
  59. }  

配置bean:

[html] view plain copy
  1. <bean id="cacheManager" class="com.youboy.cshop.utils.memcache.MemcacheCacheManager">  
  2.     <property name="client" value="memcachedClient"/>  
  3.     <property name="caches">  
  4.         <set>  
  5.             <bean class="com.youboy.cshop.utils.memcache.MemcacheCache">  
  6.                 <property name="name" value="testCache"/>  
  7.                 <property name="client" ref="memcachedClient"/>  
  8.             </bean>  
  9.         </set>  
  10.     </property>  
  11. </bean>  


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

欢迎加我的qq技术群425783133

这篇关于spring集成memcache 示例一的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/928416

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Springboot @Autowired和@Resource的区别解析

《Springboot@Autowired和@Resource的区别解析》@Resource是JDK提供的注解,只是Spring在实现上提供了这个注解的功能支持,本文给大家介绍Springboot@... 目录【一】定义【1】@Autowired【2】@Resource【二】区别【1】包含的属性不同【2】@

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Java中的String.valueOf()和toString()方法区别小结

《Java中的String.valueOf()和toString()方法区别小结》字符串操作是开发者日常编程任务中不可或缺的一部分,转换为字符串是一种常见需求,其中最常见的就是String.value... 目录String.valueOf()方法方法定义方法实现使用示例使用场景toString()方法方法

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("