服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 详解spring cloud hystrix请求缓存(request cache)

详解spring cloud hystrix请求缓存(request cache)

2021-05-03 11:39乃刀的青春 Java教程

这篇文章主要介绍了详解spring cloud hystrix请求缓存(request cache),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

hystrix支持将一个请求结果缓存起来,下一个具有相同key的请求将直接从缓存中取出结果,减少请求开销。要使用该功能必须管理hystrixrequestcontext,如果请求b要用到请求a的结果缓存,a和b必须同处一个context。通过hystrixrequestcontext.initializecontext()和context.shutdown()可以构建一个context,这两条语句间的所有请求都处于同一个context,当然这个管理过程可以通过自定义的filter来实现,参考上一篇文章 http://www.zzvips.com/article/160600.html

hystrix请求缓存注解

@cacheresult 加入该注解的方法将开启请求缓存,默认情况下该方法的所有参数作为缓存的key,也就是说只有该方法的所有参数都一致时才会走缓存。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@service
public class usercacheservice {
  @autowired
  private userfeignclient userfeignclient;
 
  /**
   * @hystrixcommand 的requestcache.enabled 可控制是否支持缓存
   * 只有加了@cacheresult才能缓存,即使requestcache.enabled=true
   * @param id  用户id
   * @return 指定的用户
   */
  @cacheresult
  @hystrixcommand(commandproperties = {
      @hystrixproperty(name="requestcache.enabled",value = "true")
  })
  public user finduserbyid(integer id){
    return userfeignclient.finduserbyid(id);
  }
}

如果requestcache.enabled设置为false,即使加了@cacheresult,缓存也不起作用。

@cachekey 通过该注解可以指定缓存的key

?
1
2
3
4
5
6
7
@cacheresult
 @hystrixcommand(commandproperties = {
     @hystrixproperty(name="requestcache.enabled",value = "true")
 })
 public user finduserbyidandname(@cachekey integer id,string name){
   return userfeignclient.finduserbyid(id);
 }

上面的代码我们用@cachekey修饰了id字段,说明只要id相同的请求默认都会走缓存,与name字段无关,如果我们指定了@cacheresult的cachekeymethod属性,则@cachekey注解无效

@cacheremove 该注解的作用就是使缓存失效

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**
   * 通过@cacheremove 注解指定当调用finduserbyid时将此方法的缓存删除
   * @param id  用户id
   * @param name 用户姓名
   * @return 指定的用户
   */
  @cacheresult
  @cacheremove(commandkey = "finduserbyid")
  @hystrixcommand(commandproperties = {
      @hystrixproperty(name="requestcache.enabled",value = "true")
  })
  public user finduserbyidandname2(@cachekey integer id,string name){
    return userfeignclient.finduserbyid(id);
  }

以上代码指定了@cacheremove的属性commandkey的值为finduserbyid,作用就是当调用finduserbyid时,此方法的缓存将删除。

完整版代码请参考:https://github.com/jingangwang/micro-service

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/heartroll/article/details/78910509

延伸 · 阅读

精彩推荐