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()为例,command2acommand2bcommand2c同处一个context,前两者的cache key都是2HLX(见getCacheKey()),所以command2a执行完后把结果缓存,command2b执行时就不走run()而是直接从缓存中取结果了,而command2c的cache key是2HLX1,无法从缓存中取结果。

注:isResponseFromCache()方法用于检测是否是从缓存中获取;

参考文献:http://www.jianshu.com/p/b9af028efebb

hystrix 结果缓存机制(5)的更多相关文章

  1. 程序员笔记|详解Eureka 缓存机制

    引言 Eureka是Netflix开源的.用于实现服务注册和发现的服务.Spring Cloud Eureka基于Eureka进行二次封装,增加了更人性化的UI,使用更为方便.但是由于Eureka本身 ...

  2. 详解Eureka 缓存机制

    原文:https://www.cnblogs.com/yixinjishu/p/10871243.html 引言 Eureka是Netflix开源的.用于实现服务注册和发现的服务.Spring Clo ...

  3. 使用Hystrix的插件机制,解决在使用线程隔离时,threadlocal的传递问题

    背景 在我们的项目中,比较广泛地使用了ThreadLocal,比如,在filter层,根据token,取到用户信息后,就会放到一个ThreadLocal变量中:在后续的业务处理中,就会直接从当前线程, ...

  4. 【腾讯Bugly干货分享】彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/qOMO0LIdA47j3RjhbCWUEQ 作者:李 ...

  5. MyCat源码分析系列之——BufferPool与缓存机制

    更多MyCat源码分析,请戳MyCat源码分析系列 BufferPool MyCat的缓冲区采用的是java.nio.ByteBuffer,由BufferPool类统一管理,相关的设置在SystemC ...

  6. Java三大框架之——Hibernate中的三种数据持久状态和缓存机制

    Hibernate中的三种状态   瞬时状态:刚创建的对象还没有被Session持久化.缓存中不存在这个对象的数据并且数据库中没有这个对象对应的数据为瞬时状态这个时候是没有OID. 持久状态:对象经过 ...

  7. Spring缓存机制的理解

    在spring缓存机制中,包括了两个方面的缓存操作:1.缓存某个方法返回的结果:2.在某个方法执行前或后清空缓存. 下面写两个类来模拟Spring的缓存机制: package com.sin90lzc ...

  8. hibernate缓存机制(转)

    原文出处:http://www.cnblogs.com/wean/archive/2012/05/16/2502724.html 一.why(为什么要用Hibernate缓存?) Hibernate是 ...

  9. [转]Android ListView 与 RecyclerView 对比浅析—缓存机制

    从源码角度剖析ListView 与 RecyclerView 缓存机制的不同 https://zhuanlan.zhihu.com/p/23339185 原文地址:http://dev.qq.com/ ...

随机推荐

  1. AI 学习之路

    前言:本文章纯属自己学习路线纪录,不喜勿喷. 最近AI很火,几乎是个程序员 都要去学习AI,作为一个菜鸡小前端,我也踏上了学习AI的方向. 在学习之中,最开始遇到了很多的困难,比如你不知道如何切入进来 ...

  2. Android反编译和再打包神器:Apktool

    首先推荐一下这东东,官网:https://ibotpeaches.github.io/Apktool/ 安装.使用之类的看官方文档吧,写这个博客主要是mark一下这东西. 这玩意只能供打包党来用,要想 ...

  3. Vue作者尤雨溪:以匠人的态度不断打磨完善Vue (图灵访谈)

    访谈对象: 尤雨溪,Vue.js 创作者,Vue Technology创始人,致力于Vue的研究开发. 访谈内容: 你为何选择从事前端方面的工作? 其实,我本科读的是艺术史,研究生阶段学习Design ...

  4. Centos6.5DRBD加载失败,系统更换yum源(国内163)

    我安装的系统是centos6.5的,要在系统上安装DRBD镜像软件,安装完后,无法加载modprobe drbd. 需要更新kernel. 1,首先,先把yum源更换成国内的,不然无法更新kernel ...

  5. 易用性测试、本地化测试、部署测试、无障碍测试、回归测试、冒烟测试、A/B测试

    1.易用性定义: 易用性测试是指测试用户使用软件时是否感觉方便,是否能保证用户使用的测试类型2.本地化测试: ·定义:针对软件的本地化版本实施的针对性测试 ·测试内容: (1)语言,书写习惯 (2)时 ...

  6. 微信小程序-统一下单、微信支付(Java后台)

    1.首先分享 微信统一下单接口: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1   微信接口 签名 对比网址: https: ...

  7. SSM-MyBatis-01:IDEA的安装,永久注册和简单的MyBatis用例

    一,IDEA的安装和永久注册 1.安装: 那到安装包,下一步,选路径,上面可以选操作系统64/32位,下面是程序的默认打开方式,可以不必勾选,也可以全选 路径一定不包含中文,重点 2.永久注册: 将此 ...

  8. Linux时间子系统专题汇总

    关于Linux时间子系统有两个系列文章讲的非常好,分别是WowoTech和DroidPhone. 还有两本书分别是介绍: Linux用户空间时间子系统<Linux/UNIX系统编程手册>的 ...

  9. 为何没有asia/beijing时区?

    Asia/Beijing 这个时区是消失了么? 大约1小时 ago @tinyfool 对啊,我就奇怪为什么北京时间就要用上海和成都... 大约1小时 ago @tinyfool @CatChen我所 ...

  10. 配置windbg遇到的问题

    这几天在学用windbg分析进程的PTE和PDE内容,不过在配置windbg的过程中就遇到了不少问题.以下是步骤,可供参考. 1. 下载windbg,建议选择32位的.然后去 http://www.m ...