91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何進行SpringCloud-Hystrix緩存與合并請求

發布時間:2021-09-29 14:46:50 來源:億速云 閱讀:132 作者:柒染 欄目:編程語言

如何進行SpringCloud-Hystrix緩存與合并請求,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

緩存在開發中經常用到,我們常用 Redis 這種第三方的緩存數據庫對數據進行緩存處理。

結果緩存

在 Hystrix 中也為我們提供了方法級別的緩存。通過重寫 getCacheKey 來判斷是否返回緩存的數據,getCacheKey 可以根據參數來生成。這樣,同樣的參數就可以都用到緩存了。

改造之前的 MyHystrixCommand,在其中增加 getCacheKey 的重寫實現,代碼如下所示。

@Overrideprotected String getCacheKey() {return String.valueOf(this.name);
}

在上面的代碼中,我們把創建對象時傳進來的 name 參數作為緩存的 key。

為了證明能夠用到緩存,在 run 方法中加一行輸出,在調用多次的情況下,如果控制臺只輸出了一次,那么可以知道后面的都是走的緩存邏輯,代碼如下所示。

@Overrideprotected String run() {System.err.println("get data");return this.name + ":" + Thread.currentThread().getName();
}

執行 main 方法,發現程序報錯了,如圖 1 所示:

如何進行SpringCloud-Hystrix緩存與合并請求

完整錯誤信息如下:

Caused by: java.lang.IllegalStateException: Request caching is not available. Maybe you need to initialize the HystrixRequestContext?

根據錯誤提示可以知道,緩存的處理取決于請求的上下文,我們必須初始化 Hystrix-RequestContext。

改造 main 方法中的調用代碼,初始化 HystrixRequestContext,代碼如下所示。

public static void main(String[] args) throws InterruptedException, ExecutionException {
    HystrixRequestContext context = HystrixRequestContext.initializeContext();
    String result = new MyHystrixCommand("zhangsan").execute();
    System.out.println(result);
    Future<String> future = new MyHystrixCommand("zhangsan").queue();
    System.out.println(future.get());
    context.shutdown();
}

改造完之后重寫執行 main 方法,就可以做正常運行了,輸出結果如圖 2 所示:

如何進行SpringCloud-Hystrix緩存與合并請求

我們可以看到只輸出了一次 get data,緩存生效。

緩存清除

剛剛我們學習了如何使用 Hystrix 來實現數據緩存功能。有緩存必然就有清除緩存的動作。

當數據發生變動時,必須將緩存中的數據也更新掉,不然就會出現臟數據的問題。同樣地,Hystrix 也有清除緩存的功能。

增加一個支持緩存清除的類,代碼如下所示。

public class ClearCacheHystrixCommand extends HystrixCommand<String> {private final String name;private static final HystrixCommandKey GETTER_KEY = HystrixCommandKey.Factory.asKey("MyKey");public ClearCacheHystrixCommand(String name) {super(HystrixCommand.Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("MyGroup"))
                .andCommandKey(GETTER_KEY));this.name = name;
    }public static void flushCache(String name) {
        HystrixRequestCache.getInstance(GETTER_KEY,HystrixConcurrencyStrategyDefault.getInstance()).clear(name);
    }@Overrideprotected String getCacheKey() {return String.valueOf(this.name);
    }@Overrideprotected String run() {
        System.err.println("get data");return this.name + ":" + Thread.currentThread().getName();
    }@Overrideprotected String getFallback() {return "失敗了 ";
    }
}

flushCache 方法就是清除緩存的方法,通過 HystrixRequestCache 來執行清除操作,根據 getCacheKey 返回的 key 來清除。

修改調用代碼來驗證清除是否有效果,代碼如下所示。

public static void main(String[] args) throws InterruptedException, ExecutionException {
    HystrixRequestContext context = HystrixRequestContext.initializeContext();
    String result = new ClearCacheHystrixCommand("zhangsan").execute();
    System.out.println(result);
    ClearCacheHystrixCommand.flushCache("zhangsan");
    Future<String> future = new ClearCacheHystrixCommand("zhangsan").queue();
    System.out.println(future.get());
}

執行兩次相同的 key,在第二次執行之前調用緩存清除的方法,也就是說第二次用不到緩存,輸出結果如圖 3 所示:
如何進行SpringCloud-Hystrix緩存與合并請求

由此可以看出,輸出兩次 get data,這證明緩存確實被清除了。可以把 ClearCache-HystrixCommand.flushCache 這行代碼注釋掉再執行一次,就會發現只輸出了一次 get data,緩存是有效的,輸入結果如圖 2 所示。

合并請求

Hystrix 支持將多個請求自動合并為一個請求(代碼如下所示),利用這個功能可以節省網絡開銷,比如每個請求都要通過網絡訪問遠程資源。如果把多個請求合并為一個一起執行,將多次網絡交互變成一次,則會極大地節省開銷。

public class MyHystrixCollapser extends HystrixCollapser<List<String>, String, String> {private final String name;public MyHystrixCollapser(String name) {this.name = name;
    }@Overridepublic String getRequestArgument() {return name;
    }@Overrideprotected HystrixCommand<List<String>> createCommand(final Collection<CollapsedRequest<String, String>> requests) {return new BatchCommand(requests);
    }@Overrideprotected void mapResponseToRequests(List<String> batchResponse,
            Collection<CollapsedRequest<String, String>> requests) {
        int count = 0;for (CollapsedRequest<String, String> request : requests) {
            request.setResponse(batchResponse.get(count++));
        }
    }private static final class BatchCommand extends HystrixCommand<List<String>> {private final Collection<CollapsedRequest<String, String>> requests;private BatchCommand(Collection<CollapsedRequest<String, String>> requests) {super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"))
                    .andCommandKey(HystrixCommandKey.Factory.asKey("GetValueForKey")));this.requests = requests;
        }@Overrideprotected List<String> run() {
            System.out.println(" 真正執行請求......");
            ArrayList<String> response = new ArrayList<String>();for (CollapsedRequest<String, String> request : requests) {
                response.add(" 返回結果 : " + request.getArgument());
            }return response;
        }
    }
}

接下來編寫測試代碼,代碼如下所示。

public static void main(String[] args) throws InterruptedException, ExecutionException {
    HystrixRequestContext context = HystrixRequestContext.initializeContext();
    Future<String> f1 = new MyHystrixCollapser("zhangsan").queue();
    Future<String> f2 = new MyHystrixCollapser("zhangsan333").queue();
    System.out.println(f1.get() + "=" + f2.get());
    context.shutdown();
}

通過 MyHystrixCollapser 創建兩個執行任務,按照正常的邏輯肯定是分別執行這兩個任務,通過 HystrixCollapser 可以將多個任務合并到一起執行。從輸出結果就可以看出,任務的執行是在 run 方法中去做的,輸出結果如圖 4 所示: 

如何進行SpringCloud-Hystrix緩存與合并請求

看完上述內容,你們掌握如何進行SpringCloud-Hystrix緩存與合并請求的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

墨竹工卡县| 甘谷县| 宿迁市| 西城区| 泗水县| 海盐县| 五寨县| 大理市| 永兴县| 海南省| 瑞昌市| 平遥县| 益阳市| 柳河县| 德安县| 梁平县| 托里县| 闵行区| 天门市| 长顺县| 安塞县| 吉隆县| 苏尼特右旗| 安康市| 云林县| 民乐县| 思南县| 个旧市| 临桂县| 竹山县| 抚远县| 藁城市| 南溪县| 潢川县| 报价| 新化县| 泰安市| 长泰县| 黎城县| 琼结县| 通州市|