Memcached与Spring AOP构建数分布式据库前端缓存框架

本文主要是介绍Memcached与Spring AOP构建数分布式据库前端缓存框架,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

由于上一篇有介绍了Memcached缓存,并集群部署,这边我们就不介绍,我们直接介绍MemcachedSpring AOP构建分布式数据库前端缓存框架

 一.Java 实现Memcached客户端,实现分布式

(1)需要的jar 

     1)commons-pool-1.5.6.jar

     2)java_memcached-release_2.6.3.jar

     3)slf4j-api-1.6.1.jar

     4)slf4j-simple-1.6.1.jar

(2)Java 实现Memcached客户端代码如下:

   

[java]  view plain copy
  1. import com.danga.MemCached.MemCachedClient;  
  2. import com.danga.MemCached.SockIOPool;  
  3.   
  4. public class TestCache {  
  5.   
  6.     /** 
  7.      * @param args 
  8.      */  
  9.     public static void main(String[] args) {  
  10.                String[] servers = { "192.168.74.129:12000,192.168.74.130:13000"};  
  11.                SockIOPool pool = SockIOPool.getInstance();  
  12.                pool.setServers(servers);  
  13.                pool.setFailover(true);  
  14.                pool.setInitConn(10);  
  15.                pool.setMinConn(5);  
  16.                pool.setMaxConn(250);  
  17.                pool.setMaintSleep(30);  
  18.                pool.setNagle(false);  
  19.                pool.setSocketTO(3000);  
  20.                pool.setAliveCheck(true);  
  21.                pool.initialize();  
  22.                MemCachedClient memCachedClient = new MemCachedClient();  
  23.                boolean success = memCachedClient.set("zcy""dataValue");  
  24.                System.out.println(success);  
  25.                Object obj= memCachedClient.get("zcy");  
  26.                 System.out.println(obj);  
  27.         }  
  28. }  


二. MemcachedSpring AOP构建数据库前端缓存框架,并用Maven来管理项目

1)我们先温习一下Spring AOP

   AOPAspect Orient Programming)面向切面编程,可以运用在事务管理、安全检查、缓存、对象池管理等。面向切面编程中有一个主要的是Advice,这个Advice定义好的切入点处,连接点之前先执行增强中的代码或者连接点执行后,再执行增强中的代码等。

2)我们用Maven管理SpringMVCjarMemcachedjar

   我们这里就介绍Memcachedjar,在POM.XML中添加Memcached对应的jar包

   

[html]  view plain copy
  1. <dependency>  
  2.  <groupId>com.danga</groupId>  
  3.  <artifactId>java-memcached</artifactId>  
  4.  <version>2.6.3</version>  
  5. </dependency>  
  6.  <dependency>    
  7.        <groupId>commons-pool</groupId>    
  8.        <artifactId>commons-pool</artifactId>    
  9.        <version>1.5.6</version>    
  10.    </dependency>  
  11.   <dependency>    
  12.        <groupId>org.slf4j</groupId>    
  13.        <artifactId>slf4j-simple</artifactId>    
  14.        <version>1.6.1</version>    
  15.    </dependency>    
  16.    <dependency>    
  17.        <groupId>org.slf4j</groupId>    
  18.        <artifactId>slf4j-api</artifactId>    
  19.        <version>1.6.1</version>    
  20.    </dependency>    


(3)用Spring来管理Memcached连接信息的配置和实现

     1global.properties 文件

[java]  view plain copy
  1. #服务器地址    
  2. memcached.server=192.168.74.129:12000  
  3. memcached.server2=192.168.74.130:13000  
  4. #初始化时对每个服务器建立的连接数目    
  5. memcached.initConn=20  
  6. #每个服务器建立最小的连接数    
  7. memcached.minConn=10  
  8. #每个服务器建立最大的连接数    
  9. memcached.maxConn=50  
  10. #自查线程周期进行工作,其每次休眠时间    
  11. memcached.maintSleep=3000  
  12. #Socket的参数,如果是true在写数据时不缓冲,立即发送出去    
  13. memcached.nagle=false  
  14. #Socket阻塞读取数据的超时时间    
  15. memcached.socketTO=3000  
  16. memcached.aliveCheck=true  
  17. memcached.failover=true  


