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