返回顶部
首页 > 资讯 > 精选 >Spring Cloud中Hystrix的请求缓存怎么实现
  • 803
分享到

Spring Cloud中Hystrix的请求缓存怎么实现

2023-06-19 12:06:38 803人浏览 泡泡鱼
摘要

本篇内容介绍了“spring cloud中Hystrix的请求缓存怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过方法重载开启缓存

本篇内容介绍了“spring cloud中Hystrix的请求缓存怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

通过方法重载开启缓存

如果我们使用了自定义Hystrix请求命令的方式来使用Hystrix,那么我们只需要重写getCacheKey方法即可实现请求缓存,如下:

public class BookCommand extends HystrixCommand<Book> {    private RestTemplate restTemplate;    private Long id;    @Override    protected Book getFallback() {        Throwable executionException = getExecutionException();        System.out.println(executionException.getMessage());        return new Book("宋诗选注", 88, "钱钟书", "三联书店");    }    @Override    protected Book run() throws Exception {        return restTemplate.getForObject("Http://HELLO-SERVICE/getbook5/{1}", Book.class,id);    }    public BookCommand(Setter setter, RestTemplate restTemplate,Long id) {        super(setter);        this.restTemplate = restTemplate;        this.id = id;    }    @Override    protected String getCacheKey() {        return String.valueOf(id);    }}

系统在运行时会根据getCacheKey方法的返回值来判断这个请求是否和之前执行过的请求一样,即被缓存,如果被缓存,则直接使用缓存数据而不去请求服务提供者,那么很明显,getCacheKey方法将在run方法之前执行。我现在在服务提供者中打印一个日志,如下:

@RequestMapping(value = "/getbook5/{id}", method = RequestMethod.GET)public Book book5(@PathVariable("id") Integer id) {    System.out.println(">>>>>>>>/getbook5/{id}");    if (id == 1) {        return new Book("《李自成》", 55, "姚雪垠", "人民文学出版社");    } else if (id == 2) {        return new Book("中国文学简史", 33, "林庚", "清华大学出版社");    }    return new Book("文学改良刍议", 33, "胡适", "无");}

然后我们服务消费者的Controller中来执行这个请求,如下:

@RequestMapping("/test5")public Book test5() {    HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey("commandKey");    HystrixRequestContext.initializeContext();    BookCommand bc1 = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")).andCommandKey(commandKey), restTemplate, 1l);    Book e1 = bc1.execute();    BookCommand bc2 = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")).andCommandKey(commandKey), restTemplate, 1l);    Book e2 = bc2.execute();    BookCommand bc3 = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")).andCommandKey(commandKey), restTemplate, 1l);    Book e3 = bc3.execute();    System.out.println("e1:" + e1);    System.out.println("e2:" + e2);    System.out.println("e3:" + e3);    return e1;}

我连着发起三个相同的请求,我们来看看服务提供者的日志打印情况,注意,在服务请求发起之前,需要先初始化HystrixRequestContext。执行效果如下:

Spring Cloud中Hystrix的请求缓存怎么实现  

小伙伴们看到,上面是服务提供者打印出来的日志,下面是服务消费者打印出来的日志,发起了三个请求,但是服务提供者实际上只执行了一次,其他两次都使用了缓存数据。

有一种特殊的情况:如果我将服务提供者的数据修改了,那么缓存的数据就应该被清除,否则用户在读取的时候就有可能获取到一个错误的数据,缓存数据的清除也很容易,也是根据id来清除,方式如下:

@RequestMapping("/test5")public Book test5() {    HystrixCommandKey commandKey = HystrixCommandKey.Factory.asKey("commandKey");    HystrixRequestContext.initializeContext();    BookCommand bc1 = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")).andCommandKey(commandKey), restTemplate, 1l);    Book e1 = bc1.execute();    HystrixRequestCache.getInstance(commandKey, HystrixConcurrencyStrategyDefault.getInstance()).clear(String.valueOf(1l));    BookCommand bc2 = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")).andCommandKey(commandKey), restTemplate, 1l);    Book e2 = bc2.execute();    BookCommand bc3 = new BookCommand(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("")).andCommandKey(commandKey), restTemplate, 1l);    Book e3 = bc3.execute();    System.out.println("e1:" + e1);    System.out.println("e2:" + e2);    System.out.println("e3:" + e3);    return e1;}

小伙伴们注意,这里我们执行完第一次请求之后,id为1的数据就已经被缓存下来了,然后我通过HystrixRequestCache中的clear方法将缓存的数据清除掉,这个时候如果我再发起请求,则又会调用服务提供者的方法,我们来看一下执行结果,如下:

