欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-12-18 17:22:28
hystrix支持将一个请求结果缓存起来,下一个具有相同key的请求将直接从缓存中取出结果,减少请求开销。要使用该功能必须管理hystrixrequestcontext,如...

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

hystrix请求缓存注解

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

@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

 @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 该注解的作用就是使缓存失效

/**
   * 通过@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时,此方法的缓存将删除。

完整版代码请参考:

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

上一篇:

下一篇: