【转】Dubbo声明式缓存
缓存的应用非常广泛,为了提高数据访问的速度。Dubbo也不例外,它提供了声明式缓存,以减少用户加缓存的工作量。
一、Dubbo中缓存策略
- lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存。
- threadlocal 当前线程缓存,比如一个页面渲染,用到很多portal,每个portal都要去查用户信息,通过线程缓存,可以减少这种多余访问。
- jcache 与JSR107集成,可以桥接各种缓存实现。
二、Provider
服务端包含接口和实现
接口:
- package com.tgb.cacheService;
- /**
- * 服务端 缓存 接口
- * @author xx
- *
- */
- public interface CacheService {
- String findCache(String id);
- }
实现:
- package com.tgb.cacheService;
- import java.util.concurrent.atomic.AtomicInteger;
- /**
- * 服务端 缓存 接口实现
- * @author xx
- *
- */
- public class CacheServiceImpl implements CacheService {
- private final AtomicInteger i = new AtomicInteger();
- public String findCache(String id) throws Exception {
- return "request: " + id + ", response: " + i.getAndIncrement();
- }
- }
spring配置文件:CacheProvider.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://code.alibabatech.com/schema/dubbo
- http://code.alibabatech.com/schema/dubbo/dubbo.xsd
- ">
- <dubbo:application name="cache-provider" />
- <dubbo:registry protocol="zookeeper" address="192.168.24.140:2181" />
- <dubbo:protocol name="dubbo" port="20880" />
- <dubbo:service interface="com.tgb.cacheService.CacheService" ref="cacheService" /> <!-- 和本地bean一样实现服务 -->
- <bean id="cacheService" class="com.tgb.cacheService.CacheServiceImpl" />
- </beans>
程序入口:
- package com.tgb.main;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- /**
- * 服务端入口
- * @author xx
- *
- */
- public class CacheProvider {
- public static void main(String[] args) throws Exception{
- ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "CacheProvider.xml" });
- context.start();
- System.out.println("按任意键退出");
- System.in.read();
- }
- }
三、Consumer
接口同服务端
spring配置文件:CacheConsumer.xml,配置缓存
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans.xsd
- http://code.alibabatech.com/schema/dubbo
- http://code.alibabatech.com/schema/dubbo/dubbo.xsd
- ">
- <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 192.9.145.19:2181,192.9.145.19:2182,192.9.145.19:2183-->
- <dubbo:application name="cache-consumer" /> <!-- 使用multicast广播注册中心暴露发现服务地址 -->
- <dubbo:registry protocol="zookeeper" address="192.168.24.140:2181" /> <!-- 生成远程服务代理,可以和本地bean一样使用demoService -->
- <dubbo:reference id="cacheService" interface="com.tgb.cacheService.CacheService" cache="true" />
- </beans>
程序入口:
- package com.tgb.main;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import com.tgb.cacheService.CacheService;
- /**
- * 客户端入口
- * @author xx
- *
- */
- public class CacheConsumer {
- public static void main(String[] args) throws Exception {
- ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] { "CacheConsumer.xml" });
- context.start();
- CacheService cacheService = (CacheService)context.getBean("cacheService");
- // 测试缓存生效,多次调用返回同样的结果。(服务器端自增长返回值)
- String fix = null;
- for (int i = 0; i < 5; i ++) {
- String result = cacheService.findCache("0"); //request: 0, response: 1001
- if (fix == null || fix.equals(result)) {
- System.out.println("OK: " + result);
- } else {
- System.err.println("ERROR: " + result);
- }
- fix = result;
- Thread.sleep(6000);
- }
- // LRU的缺省cache.size为1000,执行1001次,应有溢出,执行了1001次后1001*2=2002,所以result为2002
- for (int n = 0; n < 1001; n ++) {
- String pre = null;
- for (int i = 0; i < 10; i ++) {
- String result = cacheService.findCache(String.valueOf(n));
- if (pre != null && ! pre.equals(result)) {
- System.err.println("ERROR: " + result);
- }
- pre = result;
- }
- }
- // 测试LRU有移除最开始的一个缓存项
- String result = cacheService.findCache("0"); //request: 0, response: 2002
- if (fix != null && ! fix.equals(result)) {
- System.out.println("OK: " + result);
- } else {
- System.err.println("ERROR: " + result);
- }
- }
- }
三、测试
首先要启动zookeeper,然后依次启动provider和consumer,执行结果如下:
- OK: request: 0, response: 1003
- OK: request: 0, response: 1003
- OK: request: 0, response: 1003
- OK: request: 0, response: 1003
- OK: request: 0, response: 1003
- OK: request: 0, response: 2004
服务器端的response值是变化的,但是如果response结果是1000,那么在执行了1001次后,结果为2001,到执行入口中第三个循环的时候缓存中result值是最新的,最近最久不使用的已经被移除了。
原文:https://blog.csdn.net/ggibenben1314/article/details/47752661
【转】Dubbo声明式缓存的更多相关文章
- Dubbo声明式缓存
为了进一步提高消费者对用户的响应速度,减轻提供者的压力,Dubbo提供了基于结果的声明式缓存.该缓存是基于消费者端的,所以使用很简单,只需修改消费者配置文件,与提供者无关 一.创建消费者07-cons ...
- Spring 3.1新特性之三:Spring对声明式缓存的支持
一.概述: Spring 3.1 引入了激动人心的基于注释(annotation)的缓存(cache)技术,它本质上不是一个具体的缓存实现方案(例如EHCache 或者 OSCache),而是一个对缓 ...
- dubbo之结果缓存
结果缓存,用于加速热门数据的访问速度,Dubbo提供声明式缓存,以减少用户加缓存的工作量. lru 基于最近最少使用原则删除多余缓存,保持最热的数据被缓存. threadlocal 当前线程缓存,比如 ...
- Spring Cloud Eureka 分布式开发之服务注册中心、负载均衡、声明式服务调用实现
介绍 本示例主要介绍 Spring Cloud 系列中的 Eureka,使你能快速上手负载均衡.声明式服务.服务注册中心等 Eureka Server Eureka 是 Netflix 的子模块,它是 ...
- spring cloud深入学习(四)-----eureka源码解析、ribbon解析、声明式调用feign
基本概念 1.Registe 一一服务注册当eureka Client向Eureka Server注册时,Eureka Client提供自身的元数据,比如IP地址.端口.运行状况指标的Uri.主页地址 ...
- spring声明式事务管理总结
事务配置 首先在/WEB-INF/applicationContext.xml添加以下内容: <!-- 配置事务管理器 --> <bean id="transactionM ...
- PHP系统声明式事务处理
转自:http://www.jianshu.com/p/34261804bc45 1.数据库事务 事务(Transaction)是并发控制的基本单位.所谓的事务,它是一个操作序列,这些操作要么都执行, ...
- Spring声明式事务配置管理方法
环境配置 项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add ...
- Spring声明式事务配置管理方法(转)
项目使用SSH架构,现在要添加Spring事务管理功能,针对当前环境,只需要添加Spring 2.0 AOP类库即可.添加方法: 点击项目右键->Build Path->Add libra ...
随机推荐
- Hello World! 我的程序员入坑之旅!
先说下本文标题,各行各业都有自己的行规和一些内行人玩的梗什么的,这是我开始写技术博客的第一篇,所以它的标题毫无疑问只能是Hello World! 介绍一下我自己 我算是一个少见的科班出身的开发者了,1 ...
- java中关键字static和final
面向对象的不足 凡是有利必有弊,强对象编程,使得语法简单统一,但也有其缺点,而且有很多.我们在接下来的课程里会一点点接触到.我们今天先看第一个. 有些变量和函数确实没必要定义在一个类里.强行规定这些函 ...
- js面试题——找到数组中的重复元素并判断重复次数且输出重复元素
var countArr = [1,2,3,4,5,6,3,4,3,3,7,8,9,32,1,11,2,3,3,3]; var res = {}; var maxnum=0; var max; fun ...
- Vim编辑器与shell脚本
目录 Vim文本编辑器 Shell脚本 Shell编程变量 流程控制语句 计划任务 ...
- Ubuntu“无法打开锁文件(Could not get lock)”问题解决
用apt-get安装软件时提示: 无法获得锁 /var/lib/dpkg/lock - open(11:资源暂时不可用) 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它? 其 ...
- Swift 中@available 和 #available
Swift 2.0 中,引入了可用性的概念.对于函数,类,协议等,可以使用@available声明这些类型的生命周期依赖于特定的平台和操作系统版本.而#available用在判断语句中(if, gua ...
- AsyncTask、HandlerThread、IntentService和线程池
AsyncTask AsyncTask 是一种轻量级的异步任务类,可以在线程池中执行后台任务,然后把执行的进度和最终结果传递给主线程用于更新UI. 可以直接继承AsyncTask,在类中实现异步操作, ...
- Linux 删除文件夹和文件的命令(转载)
Linux 删除文件夹和文件的命令 听语音 | 浏览:93339 | 更新:2013-05-02 18:40 | 标签:linux 文件夹 linux删除目录很简单,很多人还是习惯用rmdir,不过一 ...
- 【Java并发编程】:并发新特性—Executor框架与线程池
Executor框架简介 在Java5之后,并发编程引入了一堆新的启动.调度和管理线程的API.Executor框架便是Java 5中引入的,其内部使用了线程池机制,它在java.util.cocur ...
- iptables关键学习总结
iptables技术推荐参考这位仁兄的博客:http://www.zsythink.net/archives/category/%E8%BF%90%E7%BB%B4%E7%9B%B8%E5%85%B3 ...