javaB2B2CSpringcloud電子商務平臺源碼------Hystrix的緩存使用

一 介紹

公司主營業(yè)務:網(wǎng)站設計、成都網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)建站是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)建站推出寧波免費做網(wǎng)站回饋大家。

在高并發(fā)的場景之下,Hystrix中提供了請求緩存的功能,可以方便地開啟和使用請求緩存來優(yōu)化系統(tǒng),達到減輕高并發(fā)時請求線程的消耗、降低請求響應時間的效果。愿意了解源碼的朋友直接求求交流分享技術:二一四七七七五六三三

二開啟請求緩存功能

在實現(xiàn)HystrixCommand或HystrixObservableCommand時,通過重載getCacheKey()方法來開啟請求緩存。

例如:

public class CommandUsingRequestCache extends HystrixCommand<Boolean> {
 
    private final int value;
 
    protected CommandUsingRequestCache(int value) {
        super(HystrixCommandGroupKey.Factory.asKey("ExampleGroup"));
        this.value = value;
    }
 
    @Override
    protected Boolean run() {
        return value == 0 || value % 2 == 0;
    }
 
    //通過getCacheKey方法中返回的請求緩存key值,就能讓該請求命令具備緩存功能。此時當不同的外部請求
    //處理邏輯調(diào)用了同一個依賴服務時,Hystrix會根據(jù)getCacheKey方法返回的值區(qū)分是否是重復請求,
    //如果它們的cachekey相同時候,那么該依賴服務值會在第一個請求達到時被真實的調(diào)用一次,另外一個
    //請求則直接從請求緩存中返回結果,所以開啟緩存有以下好處:
    //減少重復請求數(shù),降低依賴服務的并發(fā)度
    //在同一用戶請求的上下文中,相同依賴服務的返回數(shù)據(jù)始終保持一致。
    //請求緩存在run()和construct()執(zhí)行之前生效,所以可以有效減少不必要的線程開銷。
    @Override
    protected String getCacheKey() {
        return String.valueOf(value);
    }
}

三 清理失效緩存功能

使用請求緩存時,如果只是讀操作,那么不需要考慮緩存內(nèi)容是否正確的問題,但是如果請求命令中還有更新數(shù)據(jù)的操作,那么緩存中的數(shù)據(jù)就需要我們在進行寫操作時進行及時處理,以防止讀操作的請求命令獲取到失效的數(shù)據(jù)。

在Hystrix中,可以通過HystrixRequestCache.clear()方法來進行緩存的清理。

例如:

//當我們對GetterCommand命令實現(xiàn)了請求緩存之后,那么勢必需要為SetterCommand命令實現(xiàn)清理緩存,以保證
//prefixStoredOnRemoteDataStore被更新之后,Hystrix請求緩存中相同的緩存的結果被移除,這樣下一次根據(jù)id
//獲取prefixStoredOnRemoteDataStore時,不會從緩存去獲取數(shù)據(jù)
public class CommandUsingRequestCacheInvalidation {
 
    /* represents a remote data store */
    private static volatile String prefixStoredOnRemoteDataStore = "ValueBeforeSet_";
 
    //根據(jù)id獲取數(shù)據(jù)
    public static class GetterCommand extends HystrixCommand<String> {
 
        private static final HystrixCommandKey GETTER_KEY = HystrixCommandKey.Factory.asKey("GetterCommand");
        private final int id;
 
        public GetterCommand(int id) {
            super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GetSetGet"))
                    .andCommandKey(GETTER_KEY));
            this.id = id;
        }
 
        @Override
        protected String run() {
            return prefixStoredOnRemoteDataStore + id;
        }
 
        @Override
        protected String getCacheKey() {
            return String.valueOf(id);
        }
 
        //該方法從默認的Hystrix并發(fā)策略中根據(jù)GETTER_KEY獲取命令的請求緩存對象HystrixRequestCache的實例
        //然后再調(diào)用該請求緩存對象的clear方法,對Key為id值的緩存內(nèi)容進行清理。
        public static void flushCache(int id) {
            HystrixRequestCache.getInstance(GETTER_KEY,
                    HystrixConcurrencyStrategyDefault.getInstance()).clear(String.valueOf(id));
        }
 
    }
    //用于更新prefixStoredOnRemoteDataStore的值
    public static class SetterCommand extends HystrixCommand<Void> {
 
        private final int id;
        private final String prefix;
 
        public SetterCommand(int id, String prefix) {
            super(HystrixCommandGroupKey.Factory.asKey("GetSetGet"));
            this.id = id;
            this.prefix = prefix;
        }
 
        @Override
        protected Void run() {
            // persist the value against the datastore
            prefixStoredOnRemoteDataStore = prefix;
            //在調(diào)用了寫prefixStoredOnRemoteDataStore之后,增加了對GetterCommand
            //中靜態(tài)方法flushCache的調(diào)用,以實現(xiàn)對時效緩存的清理工作。
            GetterCommand.flushCache(id);
            // no return value
            return null;
        }
    }
}

整體代碼結構如下:

java B2B2C Springcloud電子商務平臺源碼------Hystrix的緩存使用

資料和源碼來源

網(wǎng)站名稱:javaB2B2CSpringcloud電子商務平臺源碼------Hystrix的緩存使用
URL地址:http://muchs.cn/article26/gdsjjg.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、網(wǎng)站改版標簽優(yōu)化、品牌網(wǎng)站建設、網(wǎng)站營銷自適應網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設計