java 腦洞 - 緩沖調(diào)用 開(kāi)源模塊

腦洞的由來(lái)

場(chǎng)景一:分頁(yè)查詢,某商品首頁(yè)展示
場(chǎng)景二:緩存分擔(dān)壓力,緩存失效導(dǎo)致大量請(qǐng)求去到下流服務(wù),導(dǎo)致雪崩

緩沖調(diào)用和緩存的區(qū)別

首先緩沖調(diào)用和緩存并不是互相替代的,緩沖調(diào)用是瞬點(diǎn)高并的補(bǔ)充優(yōu)化方案,在某些特殊場(chǎng)景會(huì)發(fā)揮很大的功效。緩沖調(diào)用和緩存的區(qū)別,緩沖調(diào)用不保留數(shù)據(jù),所以無(wú)需維護(hù)數(shù)據(jù)的一致性等等,緩沖調(diào)用只會(huì)增加新生代內(nèi)存,調(diào)用完之后就會(huì)刪除對(duì)應(yīng)的Future,最后再討論下緩沖調(diào)用的效率問(wèn)題,緩沖調(diào)用最長(zhǎng)時(shí)間是一次完整調(diào)用,最短時(shí)間是無(wú)須調(diào)用就獲得結(jié)果,所以在調(diào)用效率上也會(huì)有優(yōu)化。

更多demo請(qǐng)關(guān)注

springboot demo實(shí)戰(zhàn)項(xiàng)目
java 腦洞
java 面試寶典
開(kāi)源工具

功能描述

同一時(shí)刻多條線程攜帶同一參數(shù)調(diào)用同一接口,把調(diào)用過(guò)程包裝成FutureTask,每條線程通過(guò)獲取到的FutureTask獲得返回值

image.png

PS:

緩沖調(diào)用出來(lái)的對(duì)象是同一個(gè)對(duì)象,在使用時(shí)需要注意

核心源碼詳解

public <T> T execute(String callKey, long waitTime, VoidBufferCall<T> invoke) throws BufferCallException {
        // 包裝FutureTask
        Future<T> future = new FutureTask<>(() -> {
            try {
                T value = invoke.call();
                return value;
            } catch (Throwable throwable) {
                if (throwable instanceof Exception) {
                    throw (Exception) throwable;
                } else {
                    throw new Exception(throwable);
                }
            } finally {
                //  執(zhí)行完移除
                futureMap.remove(callKey);
            }
        });
        // 把FutureTask根據(jù)callKey放入Map中,如果已存在則獲取舊的FutureTask;
        Future oldFuture = futureMap.putIfAbsent(callKey, future);
        if (oldFuture == null) {
            // 如果是新的FutureTask,則執(zhí)行
            ((FutureTask) future).run();
        } else {
            future = oldFuture;
        }
        try {
            if (waitTime > 0) {
                return future.get(waitTime, TimeUnit.MILLISECONDS);
            } else {
                // 獲取調(diào)用返回值并返回
                return future.get();
            }
        } catch (Exception e) {
            throw new BufferCallException(callKey, e);
        }
    }

源碼項(xiàng)目

github : https://gitee.com/wqrzsy/lp-buffercall.git

lp-buffercall

緩沖調(diào)用的核心項(xiàng)目

lp-buffercall-spring

lp-buffercall的擴(kuò)展項(xiàng)目,引入spring來(lái)做AOP,可以通過(guò)注解來(lái)實(shí)現(xiàn)調(diào)用

調(diào)用示例

@Component
public class TestService {

    @BufferCall
    public String test(@CallKey String name) {
        return name + "- Hello !";
    }

}

PS: @CallKey 如果沒(méi)有則默認(rèn)全參數(shù)

公眾號(hào)

五分鐘了解前沿技術(shù),大數(shù)據(jù),微服務(wù),區(qū)域鏈,提供java前沿技術(shù)干貨,獨(dú)立游戲制作技術(shù)分享

五分鐘技術(shù)

如果這篇文章對(duì)你有幫助請(qǐng)給個(gè)star


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.JVM 堆內(nèi)存和非堆內(nèi)存 堆和非堆內(nèi)存按照官方的說(shuō)法:“Java 虛擬機(jī)具有一個(gè)堆(Heap),堆是運(yùn)行時(shí)數(shù)據(jù)...
    yanzhu728閱讀 1,014評(píng)論 0 0
  • 不足的地方請(qǐng)大家多多指正,如有其它沒(méi)有想到的常問(wèn)面試題請(qǐng)大家多多評(píng)論,一起成長(zhǎng),感謝!~ String可以被繼承嗎...
    啟示錄是真的閱讀 3,080評(píng)論 3 3
  • 1、面向?qū)ο蟮奶卣饔心男┓矫? 答:面向?qū)ο蟮奶卣髦饕幸韵聨讉€(gè)方面: -- 抽象:抽象是將一類對(duì)象的共同特征總結(jié)...
    ccc_74bd閱讀 1,069評(píng)論 0 1
  • 1.StringBuffer與String的區(qū)別 StringBuffer是線程安全的,每次操作字符串,Strin...
    zdd5457閱讀 1,123評(píng)論 0 5
  • 包含的重點(diǎn)內(nèi)容:JAVA基礎(chǔ)JVM 知識(shí)開(kāi)源框架知識(shí)操作系統(tǒng)多線程TCP 與 HTTP架構(gòu)設(shè)計(jì)與分布式算法數(shù)據(jù)庫(kù)知...
    消失er閱讀 4,565評(píng)論 1 10

友情鏈接更多精彩內(nèi)容