hystrix 结果缓存机制(5)
hystrix支持将一个请求结果缓存起来,下一个具有相同key的请求将直接从缓存中取出结果,减少请求开销。要使用hystrix cache功能
第一个要求是重写getCacheKey()
,用来构造cache key;
第二个要求是构建context,如果请求B要用到请求A的结果缓存,A和B必须同处一个context。
通过HystrixRequestContext.initializeContext()
和context.shutdown()
可以构建一个context,这两条语句间的所有请求都处于同一个context。
测试代码如下:
HystrixCommandCache.java
- public class HystrixCommandCache extends HystrixCommand<Boolean>{
- private final int value;
- private final String value1;
- protected HystrixCommandCache(int value, String value1) {
- super(HystrixCommandGroupKey.Factory.asKey("RequestCacheCommandGroup"));
- this.value = value;
- this.value1 = value1;
- }
- // 返回结果是cache的value
- @Override
- protected Boolean run() {
- return value == 0 || value % 2 == 0;
- }
- // 构建cache的key
- @Override
- protected String getCacheKey() {
- return String.valueOf(value) + value1;
- }
- }
HystrixCommandCacheTest.java
- public class HystrixCommandCacheTest {
- @Test
- public void testWithoutCacheHits() {
- HystrixRequestContext context = HystrixRequestContext.initializeContext();
- try {
- assertTrue(new HystrixCommandCache(2,"HLX").execute());
- assertFalse(new HystrixCommandCache(1,"HLX").execute());
- assertTrue(new HystrixCommandCache(0,"HLX").execute());
- assertTrue(new HystrixCommandCache(58672,"HLX").execute());
- } finally {
- context.shutdown();
- }
- }
- @Test
- public void testWithCacheHits() {
- HystrixRequestContext context = HystrixRequestContext.initializeContext();
- try {
- HystrixCommandCache command2a = new HystrixCommandCache(2,"HLX");
- HystrixCommandCache command2b = new HystrixCommandCache(2,"HLX");
- HystrixCommandCache command2c = new HystrixCommandCache(2,"HLX1");
- assertTrue(command2a.execute());
- // 第一次执行,不应该是从缓存中获取
- assertFalse(command2a.isResponseFromCache());
- assertTrue(command2b.execute());
- // 第二次执行,通过isResponseFromCache()方法判断是否是从缓存中获取的
- assertTrue(command2b.isResponseFromCache());
- //虽然是第三次执行,但是getCacheKey()的缓存key值不一样,依然无法从缓存中获取
- assertTrue(command2c.execute());
- assertFalse(command2c.isResponseFromCache());
- } finally {
- context.shutdown();
- }
- // 开启一个新的context
- context = HystrixRequestContext.initializeContext();
- try {
- HystrixCommandCache command3a = new HystrixCommandCache(2,"HLX");
- HystrixCommandCache command3b = new HystrixCommandCache(2,"HLX");
- assertTrue(command3a.execute());
- // 第一次请求,不应该从缓存中获取
- assertFalse(command3a.isResponseFromCache());
- //没有执行excute(),isResponseFromCache()永远返回是true
- assertFalse(command3b.isResponseFromCache());
- } finally {
- context.shutdown();
- }
- }
- }
以测试demo的testWithCacheHits()
为例,command2a、command2b、command2c同处一个context,前两者的cache key都是2HLX
(见getCacheKey()
),所以command2a执行完后把结果缓存,command2b执行时就不走run()
而是直接从缓存中取结果了,而command2c的cache key是2HLX1
,无法从缓存中取结果。
注:isResponseFromCache()方法用于检测是否是从缓存中获取;
参考文献:http://www.jianshu.com/p/b9af028efebb
hystrix 结果缓存机制(5)的更多相关文章
- 程序员笔记|详解Eureka 缓存机制
引言 Eureka是Netflix开源的.用于实现服务注册和发现的服务.Spring Cloud Eureka基于Eureka进行二次封装,增加了更人性化的UI,使用更为方便.但是由于Eureka本身 ...
- 详解Eureka 缓存机制
原文:https://www.cnblogs.com/yixinjishu/p/10871243.html 引言 Eureka是Netflix开源的.用于实现服务注册和发现的服务.Spring Clo ...
- 使用Hystrix的插件机制,解决在使用线程隔离时,threadlocal的传递问题
背景 在我们的项目中,比较广泛地使用了ThreadLocal,比如,在filter层,根据token,取到用户信息后,就会放到一个ThreadLocal变量中:在后续的业务处理中,就会直接从当前线程, ...
- 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...
- MyCat源码分析系列之——BufferPool与缓存机制
更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...
- Java三大框架之——Hibernate中的三种数据持久状态和缓存机制
Hibernate中的三种状态 瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...
- Spring缓存机制的理解
在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...
- hibernate缓存机制(转)
原文出处:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是 ...
- [转]Android ListView 与 RecyclerView 对比浅析—缓存机制
从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...
随机推荐
- 在cmd下运行Python脚本+如何使用Python Shell
原文:https://blog.csdn.net/flyfrommath/article/details/77447587?locationNum=2&fps=1
- String 和 new String
String s1=”welcome”; String s2= “welcome:; String s3 =new String(”welcome”); //新建对象 指向新的内存 比较内容 ...
- python访问mysql
1,下载mysql-connector-python-2.0.4 pythoin访问mysql需要有客户端,这个就是连接mysql的库 解压后如下图: 双击lib 以windows为例 把mysql ...
- 【读英文文档】Whetting Your Appetite(刺激你的食欲)
如果你有很多工作是通过计算机来完成的,那么你一定希望其中的很多事情能够自动地实现.比方说,你希望在文本文件中实现查找和替换的功能,以某一种机制实现照片的重命名以及重新排序的功能,一个小型的数据库甚至是 ...
- Java开源生鲜电商平台-订单表的设计(源码可下载)
Java开源生鲜电商平台-订单表的设计(源码可下载) 场景分析说明: 买家(餐馆)用户,通过APP进行选菜,放入购物车,然后下单,最终支付的流程,我们称为下单过程. 买家可以在张三家买茄子,李四家买萝 ...
- zabbix 3.4 ubuntu 16 用腾讯企业邮箱作为告警邮箱
最近一直在研究zabbix监控系统,今天调试了腾讯企业邮箱作为告警邮箱的设置,本次方式是用内置email组件. 第一步: 选择Administration-->Media Types--> ...
- Robot framework之元素定位实战
1.1 id 和name 定位 Web页面都是由许多标签和元素组成的,每个标签或元素都是很多属性,好比一个人 id 和name 可以看作一个人的身份证号和姓名.下面看下教育局招生系统的用户名输入 ...
- shell 中test命令
test可用于测试表达式,支持测试的范围包括:字符串比较,算术比较,文件存在性.属性.类型等判断.例如,判断文件是否为空.文件是否存在.是否是目录.变量是否大于5.字符串是否等于"longs ...
- CoreData的简单使用
一.基础知识: CoreData是对SQLite的封装,使用的时候比较方便,减少对SQL语句的使用. CoreData中的核心对象 NSManagedObjectModel:代表Core Data 的 ...
- SSM-Spring-03:Spring中AOP的初窥和入门小案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- AOP:面向切面编程 AOP的主要作用:是为了程序员更好的关注"业务",专心"做 ...