【转】Dubbo声明式缓存

2018-06-18 01:56:47来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

缓存的应用非常广泛,为了提高数据访问的速度。Dubbo也不例外,它提供了声明式缓存,以减少用户加缓存的工作量。

一、Dubbo中缓存策略

  • lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。
  • threadlocal 当前线程缓存,比如一个页面渲染,用到很多portal,每个portal都要去查用户信息,通过线程缓存,可以减少这种多余访问。
  • jcache 与JSR107集成,可以桥接各种缓存实现。

二、Provider

   服务端包含接口和实现

接口:

[java] view plain copy
  1. package com.tgb.cacheService;  
  2.   
  3. /** 
  4.  * 服务端 缓存 接口 
  5.  * @author xx 
  6.  * 
  7.  */  
  8. public interface CacheService {  
  9.     String findCache(String id);  
  10. }  


实现:

 

[java] view plain copy
  1. package com.tgb.cacheService;  
  2.   
  3. import java.util.concurrent.atomic.AtomicInteger;  
  4.   
  5. /** 
  6.  * 服务端 缓存 接口实现 
  7.  * @author xx 
  8.  * 
  9.  */  
  10. public class CacheServiceImpl implements CacheService {  
  11.   
  12.     private final AtomicInteger i = new AtomicInteger();  
  13.       
  14.     public String findCache(String id) throws Exception {  
  15.          return "request: " + id + ", response: " + i.getAndIncrement();  
  16.     }  
  17. }  


spring配置文件:CacheProvider.xml

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.         http://www.springframework.org/schema/beans/spring-beans.xsd  
  7.         http://code.alibabatech.com/schema/dubbo  
  8.         http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
  9.         ">       
  10.     <dubbo:application name="cache-provider" />  
  11.     <dubbo:registry  protocol="zookeeper"  address="192.168.24.140:2181"  />  
  12.     <dubbo:protocol name="dubbo" port="20880" />       
  13.     <dubbo:service interface="com.tgb.cacheService.CacheService" ref="cacheService" />       <!-- 和本地bean一样实现服务 -->  
  14.     <bean id="cacheService" class="com.tgb.cacheService.CacheServiceImpl" />  
  15. </beans>  


程序入口:

[java] view plain copy
  1. package com.tgb.main;  
  2.   
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  4. /** 
  5.  * 服务端入口 
  6.  * @author xx 
  7.  * 
  8.  */  
  9. public class CacheProvider {  
  10.   
  11.     public static void main(String[] args) throws Exception{  
  12.         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "CacheProvider.xml" });  
  13.         context.start();  
  14.         System.out.println("按任意键退出");  
  15.         System.in.read();  
  16.     }  
  17. }  


三、Consumer

     接口同服务端

spring配置文件:CacheConsumer.xml,配置缓存

[html] view plain copy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"  
  5.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  6.         http://www.springframework.org/schema/beans/spring-beans.xsd  
  7.         http://code.alibabatech.com/schema/dubbo  
  8.         http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
  9.         ">       
  10.     <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样  192.9.145.19:2181,192.9.145.19:2182,192.9.145.19:2183-->  
  11.     <dubbo:application name="cache-consumer" />       <!-- 使用multicast广播注册中心暴露发现服务地址 -->  
  12.     <dubbo:registry  protocol="zookeeper"  address="192.168.24.140:2181" />         <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->  
  13.     <dubbo:reference id="cacheService" interface="com.tgb.cacheService.CacheService" cache="true" />  
  14. </beans>  


程序入口:

[html] view plain copy
  1. package com.tgb.main;  
  2.   
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  4.   
  5. import com.tgb.cacheService.CacheService;  
  6.   
  7. /**  
  8.  * 客户端入口  
  9.  * @author xx  
  10.  *  
  11.  */  
  12. public class CacheConsumer {  
  13.   
  14.     public static void main(String[] args) throws Exception {  
  15.   
  16.             ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "CacheConsumer.xml" });  
  17.             context.start();  
  18.               
  19.             CacheService cacheService = (CacheService)context.getBean("cacheService");  
  20.   
  21.             // 测试缓存生效,多次调用返回同样的结果。(服务器端自增长返回值)  
  22.             String fix = null;  
  23.             for (int i = 0; i 5; i ++) {  
  24.                 String result = cacheService.findCache("0"); //request: 0, response: 1001  
  25.                 if (fix == null || fix.equals(result)) {  
  26.                     System.out.println("OK: " + result);  
  27.                 } else {  
  28.                     System.err.println("ERROR: " + result);  
  29.                 }  
  30.                 fix = result;  
  31.                 Thread.sleep(6000);  
  32.             }  
  33.               
  34.             // LRU的缺省cache.size为1000,执行1001次,应有溢出,执行了1001次后1001*2=2002,所以result为2002  
  35.             for (int n = 0; n 1001; n ++) {  
  36.                 String pre = null;  
  37.                 for (int i = 0; i 10; i ++) {  
  38.                     String result = cacheService.findCache(String.valueOf(n));  
  39.                     if (pre != null && ! pre.equals(result)) {  
  40.                         System.err.println("ERROR: " + result);  
  41.                     }  
  42.                     pre = result;  
  43.                 }  
  44.             }  
  45.               
  46.             // 测试LRU有移除最开始的一个缓存项  
  47.             String result = cacheService.findCache("0"); //request: 0, response: 2002  
  48.             if (fix != null && ! fix.equals(result)) {  
  49.                 System.out.println("OK: " + result);  
  50.             } else {  
  51.                 System.err.println("ERROR: " + result);  
  52.             }  
  53.         }  
  54.     }  


三、测试

 首先要启动zookeeper,然后依次启动provider和consumer,执行结果如下:

[html] view plain copy
  1. OK: request: 0, response: 1003  
  2. OK: request: 0, response: 1003  
  3. OK: request: 0, response: 1003  
  4. OK: request: 0, response: 1003  
  5. OK: request: 0, response: 1003  
  6. OK: request: 0, response: 2004  


      服务器端的response值是变化的,但是如果response结果是1000,那么在执行了1001次后,结果为2001,到执行入口中第三个循环的时候缓存中result值是最新的,最近最久不使用的已经被移除了。

原文:https://blog.csdn.net/ggibenben1314/article/details/47752661

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:分布式锁的几种使用方式(redis、zookeeper、数据库)

下一篇:spring 事物传播的一些易错点