国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解spring cloud hystrix緩存功能的使用

詳解spring cloud hystrix緩存功能的使用

2021-05-26 12:46TS笑天 Java教程

這篇文章主要介紹了詳解spring cloudhystrix緩存功能的使用,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

hystrix緩存的作用是

- 1.減少重復的請求數,降低依賴服務的返回數據始終保持一致。
- 2.==在同一個用戶請求的上下文中,相同依賴服務的返回數據始終保持一致==。
- 3.請求緩存在run()和construct()執行之前生效,所以可以有效減少不必要的線程開銷。

1 通過hystrixcommand類實現

1.1 開啟緩存功能

繼承hystrixcommand或hystrixobservablecommand,覆蓋getcachekey()方法,指定緩存的key,開啟緩存配置。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import com.netflix.hystrix.hystrixcommand;
import com.netflix.hystrix.hystrixcommandgroupkey;
import com.netflix.hystrix.hystrixcommandkey;
import com.netflix.hystrix.hystrixrequestcache;
import com.netflix.hystrix.strategy.concurrency.hystrixconcurrencystrategydefault;
import com.szss.demo.orders.vo.uservo;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.web.client.resttemplate;
 
public class usercachecommand extends hystrixcommand<uservo> {
  private static final logger logger = loggerfactory.getlogger(usercachecommand.class);
 
  private static final hystrixcommandkey getter_key= hystrixcommandkey.factory.askey("commandkey");
  private resttemplate resttemplate;
  private string username;
 
  public usercachecommand(resttemplate resttemplate, string username) {
    super(setter.withgroupkey(hystrixcommandgroupkey.factory.askey("usercachecommand")).andcommandkey(getter_key));
    this.resttemplate = resttemplate;
    this.username = username;
  }
 
  @override
  protected uservo run() throws exception {
    logger.info("thread:" + thread.currentthread().getname());
    return resttemplate.getforobject("http://users-service/user/name/{username}", uservo.class, username);
  }
 
  @override
  protected uservo getfallback() {
    uservo user = new uservo();
    user.setid(-1l);
    user.setusername("調用失敗");
    return user;
  }
 
  @override
  protected string getcachekey() {
    return username;
  }
 
  public static void flushcache(string username){
    hystrixrequestcache.getinstance(getter_key, hystrixconcurrencystrategydefault.getinstance()).clear(username);
  }
}

1.2 配置hystrixrequestcontextservletfilter

通過servlet的filter配置hystrix的上下文。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import com.netflix.hystrix.strategy.concurrency.hystrixrequestcontext;
import javax.servlet.*;
import javax.servlet.annotation.webfilter;
import java.io.ioexception;
 
@webfilter(filtername = "hystrixrequestcontextservletfilter",urlpatterns = "/*",asyncsupported = true)
public class hystrixrequestcontextservletfilter implements filter {
  public void dofilter(servletrequest request, servletresponse response, filterchain chain) throws ioexception, servletexception {
    hystrixrequestcontext context = hystrixrequestcontext.initializecontext();
    try {
      chain.dofilter(request, response);
    } finally {
      context.shutdown();
    }
  }
 
  @override
  public void init(filterconfig filterconfig) throws servletexception {
 
  }
 
  @override
  public void destroy() {
 
  }
}

在不同context中的緩存是不共享的,還有這個request內部一個threadlocal,所以request只能限于當前線程。

1.3 清除失效緩存

繼承hystrixcommand或hystrixobservablecommand,在更新接口調用完成后,清空緩存。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import com.netflix.hystrix.hystrixcommand;
import com.netflix.hystrix.hystrixcommandgroupkey;
import com.netflix.hystrix.hystrixcommandkey;
import com.szss.demo.orders.vo.uservo;
import org.slf4j.logger;
import org.slf4j.loggerfactory;
import org.springframework.http.httpentity;
import org.springframework.web.client.resttemplate;
 
public class userupdatecachecommand extends hystrixcommand<uservo> {
  private static final logger logger = loggerfactory.getlogger(userupdatecachecommand.class);
 
