国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Cache2k:Guava Cache及Caffeine之外的新選擇

開發 前端
JCache規范不支持null,所以Cache2k默認也不支持,不過可以通過PermitNullValues(true)來開啟,這樣子緩存就可以存儲null值。

本文主要研究一下cache2k這款新型緩存。

示例

Cache<String,String> cache = new Cache2kBuilder<String, String>() {}
                .eternal(true)
                .expireAfterWrite(5, TimeUnit.MINUTES)    // expire/refresh after 5 minutes
                .setupWith(UniversalResiliencePolicy::enable, b -> b // enable resilience policy
                                .resilienceDuration(30, TimeUnit.SECONDS)          // cope with at most 30 seconds
                        // outage before propagating
                        // exceptions
                )
                .refreshAhead(true)                       // keep fresh when expiring
                .loader(k -> expensiveOperation(k))         // auto populating function
                .build();

常見問題的解決方案

空值問題

JCache規范不支持null,所以cache2k默認也不支持,不過可以通過permitNullValues(true)來開啟,這樣子緩存就可以存儲null值。

cache stampede問題

又稱作cache miss storm,指的是高并發場景緩存同時失效導致大面積回源,cache2k采用的是block的請求方式,避免對同一個key并發回源。

org/cache2k/core/HeapCache.java。

protected Entry<K, V> getEntryInternal(K key, int hc, int val) {
    if (loader == null) {
      return peekEntryInternal(key, hc, val);
    }
    Entry<K, V> e;
    for (;;) {
      e = lookupOrNewEntry(key, hc, val);
      if (e.hasFreshData(clock)) {
        return e;
      }
      synchronized (e) {
        e.waitForProcessing();
        if (e.hasFreshData(clock)) {
          return e;
        }
        if (e.isGone()) {
          metrics.heapHitButNoRead();
          metrics.goneSpin();
          continue;
        }
        e.startProcessing(Entry.ProcessingState.LOAD, null);
        break;
      }
    }
    boolean finished = false;
    try {
      load(e);
      finished = true;
    } finally {
      e.ensureAbort(finished);
    }
    if (e.getValueOrException() == null && isRejectNullValues()) {
      return null;
    }
    return e;
  }

同步回源造成的接口穩定性問題

cache2k提供了refreshAhead參數,在新數據沒有拉取成功之前,過期數據仍然可以訪問,避免請求到來時發現數據過期觸發同步回源造成接口延時增大問題。不過具體底層還依賴prefetchExecutor,如果refresh的時候沒有足夠的線程可以使用則會立馬過期,等待下次get出發同步回源。

org/cache2k/core/HeapCache.java。

public void timerEventRefresh(Entry<K, V> e, Object task) {
    metrics.timerEvent();
    synchronized (e) {
      if (e.getTask() != task) { return; }
      try {
        refreshExecutor.execute(createFireAndForgetAction(e, Operations.SINGLETON.refresh));
      } catch (RejectedExecutionException ex) {
        metrics.refreshRejected();
        expireOrScheduleFinalExpireEvent(e);
      }
    }
  }

默認的executor如下,采用的是SynchronousQueue隊列,可以通過builder自己去設置refreshExecutor

Executor provideDefaultLoaderExecutor(int threadCount) {
    int corePoolThreadSize = 0;
    return new ThreadPoolExecutor(corePoolThreadSize, threadCount,
      21, TimeUnit.SECONDS,
      new SynchronousQueue<>(),
      threadFactoryProvider.newThreadFactory(getThreadNamePrefix()),
      new ThreadPoolExecutor.AbortPolicy());
  }

回源故障問題

針對回源的下游出現故障的問題,cache2k提供了ResiliencePolicy策略,其實現類為UniversalResiliencePolicy
當load方法拋出異常且cache里頭還有數據的時候,異常不會拋給client,用當前的數據返回,這里有個resilienceDuration時間,如果超過這個時間load方法還繼續拋出異常則異常會拋給client。如果沒有單獨設置resilienceDuration,則默認取的是expiryAfterWrite時間。

org/cache2k/core/HeapCache.java。

