我是在我的项目中实现缓存技术的新手,在阅读了一些博客之后,我决定使用Ehcache。现在我在确定如何检查缓存中过期条目的正确方法时遇到了一些问题,这样我就可以同步/异步刷新缓存。
Ehcache配置文档说
timeToLiveSeconds - 无论使用何种元素,缓存中元素都可以存在的最大秒数。 元素在此过期 限制,将不再从缓存中返回。
以下是我的缓存配置
<cache name="userCache"
maxEntriesLocalHeap="500"
eternal="false"
timeToIdleSeconds="30"
timeToLiveSeconds="30"
memoryStoreEvictionPolicy="LRU"
transactionalMode="off">
<persistence strategy="none" />
</cache>
我假设即使在到期后该条目仍保留在缓存中。我想做类似下面的事情:
get an element from the cache
if not expired, return the element
if expired, return the stale entry and reload the cache asynchronously.
但似乎,Ehcache自己在到期时删除了缓存条目,因此我面临着实施上述算法的挑战。是否有任何配置我可以设置即使在到期后也不能从缓存中删除?
答案 0 :(得分:1)
如记录所示,不再返回过期的条目。
您有不同的选择:
我特意订购了这些答案,因为你应该如何处理这个问题:尝试1,如果不够,请移至2,如果仍然不够,则必须使用3。
答案 1 :(得分:0)
缓存通常工作的方式是删除元素,缓存中没有足够的空间(或其他原因,例如到期策略) 使用缓存的方式是首先尝试从缓存中检索值。如果找不到,则从原始来源获取通常更耗时的方式。检索后,将其添加到缓存并将值返回给调用者。 通常不需要通知您从缓存中删除的项目。如果你确实需要知道无论出于何种原因,你可以添加一个CacheEventListener http://www.ehcache.org/apidocs/2.6.9/net/sf/ehcache/event/CacheEventListener.html
顺便说一下。我不会直接使用ehcache进行简单的缓存。我会选择标准的java-cache实现JSR107并使用ehcache作为JSR107提供程序。这样您就没有对第三方缓存代码的任何引用。
答案 2 :(得分:0)
根据我的用例,重新加载缓存条目是非常昂贵的,我无法负担,在过期时刷新缓存并返回最新记录。
这是我决定实现我的用例的方法。
因此,在我的代码中维护缓存的timeToLive配置。每次从缓存中检索元素时,请检查缓存的元素是否已超过其timeToLive周期。如果缓存过期,则异步刷新缓存元素,返回当前调用的失效条目(Cache.get())。
private int timeToLiveSeconds;
private boolean isElementInCacheExpired(Element element){ // synchronized块阻止多个线程同时检查到期条件。 synchronized(element){ long now = System.currentTimeMillis(); return(现在&gt; element.getLatestOfCreationAndUpdateTime()+ TimeUtil.toMillis((int)this.timeToLiveSeconds)); }
}