2)Spring配置文件(applicationContext-memached.xml

[html]  view plain copy
  1. <!-- 注入属性文件 -->  
  2.     <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">  
  3.         <property name="locations">  
  4.             <list>  
  5.                 <value>classpath:global.properties</value>  
  6.             </list>  
  7.         </property>  
  8.     </bean>  
  9.       
  10.    <bean id="memCachedPool" class="com.danga.MemCached.SockIOPool" factory-method="getInstance" init-method="initialize" destroy-method="shutDown">  
  11.         <constructor-arg>  
  12.            <value>memcachedPool</value>  
  13.          </constructor-arg>  
  14.            
  15.          <property name="servers">  
  16.              <list>  
  17.                 <value>${memcached.server}</value>  
  18.                  <value>${memcached.server2}</value>  
  19.              </list>  
  20.          </property>  
  21.         <property name="initConn">  
  22.             <value>${memcached.initConn}</value>  
  23.         </property>  
  24.           
  25.         <property name="minConn">  
  26.             <value>${memcached.minConn}</value>  
  27.         </property>  
  28.   
  29.         <property name="maxConn">  
  30.             <value>${memcached.maxConn}</value>  
  31.         </property>  
  32.   
  33.         <property name="maintSleep">  
  34.             <value>${memcached.maintSleep}</value>  
  35.          </property>  
  36.   
  37.         <property name="nagle">  
  38.             <value>${memcached.nagle}</value>  
  39.         </property>  
  40.   
  41.         <property name="socketTO">  
  42.              <value>${memcached.socketTO}</value>  
  43.         </property>  
  44.         <property name="aliveCheck">  
  45.              <value>${memcached.aliveCheck}</value>  
  46.         </property>  
  47.         <property name="failover">  
  48.              <value>${memcached.failover}</value>  
  49.         </property>  
  50.           
  51.     </bean>  
  52.   
  53. <bean id="memCachedClient" class="com.danga.MemCached.MemCachedClient">  
  54.          <constructor-arg>  
  55.            <span style="color:#ff0000;"><value>memcachedPool</value></span>  
  56.          </constructor-arg>  
  57.     </bean>  
  58.       


3)junit测试一下这样配置是否正确,代码如下:

 
[java]  view plain copy
  1.   import org.junit.Before;  
  2. import org.junit.Test;  
  3. import org.springframework.context.ApplicationContext;  
  4. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  5. import com.danga.MemCached.MemCachedClient;  
  6.   
  7. public class MemcachedServiceTest   
  8. {  
  9.       
  10.      private MemCachedClient  memCachedClient;  
  11.      @Before  
  12.       public void beforeTest(){  
  13.             ApplicationContext atx = new ClassPathXmlApplicationContext("classpath:applicationContext-memached.xml");  
  14.             memCachedClient = (MemCachedClient)atx.getBean("memCachedClient");   
  15.      }  
  16.       
  17.     @Test   
  18.     public void memCached()  
  19.     {  
  20.         boolean b=memCachedClient.set("hello","dataValue");  
  21.         System.out.println(b);  
  22.         Object obj=memCachedClient.get("hello");  
  23.         System.out.println(obj);  
  24.           
  25.     }  
  26.   
  27. }  

  

能保存并能获取数据说明配置成功


4)实现MVC业务逻辑

  
[java]  view plain copy
  1.  //Dao层  
  2. @Service("dataDao")  
  3. public class DataDaoImpl implements DataDao {  
  4.     @Override  
  5.     public String getData(String name) {  
  6.         return name+" get data";  
  7.     }  
  8. }  
  9.         
  10. //server层  
  11.   @Service("dataService")  
  12. public class DataServiceImpl implements DataService{  
  13.     @Autowired  
  14.     private DataDao dataDao;  
  15.     public String findDataByParams(String name) {  
  16.           
  17.         return dataDao.getData(name);  
  18.     }  
  19. }  
  20. //Controller层  
  21. @Controller  
  22. public class IndexController {  
  23.     @Autowired  
  24.     private DataService dataService;  
  25.       
  26.     @RequestMapping("/index")  
  27.     public String index(Model model,@RequestParam(value="name") String name){  
  28.     String dataValue=dataService.findDataByParams(name);  
  29.     System.out.println(dataValue);  
  30.         return "";  
  31.     }  
  32. }  


5Spring AOPMemcached构建数据库前端缓存框架

     1)实现AOP的逻辑代码

       
[java]  view plain copy
  1. @Service("dataInterceptor")  
  2. public class DataInterceptor  implements MethodInterceptor{  
  3.     @Autowired  
  4.     private MemCachedClient memCachedClient;  
  5.     @Override  
  6.     public Object invoke(MethodInvocation invocation) throws Throwable {  
  7.          Object[] args = invocation.getArguments();   
  8.          String param=args[0].toString();  
  9.          Object  object = null;  
  10.          if(param!=null&&memCachedClient!=null){  
  11.              object=memCachedClient.get(param);  
  12.              System.out.println("执行从MemCached获取的值======="+object);  
  13.          }  
  14.          if(object==null){  
  15.              object =invocation.proceed();  
  16.              System.out.println("执行数据库操作获取的值======="+object);  
  17.                 if (object != null) {  
  18.                     boolean b=memCachedClient.set(param,object);  
  19.                     if(b){  
  20.                      System.out.println("=====保存值"+object+"到memCached 成功===========");  
  21.                     }else{  
  22.                          System.out.println("=====保存值"+object+"到memCached 失败===========");  
  23.                     }  
  24.                 }  
  25.              System.out.println("没有从memCached获取===========");  
  26.          }else{  
  27.              System.out.println("从memCached获取======="+object);  
  28.          }  
  29.         return object;  
  30.     }  
  31. }  

 2)Spring 配置文件配置AOP

 