private Object loadGotException(Entry<K, V> e, long t0, long t, Throwable wrappedException) {
    ExceptionWrapper<K, V> exceptionWrapper =
      new ExceptionWrapper(keyObjFromEntry(e), wrappedException, t0, e, exceptionPropagator);
    long expiry = 0;
    long refreshTime = 0;
    boolean suppressException = false;
    RefreshAheadPolicy.Context<Object> refreshCtx;
    try {
      if (e.isValidOrExpiredAndNoException()) {
        expiry = timing.suppressExceptionUntil(e, exceptionWrapper);
      }
      if (expiry > t0) {
        suppressException = true;
      } else {
        expiry = timing.cacheExceptionUntil(e, exceptionWrapper);
      }
      refreshCtx = getContext(e, t0, t, true, true, false, expiry);
      refreshTime = timing.calculateRefreshTime(refreshCtx);
    } catch (Exception ex) {
      return resiliencePolicyException(e, t0, t, new ResiliencePolicyException(ex), null);
    }
    exceptionWrapper = new ExceptionWrapper<>(exceptionWrapper, Math.abs(expiry));
    Object wrappedValue = exceptionWrapper;
    if (expiry != 0) {
      wrappedValue = timing.wrapLoadValueForRefresh(refreshCtx, e, exceptionWrapper);
    }
    Object loadResult;
    synchronized (e) {
      insertUpdateStats(e, (V) wrappedValue, t0, t, true, expiry, suppressException);
      if (suppressException) {
        e.setSuppressedLoadExceptionInformation(exceptionWrapper);
        loadResult = e.getValueOrException();
      } else {
        if (isRecordModificationTime()) {
          e.setModificationTime(t0);
        }
        e.setValueOrWrapper(exceptionWrapper);
        loadResult = exceptionWrapper;
      }
      finishLoadOrEviction(e, expiry, refreshTime);
    }
    return loadResult;
  }

這里timing.suppressExceptionUntil是委托給了ResiliencePolicy#suppressExceptionUntil。

cache2k-addon/src/main/java/org/cache2k/addon/UniversalResiliencePolicy.java。

public long suppressExceptionUntil(K key,
                                     LoadExceptionInfo<K, V> loadExceptionInfo,
                                     CacheEntry<K, V> cachedEntry) {
    if (resilienceDuration == 0 || resilienceDuration == Long.MAX_VALUE) {
      return resilienceDuration;
    }
    long maxSuppressUntil = loadExceptionInfo.getSinceTime() + resilienceDuration;
    long deltaMs = calculateRetryDelta(loadExceptionInfo);
    return Math.min(loadExceptionInfo.getLoadTime() + deltaMs, maxSuppressUntil);
  }

UniversalResiliencePolicy還提供了異常重試的功能,重試間隔為retryInterval,如果沒有配置則為resilienceDuration的5%,采取的是指數退避的模式,factor為1.5。

小結

cache2k提供了Guava Cache及Caffeine沒有的ResiliencePolicy,針對C端高并發場景提供了容錯的功能,值得借鑒一下。

責任編輯:姜華 來源: 今日頭條
相關推薦

2024-08-29 08:28:17

2022-09-21 08:16:18

緩存框架

2024-01-04 08:33:11

異步JDK數據結構

2025-10-29 01:22:00

2009-06-17 16:08:58

Hibernate C

2009-09-22 10:50:04

Hibernate c

2009-06-29 09:00:42

Hibernate的Q

2009-06-15 17:44:38

JBoss Cache

2009-07-08 17:04:25

user cache

2010-06-02 14:57:38

MySQL cache

2009-09-21 17:09:38

Hibernate C

2019-12-10 09:53:27

LinuxCacheBuffer

2012-11-12 10:30:25

IBMdw

2009-04-13 11:40:54

IBMdWDB2

2017-09-05 15:57:47

2012-05-27 18:09:33

NAG Cache華為

2022-12-12 08:39:09

CPUCache偽共享

2021-08-06 07:51:47

Redis 緩存系統

2011-03-04 15:50:00

FileZilla

2025-03-26 03:25:00

SpringGuavaCaffeine
點贊
收藏

51CTO技術棧公眾號

