Hystrix请求缓存

为什么要使用请求缓存这种策略,官方给出的答案是:

  • Different code paths can execute Hystrix Commands without concern of duplicate work.

  白话文大概就是:不同的调用方,可以不必去处理一些重复的操作

  这种模式在一个大型系统中,可以屏蔽一些底层的逻辑,让调用方更加简介清晰;

如何实现:

  1、首先重写Command的getCacheKey方法

  protected String getCacheKey() {    // 自定义key    return key;  }

  因为判断是否需要使用缓存代码, 不设置CacheKey相当于就不使用缓存:

    protected boolean isRequestCachingEnabled() {
        return properties.requestCacheEnabled().get() && getCacheKey() != null;
    }

  2、缓存调用初始化与关闭:

        HystrixRequestContext context = HystrixRequestContext.initializeContext();
        // do something
            System.out.println("from cache " + command.isResponseFromCache());
        });
        context.shutdown();

  在context初始化和shutdown之间的所有command处理,只要缓存的key一致,那么结果就是一致的;

说明:

  如果执行完部分command后,需要刷新一下缓存,可以使用 clear 方法:

HystrixCommandKey GETTER_KEY = HystrixCommandKey.Factory.asKey("testCommandKey");
HystrixRequestCache.getInstance(GETTER_KEY, HystrixConcurrencyStrategyDefault.getInstance())             .clear(String.valueOf(2));

  刷新的粒度是 commandKey下的某个缓存key;

  即使是再请求的context内,刷新缓存后的第一次操作会请求真正的下游服务,并将结果缓存到context内;

  3、注解实现

注解 描述 属性
@CacheResult 改注解用来标记请求命令返回的结果应该被缓存,它必须与@HystrixCommand注解结合使用 cacheKeyMethod
@CacheRemove 该注解用来让请求命令的缓存失效,失效的缓存根据定义的key决定 commandKey,cacheKeyMethod
@CacheKey
改注解用来在请求命令的参数上标记,使其作为缓存的Key值,如果没有标注则会使用所有参数。如果同时还使用了@CacheResult和

@CacheRemove注解的cacheKeyMethod方法指定缓存Key的生成,那么该注解将不会起作用

value

原文地址:https://www.cnblogs.com/souyoulang/p/11370588.html

时间: 2024-11-29 12:09:51

Hystrix请求缓存的相关文章

Hystrix-request cache(请求缓存)

开启请求缓存 请求缓存在run()和construce()执行之前生效,所以可以有效减少不必要的线程开销.你可以通过实现getCachekey()方法来开启请求缓存. package org.hope.hystrix.example.request.cache; import com.netflix.hystrix.HystrixCommand; import com.netflix.hystrix.HystrixCommandGroupKey; public class CommandUsin

SpringCloud实战-Hystrix请求熔断与服务降级

我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险.Spring Cloud Netflix Hystrix就是隔离措施的一种实现,可以设置在某种超时或者失败情形下断开依赖调用或者返回指定逻辑,从而提高分布式系统的稳定性. 生活中举个例子,如电力过载保护器,当电流过大的的时候,出问题,过载器会自动断开,从而保护电器不受烧坏.因此Hystrix请求熔

Hystrix请求熔断与服务降级

我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险.Spring Cloud Netflix Hystrix就是隔离措施的一种实现,可以设置在某种超时或者失败情形下断开依赖调用或者返回指定逻辑,从而提高分布式系统的稳定性. 生活中举个例子,如电力过载保护器,当电流过大的的时候,出问题,过载器会自动断开,从而保护电器不受烧坏.因此Hystrix请求熔

基于 request cache 请求缓存技术优化批量商品数据查询接口_一点课堂(多岸学院)

基于 request cache 请求缓存技术优化批量商品数据查询接口 Hystrix command 执行时 8 大步骤第三步,就是检查 Request cache 是否有缓存. 首先,有一个概念,叫做 Request Context 请求上下文,一般来说,在一个 web 应用中,如果我们用到了 Hystrix,我们会在一个 filter 里面,对每一个请求都施加一个请求上下文.就是说,每一次请求,就是一次请求上下文.然后在这次请求上下文中,我们会去执行 N 多代码,调用 N 多依赖服务,有的

关于IE和edge浏览器中get请求缓存的坑。

主要是在一些使用到cookie的ajax场景中. 比如:Angularjs的$http({"url":url,"method":"GET",withCredentials":true}).success(function(){}) get请求无法得到正确数据的时候,先查看控制台. 如果该请求 from cache 或 来自缓存 你会发现该get请求的请求头为空. 这时就会向服务器发送空请求,导致服务器得不到你的cookie,从而无法根据

Android Xutils框架HttpUtil Get请求缓存问题

话说,今天和服务器开发人员小小的逗逼了一下,为啥呢? 话说今天有个"收藏产品"的请求接口,是get request的哦,我客户端写好接口后,点击"收藏按钮",返回"收藏成功",我又点了一下,尼玛居然还是"收藏成功",我再点一下,这下对了,返回给我"取消收藏成功",好吧,我又点了一下,彻底郁闷了,居然又是"取消收藏成功",这不是逗我的么? 于是我让服务器人员检查他的接口,是不是有啥幺蛾子,

 iOS 网络请求缓存:NSURLCache详解

我读过一些开源项目的网络请求缓存的代码,基本上都是采用在本地存文件的方式进行缓存.如果你打算在你的项目中加入网络请求的缓存,可能你并不需要自己造一个轮子,了解一下 NSURLCache 就足够.本文为大家接收的就是ios开发中的NSURLCache相关使用,一起来看看吧. 缓存 首先, NSURLCache 提供的是内存以及磁盘的综合缓存机制.许多文章谈到,使用NSURLCache 之前需要在 AppDelegate 中缓存空间的设置: - (BOOL)application:(UIApplic

HTTP请求缓存配置及原理

1. 方式一:不发送请求,直接使用缓存文件 (1.1)原理浏览器通过url请求文件时,若被请求的文件在客户端有缓存,则检查已缓存的时间是否过期,若未过期,则不会发送请求到服务器,而直接获取客户端缓存的文件,否则发送请求到服务器请求文件.(1.2)实现服务返回给浏览器文件时,向文件头添加Expires或Cache-Control属性,设置文件缓存期限.(1.2.1)方法一:若web应用为JSP,可在web应用中增加一个Filter,在Filter中为返回客户端的数据流追加Expires或Cache

IE浏览器下使用AJAX登陆接口请求缓存与登陆不了的问题解决

问题: 在IE浏览器下面,登陆的时候老是登陆不上,但是打开控制台的时候再登陆却能登陆上. 分析: 通过抓包,发现,在不打开控制台的时候,少了一个接口的请求,却返回了改接口的返回信息,但是返回信息并不是我想要的,于是就怀疑是IE浏览器在AJAX请求的时候,并不是每次都有真正地请求到,而是在缓存中抓取上次的信息. 解决: 1.在调用接口上加上不定参数,使每次都发出新的请求 URL + '?v='+Math.random() 2.从异步与非异步的方式来解决,因为 $.ajax 请求默认是异步的,这样子