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

相关文章

SpringBoot通过main方法启动web项目实践

《SpringBoot通过main方法启动web项目实践》SpringBoot通过SpringApplication.run()启动Web项目,自动推断应用类型,加载初始化器与监听器,配置Spring... 目录1. 启动入口:SpringApplication.run()2. SpringApplicat

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

基于Java开发一个极简版敏感词检测工具

《基于Java开发一个极简版敏感词检测工具》这篇文章主要为大家详细介绍了如何基于Java开发一个极简版敏感词检测工具,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录你是否还在为敏感词检测头疼一、极简版Java敏感词检测工具的3大核心优势1.1 优势1:DFA算法驱动,效率提升10

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

基于Java和FFmpeg实现视频压缩和剪辑功能

《基于Java和FFmpeg实现视频压缩和剪辑功能》在视频处理开发中,压缩和剪辑是常见的需求,本文将介绍如何使用Java结合FFmpeg实现视频压缩和剪辑功能,同时去除数据库操作,仅专注于视频处理,需... 目录引言1. 环境准备1.1 项目依赖1.2 安装 FFmpeg2. 视频压缩功能实现2.1 主要功

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

Spring-DI依赖注入全过程

《Spring-DI依赖注入全过程》SpringDI是核心特性,通过容器管理依赖注入,降低耦合度,实现方式包括组件扫描、构造器/设值/字段注入、自动装配及作用域配置,支持灵活的依赖管理与生命周期控制,... 目录1. 什么是Spring DI?2.Spring如何做的DI3.总结1. 什么是Spring D

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔

spring AMQP代码生成rabbitmq的exchange and queue教程

《springAMQP代码生成rabbitmq的exchangeandqueue教程》使用SpringAMQP代码直接创建RabbitMQexchange和queue,并确保绑定关系自动成立,简... 目录spring AMQP代码生成rabbitmq的exchange and 编程queue执行结果总结s