五月天av在线| juliaann成人作品在线看| 国产一区二区在线免费播放| 精品国产一区二| 香蕉成人啪国产精品视频综合网| 91视频网页| 日本99精品| 一本久道久久综合中文字幕| 日本午夜精品电影 | 国产欧美一区二区三区在线看蜜臀 | 婷婷综合六月| 国产日韩成人精品| 国产aaaaa毛片| 国产日韩欧美a| 亚洲一区二区三区小说| 亚洲av首页在线| 韩国欧美国产一区| 日韩久久精品一区二区三区| 国产亚洲网站| 亚洲五月六月| 成人美女在线视频| 手机福利在线视频| 高清av一区二区| 麻豆av免费在线| 另类小说视频一区二区| 日本在线播放不卡| 成人短片线上看| 成人性生交大片免费看视频直播| 加勒比色综合久久久久久久久| 亚洲国产成人在线视频| 欧美大片免费高清观看| 色一情一乱一乱一91av| 免费男女羞羞的视频网站在线观看| 亚洲高清久久久久久| 日韩精品视频中文字幕| 亚洲自拍小视频| 韩国午夜理伦三级不卡影院| 98在线视频| 天天操天天色综合| 国产片在线观看| 欧美日韩久久一区二区| 三级网站在线| 99re成人精品视频| 日本在线观看a| 国产精品一区二区在线播放| 精品国产福利| 亚洲清纯自拍| 久久三级福利| 真人抽搐一进一出视频| 另类的小说在线视频另类成人小视频在线| 国产精品一区视频网站| 狠狠爱成人网| 一级黄色录像免费看| 国产精品18久久久久久久网站| 亚洲色欲久久久综合网东京热| 91麻豆精品一区二区三区| 情侣黄网站免费看| 亚洲精品va在线观看| 国产系列电影在线播放网址| 欧美一区二区久久久| 日韩一级特黄| 91精品久久久久| 热久久久久久久| 韩国视频一区二区三区| 国产欧美精品日韩区二区麻豆天美| 欧美精品久久久久久久久25p| 亚洲五月六月丁香激情| 1024在线看片你懂得| 国内精久久久久久久久久人| 亚洲免费高清| 亚洲欧美激情网| 欧美军同video69gay| 国产主播性色av福利精品一区| 国产精品视频网站| 成人久久视频在线观看| 国产区av在线| 2019日本中文字幕| 极品美女销魂一区二区三区免费| 青青草在线视频免费观看| 亚洲免费电影在线观看| 欧美黄污视频| 99不卡视频| 亚洲欧美激情一区| 亚洲综合欧美| jizz在线免费观看| 国产精品久久久久久久午夜| 99久久精品费精品国产一区二区| 国产高清在线看| 国产日韩专区在线| 亚洲午夜私人影院| 香蕉久久网站| 国产福利视频在线| 一区二区三区在线视频111| 日韩综合视频在线观看| 国产三级三级三级精品8ⅰ区| 视频精品二区| 成年人在线观看| 蜜桃久久精品乱码一区二区| 亚洲人成77777在线观看网| 久久久久久久久岛国免费| 黑人操亚洲人| 欧美办公室脚交xxxx| 99免费视频| 狠狠色噜噜狠狠色综合久| 欧美精品久久久久久久久老牛影院| 美腿丝袜亚洲色图| sdde在线播放一区二区| www.综合网.com| 美乳中文字幕| 欧美黑人xxxxx| 久热国产精品视频| 在线看不卡av| 久久久久国产精品厨房| 亚洲黄色精品| 欧美黄色网视频| 国产激情视频在线观看| 一区二区三区 日韩| 国产亚洲精品久久飘花| 九九九久久国产免费| 精品国产亚洲在线| 五月天一区二区三区| 国产三级精品在线| 久久黄色影院| 午夜日韩激情| 亚洲国产欧美日韩在线观看第一区| 91九色porn在线资源| 精品乱码一区二区三四区视频| 国产日产欧美视频| 亚洲第一精品区| 国产综合 伊人色| 国产欧美精品xxxx另类| 久热在线中文字幕色999舞| 亚洲国产福利在线| 欧美亚洲日本国产| 日本乱人伦aⅴ精品| 亚洲成人777| 亚洲男人的天堂在线aⅴ视频| www久久久久| 久久久午夜精品理论片中文字幕| 国内久久精品视频| 久久99精品久久久久久| 国产真实久久| 日韩电影一区| 91精品一区二区三区综合在线爱 | 久久亚洲一区二区三区四区| 欧美aaaaaa午夜精品| 日韩精品一二三区| 日韩—二三区免费观看av| 国产综合成人久久大片91| 国产精品正在播放| 国产喂奶挤奶一区二区三区| 久久综合久色欧美综合狠狠| 国产精品私人影院| 亚洲成a天堂v人片| 欧美一区欧美二区| 精品五月天久久| 九九久久国产精品| 成人亲热视频网站| 欧美婷婷久久| 国产毛片视频网站| 啦啦啦在线视频免费观看高清中文| julia中文字幕久久亚洲蜜臀 | 欧美午夜寂寞影院| 正在播放国产一区| 欧美一级视频一区二区| 成人av片网址| 国产精品日韩三级| 一级片a一级片| 51精品在线| 亚洲国产精品嫩草影院久久av| 欧美极品一区二区三区| 久久亚洲精品爱爱| 欧美国产三区| 久久亚洲精精品中文字幕早川悠里 | 欧美hdfree性xxxx| 在线免费观看的av| 国产精品一线天粉嫩av| 日韩成人午夜电影| 一个色在线综合| 国产一区二区三区在线视频| 91亚洲精品久久久| 中文字幕在线观看第三页| 色黄网站在线观看| 成人3d动漫在线观看| av欧美精品.com| 亚洲白虎美女被爆操| 91美女片黄在线观| 欧美大片在线播放| 免费成人美女女| 久久不射2019中文字幕| 色综合久久六月婷婷中文字幕| 欧美尺度大的性做爰视频| 欧美日韩综合另类| 成人频在线观看| 欧美极品在线观看| 国产精品久久久久aaaa| 日本亚洲欧洲色| 探花国产精品| 在线看成人短视频| 午夜视频在线观看一区|