国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
Memcached與Spring AOP構(gòu)建數(shù)分布式據(jù)庫(kù)前端緩存框架

  由于上一篇有介紹了Memcached緩存,并集群部署,這邊我們就不介紹,我們直接介紹MemcachedSpring AOP構(gòu)建分布式數(shù)據(jù)庫(kù)前端緩存框架

 一.Java 實(shí)現(xiàn)Memcached客戶端,實(shí)現(xiàn)分布式

(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 實(shí)現(xiàn)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構(gòu)建數(shù)據(jù)庫(kù)前端緩存框架,并用Maven來(lái)管理項(xiàng)目

1)我們先溫習(xí)一下Spring AOP

   AOPAspect Orient Programming)面向切面編程,可以運(yùn)用在事務(wù)管理、安全檢查、緩存、對(duì)象池管理等。面向切面編程中有一個(gè)主要的是Advice,這個(gè)Advice定義好的切入點(diǎn)處,連接點(diǎn)之前先執(zhí)行增強(qiáng)中的代碼或者連接點(diǎn)執(zhí)行后,再執(zhí)行增強(qiáng)中的代碼等。

2)我們用Maven管理SpringMVCjarMemcachedjar

   我們這里就介紹Memcachedjar,在POM.XML中添加Memcached對(duì)應(yīng)的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來(lái)管理Memcached連接信息的配置和實(shí)現(xiàn)

     1global.properties 文件

  1. #服務(wù)器地址    
  2. memcached.server=192.168.74.129:12000  
  3. memcached.server2=192.168.74.130:13000  
  4. #初始化時(shí)對(duì)每個(gè)服務(wù)器建立的連接數(shù)目    
  5. memcached.initConn=20  
  6. #每個(gè)服務(wù)器建立最小的連接數(shù)    
  7. memcached.minConn=10  
  8. #每個(gè)服務(wù)器建立最大的連接數(shù)    
  9. memcached.maxConn=50  
  10. #自查線程周期進(jìn)行工作,其每次休眠時(shí)間    
  11. memcached.maintSleep=3000  
  12. #Socket的參數(shù),如果是true在寫(xiě)數(shù)據(jù)時(shí)不緩沖,立即發(fā)送出去    
  13. memcached.nagle=false  
  14. #Socket阻塞讀取數(shù)據(jù)的超時(shí)時(shí)間    
  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測(cè)試一下這樣配置是否正確,代碼如下:

 
  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. }  

  

能保存并能獲取數(shù)據(jù)說(shuō)明配置成功


4)實(shí)現(xiàn)MVC業(yè)務(wù)邏輯

  
  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構(gòu)建數(shù)據(jù)庫(kù)前端緩存框架

     1)實(shí)現(xiàn)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("執(zhí)行從MemCached獲取的值======="+object);  
  13.          }  
  14.          if(object==null){  
  15.              object =invocation.proceed();  
  16.              System.out.println("執(zhí)行數(shù)據(jù)庫(kù)操作獲取的值======="+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("沒(méi)有從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>  

配置了對(duì)哪個(gè)方法進(jìn)行攔截,這里我們對(duì)getData方法進(jìn)行攔截



6)測(cè)試Spring AOPMemcached構(gòu)建數(shù)據(jù)庫(kù)前端緩存框架

   

  1)第一次執(zhí)行我們傳參數(shù)hello,Memcached里面肯定沒(méi)有,因?yàn)槭堑谝淮螆?zhí)行,所示從數(shù)據(jù)庫(kù)獲取對(duì)應(yīng)的值,并保存到Memcached服務(wù)端,如圖所示:

    

 2)執(zhí)行第二次,參數(shù)是hello,這次沒(méi)有去操作數(shù)據(jù)庫(kù),直接從Memcached服務(wù)端獲取對(duì)應(yīng)的值

    

 3)我們這邊對(duì)Memcached服務(wù)端進(jìn)行集群部署,所以我們查看一下,數(shù)據(jù)保存到其中的一臺(tái),如圖所示:



三.構(gòu)建MemcachedSpring AOP構(gòu)建數(shù)據(jù)庫(kù)前端緩存框架出現(xiàn)的錯(cuò)誤

   

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


 原因是我們?cè)O(shè)置MemCachedClientSockIOPoolProxName不一樣導(dǎo)致,所以兩個(gè)名稱要一樣,如圖所示:



四.總結(jié)

    我們?cè)谏弦黄榻B了,Memcached集群部署,有兩臺(tái)memcached.server=192.168.74.129:12000 和memcached.server2=192.168.74.130:13000,我們通過(guò)Memcached客戶端實(shí)現(xiàn)了分布式緩存的,Memcached服務(wù)端之間是不能通訊的,所示我們通過(guò)Memcached客戶端實(shí)現(xiàn)分布式緩存的。



本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
使用spring aop對(duì)web 應(yīng)用數(shù)據(jù)進(jìn)行memcached緩存
Java使用memcached
XMemcached與Spring3.2緩存框架集成
simple
spring調(diào)用memcached client
spring memcache
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服