hystrix 結果緩存機制(5)


hystrix支持將一個請求結果緩存起來,下一個具有相同key的請求將直接從緩存中取出結果,減少請求開銷。要使用hystrix cache功能

第一個要求是重寫getCacheKey(),用來構造cache key;

第二個要求是構建context,如果請求B要用到請求A的結果緩存,A和B必須同處一個context。

通過HystrixRequestContext.initializeContext()context.shutdown()可以構建一個context,這兩條語句間的所有請求都處於同一個context。
測試代碼如下:

HystrixCommandCache.java

public class HystrixCommandCache extends HystrixCommand<Boolean>{
	private final int value;
    private final String value1;

    protected HystrixCommandCache(int value, String value1) {
        super(HystrixCommandGroupKey.Factory.asKey("RequestCacheCommandGroup"));
        this.value = value;
        this.value1 = value1;
    }

    // 返回結果是cache的value
    @Override
    protected Boolean run() {
        return value == 0 || value % 2 == 0;
    }

    // 構建cache的key
    @Override
    protected String getCacheKey() {
        return String.valueOf(value) + value1;
	}

}

 HystrixCommandCacheTest.java

public class HystrixCommandCacheTest {
	
  @Test
  public void testWithoutCacheHits() {
      HystrixRequestContext context = HystrixRequestContext.initializeContext();
      try {
          assertTrue(new HystrixCommandCache(2,"HLX").execute());
          assertFalse(new HystrixCommandCache(1,"HLX").execute());
          assertTrue(new HystrixCommandCache(0,"HLX").execute());
          assertTrue(new HystrixCommandCache(58672,"HLX").execute());
      } finally {
          context.shutdown();
      }
  }

  @Test
  public void testWithCacheHits() {
      HystrixRequestContext context = HystrixRequestContext.initializeContext();
      try {
    	  HystrixCommandCache command2a = new HystrixCommandCache(2,"HLX");
    	  HystrixCommandCache command2b = new HystrixCommandCache(2,"HLX");
    	  HystrixCommandCache command2c = new HystrixCommandCache(2,"HLX1");

          assertTrue(command2a.execute());
          // 第一次執行,不應該是從緩存中獲取
          assertFalse(command2a.isResponseFromCache());

          assertTrue(command2b.execute());
          // 第二次執行,通過isResponseFromCache()方法判斷是否是從緩存中獲取的
          assertTrue(command2b.isResponseFromCache());
          
          //雖然是第三次執行,但是getCacheKey()的緩存key值不一樣,依然無法從緩存中獲取
          assertTrue(command2c.execute());
          assertFalse(command2c.isResponseFromCache());
      } finally {
          context.shutdown();
      }

      // 開啟一個新的context
      context = HystrixRequestContext.initializeContext();
      try {
    	  HystrixCommandCache command3a = new HystrixCommandCache(2,"HLX");
    	  HystrixCommandCache command3b = new HystrixCommandCache(2,"HLX");
          assertTrue(command3a.execute());
          // 第一次請求,不應該從緩存中獲取
          assertFalse(command3a.isResponseFromCache());

          //沒有執行excute(),isResponseFromCache()永遠返回是true
          assertFalse(command3b.isResponseFromCache());
      } finally {
          context.shutdown();
      }
  }
}

以測試demo的testWithCacheHits()為例,command2acommand2bcommand2c同處一個context,前兩者的cache key都是2HLX(見getCacheKey()),所以command2a執行完后把結果緩存,command2b執行時就不走run()而是直接從緩存中取結果了,而command2c的cache key是2HLX1,無法從緩存中取結果。

注:isResponseFromCache()方法用於檢測是否是從緩存中獲取;

參考文獻:http://www.jianshu.com/p/b9af028efebb


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM