腦洞的由來(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獲得返回值
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ù)分享
如果這篇文章對(duì)你有幫助請(qǐng)給個(gè)star