  private static final hystrixcommandkey getter_key = hystrixcommandkey.factory.askey("commandkey");
  private resttemplate resttemplate;
  private uservo user;
 
  public userupdatecachecommand(resttemplate resttemplate, uservo user) {
    super(setter.withgroupkey(hystrixcommandgroupkey.factory.askey("userupdatecachecommand")));
    this.resttemplate = resttemplate;
    this.user = user;
  }
 
  @override
  protected uservo run() throws exception {
    logger.info("thread:" + thread.currentthread().getname());
    httpentity<uservo> u = new httpentity<uservo>(user);
    uservo uservo=resttemplate.postforobject("http://users-service/user",u,uservo.class);
    usercachecommand.flushcache(user.getusername());
    return uservo;
  }
 
//  @override
//  protected uservo getfallback() {
//    uservo user = new uservo();
//    user.setid(-1l);
//    user.setusername("調用失敗");
//    return user;
//  }
 
  @override
  protected string getcachekey() {
    return user.getusername();
  }
}

2 使用@cacheresult、@cacheremove和@cachekey標注來實現緩存

2.1 使用@cacheresult實現緩存功能

?
1
2
3
4
5
6
7
8
9
10
@cacheresult(cachekeymethod = "getcachekey")
@hystrixcommand(commandkey = "finduserbyid", groupkey = "userservice", threadpoolkey = "userservicethreadpool")
public uservo findbyid(long id) {
  responseentity<uservo> user = resttemplate.getforentity("http://users-service/user?id={id}", uservo.class, id);
  return user.getbody();
}
 
public string getcachekey(long id) {
  return string.valueof(id);
}

@cacheresult注解中的cachekeymethod用來標示緩存key(cachekey)的生成函數。函數的名稱可任意取名,入參和標注@cacheresult的方法是一致的,返回類型是string。

2.2 使用@cacheresult和@cachekey實現緩存功能

?
1
2
3
4
5
6
@cacheresult
@hystrixcommand(commandkey = "finduserbyid", groupkey = "userservice", threadpoolkey = "userservicethreadpool")
public uservo findbyid2(@cachekey("id") long id) {
  responseentity<uservo> user = resttemplate.getforentity("http://users-service/user?id={id}", uservo.class, id);
  return user.getbody();
}

標注@hystrixcommand注解的方法,使用@cachekey標注需要指定的參數作為緩存key。

2.3 使用@cacheremove清空緩存

?
1
2
3
4
5
@cacheremove(commandkey = "finduserbyid")
@hystrixcommand(commandkey = "updateuser",groupkey = "userservice",threadpoolkey = "userservicethreadpool")
public void updateuser(@cachekey("id")uservo user){
  resttemplate.postforobject("http://users-service/user",user,uservo.class);
}

@cacheremove必須指定commandkey,否則程序無法找到緩存位置。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/zhuchuangang/article/details/74566185

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日日操av | 日本激情网| 国产精品美女久久久久久久久久久 | 亚洲欧美影院 | 国产在线精品一区 | 亚洲国产一区二区三区日本久久久 | 91中文字幕网 | 久久伊人中文字幕 | 一区二区中文字幕 | 欧美性猛片aaaaaaa做受 | 欧洲成人午夜免费大片 | 亚洲国产精品久久人人爱 | 午夜午夜精品一区二区三区文 | 香蕉久久夜色精品国产使用方法 | 亚洲精品综合 | 久久蜜桃精品一区二区三区综合网 | 久久久九九| 男女激情网址 | 欧美一区二区三区不卡 | 国产美女网站视频 | 一级久久 | 色日韩 | 日韩成人精品 | 精品一区二区三区免费 | 亚洲成av人片一区二区梦乃 | 国产精品色一区二区三区 | 自拍偷拍亚洲一区 | 欧美91在线 | 精品成人| 欧洲精品在线观看 | 九一精品| 国产精品成人一区二区三区夜夜夜 | 欧美日韩国产一级片 | 免费网站在线 | 精品在线视频一区 | a成人| 精品免费国产一区二区三区 | 一区二区三区国产 | 高清一区二区三区 | 国产人妖视频 | 亚洲精品白浆高清久久久久久 |