ehcache Terracotta公司使用的開源的緩存框架,
get操作源碼解析
Ehcache put(final K key, final V value)
1.AbstractOperationStatistic.begin() 使用的是Terracotta公司都是用的統(tǒng)計框架進行操作時間的統(tǒng)計
2.statusTransitioner.checkAvailable() 進行狀態(tài)校驗刻盐,判斷當前操作對于ehcache是否可用拱镐、當前操作是否被允許
3.checkNonNull(key, value) ehcache key和value都不能為null
4.核心步驟PutStatus status = store.put(key, value)->AbstractOffHeapStore put(final K key, final V value) throws StoreAccessException
4.1 使用匿名內(nèi)部類(編譯器會再生成一個類實現(xiàn)接口)生成BiFunction<K, OffHeapValueHolder<V>, OffHeapValueHolder<V>> mappingFunction降传,其中apply方法生成BasicOffHeapValueHolder舶治,包好key琼讽、value和過期時間
4. computeWithRetry方法->EhcacheConcurrentOffHeapClockCache.compute->AbstractLockedOffHeapHashMap.computeWithMetadata ->OffHeapHashMap.computeWithMetadata(線性探測的哈希表實現(xiàn)熔萧,存儲在NIO直接緩沖區(qū)) 找到key對應(yīng)的oldvalue糖驴,判斷是key-value是新增還是替換,同時把新的value塞入磁盤佛致,磁盤沒有塞過期時間贮缕? 調(diào)用FileWriteTask run()方法,使用LinkedBlockingQueue實現(xiàn)先進先出進行異步寫磁盤的操作
5. switch (status) {
case PUT:
putObserver.end(PutOutcome.PUT);
break;
case UPDATE:
putObserver.end(PutOutcome.UPDATED);
break;
case NOOP:
putObserver.end(PutOutcome.NOOP);
break;
default:
throw new AssertionError("Invalid Status.");;沒過期則同步heapstore和offheapdiskstore俺榆、同步磁盤過期時間
}
根據(jù)返回的操作狀態(tài)感昼,統(tǒng)計,例如PUT罐脊,GeneralOperationStatistic end(T result)
5.1 通過EnumMap<T, LongAdder> counts 線程安全統(tǒng)計每一類操作的次數(shù)
5.2 判斷derivedStatistics不為空定嗓,統(tǒng)計框架進行結(jié)束時間和該操作耗時的統(tǒng)計
Ehcache V get(final K key)
1.2.3.5同上
4 TieredStore.get
4.1 cachingTier中先取出OnHeapStore,調(diào)用其getOrComputeIfAbsent萍桌,在其中的SimpleBackend realMap獲取key對應(yīng)的value宵溅,有則返回
4.2 否則則去AbstractOffHeapStore.getAndFault(K key) 根據(jù)key去磁盤加載數(shù)據(jù),判斷key是否過期上炎,過期則情況offheap和heapstore的key-value层玲,同時同步磁盤;沒過期則同步heapstore和offheapdiskstore反症、同步磁盤過期時間