Spring Cloud中Hystrix的请求缓存怎么实现  

小伙伴们看到,此时服务提供者的方法执行了两次,因为我在第一次请求结束后将id为1的缓存清除了。

通过注解开启缓存

当然,我们也可以通过注解来开启缓存,和缓存相关的注解一共有三个,分别是@CacheResult、@CacheKey和@CacheRemove,我们分别来看。

@CacheResult

@CacheResult方法可以用在我们之前的Service方法上,表示给该方法开启缓存,默认情况下方法的所有参数都将作为缓存的key,如下:

@CacheResult@HystrixCommandpublic Book test6(Integer id,String aa) {    return restTemplate.getForObject("http://HELLO-SERVICE/getbook5/{1}", Book.class, id);}

此时test6方法会自动开启缓存,默认所有的参数都将作为缓存的key,如果在某次调用中传入的两个参数和之前传入的两个参数都一致的话,则直接使用缓存,否则就发起请求,如下:

@RequestMapping("/test6")public Book test6() {    HystrixRequestContext.initializeContext();    //第一次发起请求    Book b1 = bookService.test6(2, "");    //参数和上次一致,使用缓存数据    Book b2 = bookService.test6(2, "");    //参数不一致,发起新请求    Book b3 = bookService.test6(2, "aa");    return b1;}

当然这里我们也可以在@CacheResult中添加cacheKeyMethod属性来指定返回缓存key的方法,注意返回的key要是String类型的,如下:

@CacheResult(cacheKeyMethod = "getCacheKey2")@HystrixCommandpublic Book test6(Integer id) {    return restTemplate.getForObject("http://HELLO-SERVICE/getbook5/{1}", Book.class, id);}public String getCacheKey2(Integer id) {    return String.valueOf(id);}

此时默认的规则失效。

@CacheKey

当然除了使用默认数据之外,我们也可以使用@CacheKey来指定缓存的key,如下:

@CacheResult@HystrixCommandpublic Book test6(@CacheKey Integer id,String aa) {    return restTemplate.getForObject("http://HELLO-SERVICE/getbook5/{1}", Book.class, id);}

这里我们使用@CacheKey注解指明了缓存的key为id,和aa这个参数无关,此时只要id相同就认为是同一个请求,而aa参数的值则不会作为判断缓存的依据(这里只是举例子,实际开发中我们的调用条件可能都要作为key,否则可能会获取到错误的数据)。如果我们即使用了@CacheResult中cacheKeyMethod属性来指定key,又使用了@CacheKey注解来指定key,则后者失效。

@CacheRemove

这个当然是用来让缓存失效的注解,用法也很简单,如下:

@CacheRemove(commandKey = "test6")@HystrixCommandpublic Book test7(@CacheKey Integer id) {    return null;}

注意这里必须指定commandKey,commandKey的值就为缓存的位置,配置了commandKey属性的值,Hystrix才能找到请求命令缓存的位置。举个简单的例子,如下:

@RequestMapping("/test6")public Book test6() {    HystrixRequestContext.initializeContext();    //第一次发起请求    Book b1 = bookService.test6(2);    //清除缓存    bookService.test7(2);    //缓存被清除,重新发起请求    Book b2 = bookService.test6(2);    //参数一致,使用缓存数据    Book b3 = bookService.test6(2);    return b1;}

spring Cloud中Hystrix的请求缓存怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Spring Cloud中Hystrix的请求缓存怎么实现

本文链接: https://lsjlt.com/news/296079.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring Cloud中Hystrix的请求缓存怎么实现
    本篇内容介绍了“Spring Cloud中Hystrix的请求缓存怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!通过方法重载开启缓存...
    99+
    2023-06-19
  • Spring Cloud中Hystrix的请求合并方法
    本篇内容介绍了“Spring Cloud中Hystrix的请求合并方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!服务提供者接口我需在在服...
    99+
    2023-06-19
  • Spring Cloud中怎么自定义Hystrix请求命令
    Spring Cloud中怎么自定义Hystrix请求命令,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。自定义HystrixCommand我们除了使用@Hyst...
    99+
    2023-06-19
  • Spring Cloud中的断路器Hystrix怎么使用
    本篇内容介绍了“Spring Cloud中的断路器Hystrix怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先我们分别启动服务注...
    99+
    2023-06-19
  • Spring Cloud中如何使用Hystrix实现断路器
    这篇文章主要介绍了Spring Cloud中如何使用Hystrix实现断路器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Cloud中如何使用Hystrix实现断路器文章都会有所收获,下面我们一起...
    99+
    2023-06-04
  • SpringCache如何实现请求级别缓存
    这篇文章将为大家详细讲解有关SpringCache如何实现请求级别缓存,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 方案分析 要将数据缓存在一次请求周期内,那我们先...
    99+
    2024-04-02
  • Spring Cloud gateway网关怎么拦截Post请求日志
    本篇内容主要讲解“Spring Cloud gateway网关怎么拦截Post请求日志”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud gateway网关怎么拦截Post请...
    99+
    2023-06-20
  • 如何在Go语言中实现路由的请求缓存
    如何在Go语言中实现路由的请求缓存在Web开发中,路由是一个非常重要的概念,用于将客户端请求映射到相应的处理程序。在高并发的情况下,频繁地处理请求可能会导致服务器性能下降。为了减轻服务器的负载和提高响应速度,可以对路由的请求进行缓存。在Go...
    99+
    2023-12-17
    Go语言 路由 请求缓存
  • Android 中Volley二次封装并实现网络请求缓存
    Android 中Volley二次封装并实现网络请求缓存Android目前很多同学使用Volley请求网络数据,但是Volley没有对请求过得数据进行缓存,因此需要我们自己手动缓存。 一下就是我的一种思路,仅供参考具体使用方法为:HashM...
    99+
    2023-05-30
    android volley roi
  • Spring Boot怎么实现请求参数校验
    这篇文章主要介绍了Spring Boot怎么实现请求参数校验的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Spring Boot怎么实现请求参数校验文章都会有所收获,下面我们一...
    99+
    2024-04-02
  • Android实现图片异步请求加三级缓存
    使用xUtils等框架是很方便,但今天要用代码实现bitmapUtils 的功能,很简单, AsyncTask请求一张图片 ####AsyncTask #####AsyncT...
    99+
    2022-06-06
    异步请求 三级缓存 图片 异步 缓存 Android
  • 怎么使用Spring提供的不同缓存注解实现缓存
    这篇文章主要介绍了怎么使用Spring提供的不同缓存注解实现缓存的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Spring提供的不同缓存注解实现缓存文章都会有所收获,下面我们一起来看看吧。前言缓存可以通...
    99+
    2023-07-06
  • Spring Boot中怎么利用Redis 实现缓存操作
    这期内容当中小编将会给大家带来有关Spring Boot中怎么利用Redis 实现缓存操作,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一、缓存的应用场景二、更新缓存的策略三、运行 springboot-...
    99+
    2023-06-17
  • Spring中的Http请求如何使用restTemplete实现
    这篇文章给大家介绍Spring中的Http请求如何使用restTemplete实现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。使用Spring的restTemplete进行Http请求public class Res...
    99+
    2023-05-31
    resttemplete spring http请求
  • 在Go语言中如何解决并发网络请求的请求缓存和缓存更新问题
    在Go语言中,可以使用sync.Map来实现请求缓存和缓存更新的问题。首先,我们可以创建一个全局的sync.Map来作为缓存,用于存...
    99+
    2023-10-09
    Go语言
  • 在Go语言中如何解决并发网络请求的请求缓存和缓存更新问题?
    标题:Go语言中的并发网络请求的请求缓存和缓存更新问题解决方案引言:在现代程序开发中,网络请求是非常常见的操作,而并发请求更是提高程序性能和响应速度的关键。然而,在并发网络请求中,往往会面临请求重复发送、数据不一致等问题。本文将介绍如何在G...
    99+
    2023-10-22
    Go语言 并发 解决 缓存更新 请求缓存
  • Golang中怎么实现GET请求
    这篇文章主要讲解了“Golang中怎么实现GET请求”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang中怎么实现GET请求”吧!一、Golang中的GET请求在Golang中,我们可...
    99+
    2023-07-05
  • SpringBoot怎么整合Spring Cache实现Redis缓存
    今天小编给大家分享一下SpringBoot怎么整合Spring Cache实现Redis缓存的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下...
    99+
    2023-07-02
  • Spring Cloud中Hystrix服务降级与异常处理的方法是什么
    本篇内容主要讲解“Spring Cloud中Hystrix服务降级与异常处理的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud中Hystrix服务降级与异常处理的...
    99+
    2023-06-19
  • Spring Cloud怎么实现高可用的配置中心
    这篇文章主要为大家展示了“Spring Cloud怎么实现高可用的配置中心”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Spring Cloud怎么实现高可用的配置中心”这篇文章吧。配置中心如何...
    99+
    2023-06-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作