【问题标题】:If my Ehcache is configured with a TTL, do I need to check if a retrieved Element is expired?如果我的 Ehcache 配置了 TTL,我是否需要检查检索到的元素是否过期?
【发布时间】:2011-04-03 12:10:00
【问题描述】:

我在 Ehcache 文档中的任何地方都找不到这个。

现在我正在使用此代码来创建和配置我的Cache

// Groovy syntax

def cacheConfig = new CacheConfiguration('stats', 1)
cacheConfig.timeToLiveSeconds = 2

def cache = new Cache(cacheConfig)
cache.initialise()

这是检索数据:

// Groovy syntax

def cachedElement = cache.get('stats')

if (cachedElement != null && ! cachedElement.isExpired()) {
    // use the cached data
} else {
    // get/generate the data and cache it
}

return cachedElement.value

我前段时间写了这篇文章,但现在看来,必须检查Element.isExpired() 似乎有点愚蠢——这不应该是必要的,对吧?我的意思是,如果一个元素过期了,那么缓存不应该返回它——对吧?

所以我想我可以删除该检查 - 只是希望在这里快速检查一下。

谢谢!

【问题讨论】:

    标签: java ehcache


    【解决方案1】:

    不,您不必执行此检查。如果你得到一个非空元素,那么它没有过期。奇怪的是,javadoc 没有提到这一点,就够了,虽然我已经在某处读过这个,但我找不到支持我的答案的参考。

    【讨论】:

    • 谢谢!我想投票赞成这个答案,但它确实需要一个链接。
    【解决方案2】:

    如果您的 cacheElement 可能实际上可能为 null,那么 null 检查是不够的。在这种情况下,仅在某些内容过期时返回 null 并不总是足够的。在访问之前,Ecache 没有可靠的方法来确定某些内容是否已过期。您可以在配置中设置以下内容:

    <ehcache:config cache-manager="ehCacheManager">
      <!-- interval is in minutes -->
      <ehcache:evict-expired-elements interval="20"/>
    </ehcache:config>
    

    但您的访问权限始终有可能落在该时间间隔内。 如果您绝对确定您的值从不为空,那么您可以放弃 isExpired() 调用。

    【讨论】:

    • @user209024,我怀疑 eviction 更多的是关于内存管理——当内存紧张时要删除哪些元素——而不是过期。关于空值的好点,虽然我怀疑我是否会费心存储它们。
    • 我被 null 元素咬住了——这是一个错误条件,假设 null 仅意味着过期或从未插入。
    猜你喜欢
    • 2016-11-02
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多