分享

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

 WindySky 2016-06-13

  由于上一篇有介绍了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客户端代码如下:

   

  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包

   

  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 文件

  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

  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测试一下这样配置是否正确,代码如下:

 
  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业务逻辑

  
  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的逻辑代码

       
  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

 
  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客户端实现分布式缓存的。



    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约