美文网首页
Ehcache源码分析

Ehcache源码分析

作者: 剑客kb | 来源:发表于2019-05-11 13:39 被阅读0次

    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、同步磁盘过期时间

    相关文章

      网友评论

          本文标题:Ehcache源码分析

          本文链接:https://www.haomeiwen.com/subject/umjxaqtx.html