博客
关于我
【Guava】Guava Cache的refresh和expire刷新机制
阅读量:113 次
发布时间:2019-02-26

本文共 1438 字,大约阅读时间需要 4 分钟。

1. 缓存机制概述

Guava缓存机制通过 expireAfterWrite 和 refreshAfterWrite 两个设置,实现了基于时间的缓存清理或刷新。其核心思想是在指定时间段内,缓存项会失效并重新加载新的数据。这种机制特别适用于需要频繁刷新的场景,同时又能避免过多的后端请求。

2. 选择 expireAfterWrite 还是 refreshAfterWrite

在实际应用中,选择哪种机制需要根据具体需求来决定。expireAfterWrite 会在指定时间段内没有被读或写时将缓存项回收,而 refreshAfterWrite 则是在指定时间后进行刷新,返回最新的数据。

expireAfterWrite 的优点:

  • 适用于读取频繁但更新较少的场景。
  • 在指定时间段内,缓存项会被自动回收,避免了过期数据的读取。

refreshAfterWrite 的优点:

  • 在吞吐量较低的情况下,能够保证读取最新的数据。
  • refresh 操作会阻塞其他查询请求,直到新值加载完成。

缺点:

  • refreshAfterWrite 在长时间未读取的情况下,可能会返回旧值。
  • Guava cache 依赖于查询请求来触发加载或刷新,可能会导致性能上的浪费。

3. Guava cache 的源码分析

通过分析 Guava cache 的源码,可以发现其核心逻辑在于如何管理 cacheSegment 的加载和刷新操作。以下是关键部分的解析:

  • 缓存加载(load)

    • 在 get 方法中,首先检查缓存项是否过期(根据 expireAfterAccess 和 expireAfterWrite)。
    • 如果过期,则 value 为 null,触发 load 操作。
    • load 操作通过调用 CacheLoader 的 load 方法来获取新值。
  • 缓存刷新(refresh)

    • refreshAfterWrite 设置为 1 秒时,缓存项每秒会被刷新。
    • refresh 操作通过调用 CacheLoader 的 reload 方法来获取最新值。
    • reload 操作允许返回旧值,保证查询的高效性。
  • 锁机制

    • Guava cache 使用锁机制来保证 thread-safe。
    • 在 load 和 refresh 操作中,都会获得锁,确保只有一个线程可以执行这些操作。
    • 其他线程在锁被释放后,会依次获得锁,继续执行。
  • 4. 测试与验证

    为了验证上述分析,我们设计了一个测试用例,通过多线程并发访问 cache 资源,观察其行为。

    测试结果:

  • 初始加载

    • 单个线程能够顺利加载 cache 资源。
    • 其他线程会阻塞,等待当前线程释放锁。
  • 超时测试

    • 在超过 expireAfterWrite 设定的时间后,cache 资源会被标记为过期。
    • 过期后再次访问,会触发 load 操作,重新加载数据。
  • refresh 操作

    • 在 refreshAfterWrite 时间段内,会自动刷新 cache 资源,返回最新数据。
    • 其他线程在此期间不会阻塞,而是直接返回旧值,直到 refresh 完成。
  • 总结:

    通过测试可以验证,Guava cache 在使用 expireAfterWrite 和 refreshAfterWrite 两种机制时,能够有效地管理缓存项的过期和刷新。refreshAfterWrite 在吞吐量较低的情况下表现更优,而 expireAfterWrite 则适用于读取频繁但更新少的场景。

    转载地址:http://gkjk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现mergesort归并排序算法(附完整源码)
    查看>>
    Objective-C实现miller rabin米勒-拉宾素性检验算法(附完整源码)
    查看>>
    Objective-C实现Miller-Rabin素性测试程序(附完整源码)
    查看>>
    Objective-C实现MinhashLSH算法(附完整源码)
    查看>>
    Objective-C实现MinHeap最小堆算法(附完整源码)
    查看>>
    Objective-C实现multilayer perceptron classifier多层感知器分类器算法(附完整源码)
    查看>>
    Objective-C实现naive string search字符串搜索算法(附完整源码)
    查看>>
    Objective-C实现natural sort自然排序算法(附完整源码)
    查看>>
    Objective-C实现nested brackets嵌套括号算法(附完整源码)
    查看>>
    Objective-C实现nevilles method多项式插值算法(附完整源码)
    查看>>
    Objective-C实现newtons second law of motion牛顿第二运动定律算法(附完整源码)
    查看>>
    Objective-C实现newton_raphson牛顿拉夫森算法(附完整源码)
    查看>>
    Objective-C实现NLP中文分词(附完整源码)
    查看>>
    Objective-C实现not gate非门算法(附完整源码)
    查看>>
    Objective-C实现NumberOfIslands岛屿的个数算法(附完整源码)
    查看>>
    Objective-C实现n皇后问题算法(附完整源码)
    查看>>
    Objective-C实现OCR文字识别(附完整源码)
    查看>>
    Objective-C实现PageRank算法(附完整源码)
    查看>>
    Objective-C实现perfect cube完全立方数算法(附完整源码)
    查看>>
    Objective-C实现pollard rho大数分解算法(附完整源码)
    查看>>