[java]  view plain copy
  1.  <bean id="dataInterceptorAdvisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">  
  2.     <property name="mappedName"><value>getData</value></property>    
  3.     <property name="advice" ref="dataInterceptor"/>  
  4. </bean>  
  5.   
  6.   
  7. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
  8.     <property name="beanNames" value="dataDao"/>  
  9.     <property name="interceptorNames" value="dataInterceptorAdvisor"/>  
  10. </bean>  

配置了对哪个方法进行拦截,这里我们对getData方法进行拦截



6)测试Spring AOPMemcached构建数据库前端缓存框架

   

  1)第一次执行我们传参数helloMemcached里面肯定没有,因为是第一次执行,所示从数据库获取对应的值,并保存到Memcached服务端,如图所示:

    

 2)执行第二次,参数是hello,这次没有去操作数据库,直接从Memcached服务端获取对应的值

    

 3)我们这边对Memcached服务端进行集群部署,所以我们查看一下,数据保存到其中的一台,如图所示:



三.构建MemcachedSpring AOP构建数据库前端缓存框架出现的错误

   

 Error:com.schooner.MemCached.SchoonerSockIOPool - attempting to get SockIO from uninitialized pool!


 原因是我们设置MemCachedClientSockIOPoolProxName不一样导致,所以两个名称要一样,如图所示:



四.总结

    我们在上一篇介绍了,Memcached集群部署,有两台memcached.server=192.168.74.129:12000 和memcached.server2=192.168.74.130:13000,我们通过Memcached客户端实现了分布式缓存的,Memcached服务端之间是不能通讯的,所示我们通过Memcached客户端实现分布式缓存的。

这篇关于Memcached与Spring AOP构建数分布式据库前端缓存框架的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Java发送邮件到QQ邮箱的完整指南

《使用Java发送邮件到QQ邮箱的完整指南》在现代软件开发中,邮件发送功能是一个常见的需求,无论是用户注册验证、密码重置,还是系统通知,邮件都是一种重要的通信方式,本文将详细介绍如何使用Java编写程... 目录引言1. 准备工作1.1 获取QQ邮箱的SMTP授权码1.2 添加JavaMail依赖2. 实现

Java嵌套for循环优化方案分享

《Java嵌套for循环优化方案分享》介绍了Java中嵌套for循环的优化方法,包括减少循环次数、合并循环、使用更高效的数据结构、并行处理、预处理和缓存、算法优化、尽量减少对象创建以及本地变量优化,通... 目录Java 嵌套 for 循环优化方案1. 减少循环次数2. 合并循环3. 使用更高效的数据结构4

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Spring AI集成DeepSeek实现流式输出的操作方法

《SpringAI集成DeepSeek实现流式输出的操作方法》本文介绍了如何在SpringBoot中使用Sse(Server-SentEvents)技术实现流式输出,后端使用SpringMVC中的S... 目录一、后端代码二、前端代码三、运行项目小天有话说题外话参考资料前面一篇文章我们实现了《Spring

Spring AI与DeepSeek实战一之快速打造智能对话应用

《SpringAI与DeepSeek实战一之快速打造智能对话应用》本文详细介绍了如何通过SpringAI框架集成DeepSeek大模型,实现普通对话和流式对话功能,步骤包括申请API-KEY、项目搭... 目录一、概述二、申请DeepSeek的API-KEY三、项目搭建3.1. 开发环境要求3.2. mav

Springboot的自动配置是什么及注意事项

《Springboot的自动配置是什么及注意事项》SpringBoot的自动配置(Auto-configuration)是指框架根据项目的依赖和应用程序的环境自动配置Spring应用上下文中的Bean... 目录核心概念:自动配置的关键特点:自动配置工作原理:示例:需要注意的点1.默认配置可能不适合所有场景

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链

spring @EventListener 事件与监听的示例详解

《spring@EventListener事件与监听的示例详解》本文介绍了自定义Spring事件和监听器的方法,包括如何发布事件、监听事件以及如何处理异步事件,通过示例代码和日志,展示了事件的顺序... 目录1、自定义Application Event2、自定义监听3、测试4、源代码5、其他5.1 顺序执行