ehcache Terracotta公司使用的开源的缓存框架,
get操作源码解析
Ehcache put(final K key, final V value)
1.AbstractOperationStatistic.begin() 使用的是Terracotta公司都是用的统计框架进行操作时间的统计
2.statusTransitioner.checkAvailable() 进行状态校验,判断当前操作对于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 使用匿名内部类(编译器会再生成一个类实现接口)生成BiFunction<K, OffHeapValueHolder<V>, OffHeapValueHolder<V>> mappingFunction,其中apply方法生成BasicOffHeapValueHolder,包好key、value和过期时间
4. computeWithRetry方法->EhcacheConcurrentOffHeapClockCache.compute->AbstractLockedOffHeapHashMap.computeWithMetadata ->OffHeapHashMap.computeWithMetadata(线性探测的哈希表实现,存储在NIO直接缓冲区) 找到key对应的oldvalue,判断是key-value是新增还是替换,同时把新的value塞入磁盘,磁盘没有塞过期时间? 调用FileWriteTask run()方法,使用LinkedBlockingQueue实现先进先出进行异步写磁盘的操作
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、同步磁盘过期时间
}
根据返回的操作状态,统计,例如PUT,GeneralOperationStatistic end(T result)
5.1 通过EnumMap<T, LongAdder> counts 线程安全统计每一类操作的次数
5.2 判断derivedStatistics不为空,统计框架进行结束时间和该操作耗时的统计
Ehcache V get(final K key)
1.2.3.5同上
4 TieredStore.get
4.1 cachingTier中先取出OnHeapStore,调用其getOrComputeIfAbsent,在其中的SimpleBackend realMap获取key对应的value,有则返回
4.2 否则则去AbstractOffHeapStore.getAndFault(K key) 根据key去磁盘加载数据,判断key是否过期,过期则情况offheap和heapstore的key-value,同时同步磁盘;没过期则同步heapstore和offheapdiskstore、同步磁盘过期时间
网友评论