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 8 Stream filter流式过滤器详解

《Java8Streamfilter流式过滤器详解》本文介绍了Java8的StreamAPI中的filter方法,展示了如何使用lambda表达式根据条件过滤流式数据,通过实际代码示例,展示了f... 目录引言 一.Java 8 Stream 的过滤器(filter)二.Java 8 的 filter、fi

Java中实现订单超时自动取消功能(最新推荐)

《Java中实现订单超时自动取消功能(最新推荐)》本文介绍了Java中实现订单超时自动取消功能的几种方法,包括定时任务、JDK延迟队列、Redis过期监听、Redisson分布式延迟队列、Rocket... 目录1、定时任务2、JDK延迟队列 DelayQueue(1)定义实现Delayed接口的实体类 (

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

将java程序打包成可执行文件的实现方式

《将java程序打包成可执行文件的实现方式》本文介绍了将Java程序打包成可执行文件的三种方法:手动打包(将编译后的代码及JRE运行环境一起打包),使用第三方打包工具(如Launch4j)和JDK自带... 目录1.问题提出2.如何将Java程序打包成可执行文件2.1将编译后的代码及jre运行环境一起打包2

Java使用Tesseract-OCR实战教程

《Java使用Tesseract-OCR实战教程》本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代... 目录Java使用Tesseract-OCRTesseract-OCR安装配置中文训练库引入依赖代码实

Java中对象的创建和销毁过程详析

《Java中对象的创建和销毁过程详析》:本文主要介绍Java中对象的创建和销毁过程,对象的创建过程包括类加载检查、内存分配、初始化零值内存、设置对象头和执行init方法,对象的销毁过程由垃圾回收机... 目录前言对象的创建过程1. 类加载检查2China编程. 分配内存3. 初始化零值4. 设置对象头5. 执行

SpringBoot整合easy-es的详细过程

《SpringBoot整合easy-es的详细过程》本文介绍了EasyES,一个基于Elasticsearch的ORM框架,旨在简化开发流程并提高效率,EasyES支持SpringBoot框架,并提供... 目录一、easy-es简介二、实现基于Spring Boot框架的应用程序代码1.添加相关依赖2.添

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程

《SpringBoot中整合RabbitMQ(测试+部署上线最新完整)的过程》本文详细介绍了如何在虚拟机和宝塔面板中安装RabbitMQ,并使用Java代码实现消息的发送和接收,通过异步通讯,可以优化... 目录一、RabbitMQ安装二、启动RabbitMQ三、javascript编写Java代码1、引入

spring-boot-starter-thymeleaf加载外部html文件方式

《spring-boot-starter-thymeleaf加载外部html文件方式》本文介绍了在SpringMVC中使用Thymeleaf模板引擎加载外部HTML文件的方法,以及在SpringBoo... 目录1.Thymeleaf介绍2.springboot使用thymeleaf2.1.引入spring