我是在我的项目中实现缓存技术的新手,在阅读了一些博客后,决定使用Ehcache。现在我在确定如何检查缓存中的过期条目以使我可以同步/异步刷新缓存的正确方法方面遇到了一点问题。
Ehcache配置文档说
无论使用与否,元素在缓存中可以存在的最大秒数。该元素在此限制下过期,将不再从缓存中返回。
下面是我的缓存配置
<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会在过期时自行删除缓存项,因此我面临实现上述算法的挑战。是否有任何配置可以设置为即使过期也不从缓存中删除?
根据我的使用情况,重新加载缓存条目非常昂贵,我负担不起,过期时刷新缓存并返回最新记录。
这是我决定用来实现我的用例的方法。
>
因此,在我的代码中维护缓存的timeToLive配置。每次我从缓存中检索一个元素时,都要检查缓存的元素是否超过了其timeToLive周期。如果缓存过期,则异步刷新缓存元素,返回当前调用的过时条目(cache.get()
)。
private int timeToLiveSeconds;
private boolean isElementInCacheExpired(Element element) {
// The synchronized block prevents multiple threads from checking the expiration condition at the same time.
synchronized (element) {
long now = System.currentTimeMillis();
return (now > element.getLatestOfCreationAndUpdateTime() + TimeUtil.toMillis((int) this.timeToLiveSeconds));
}
}
缓存通常的工作方式是删除元素,缓存中没有足够的空间(或者由于其他原因,例如过期策略)使用缓存的方式是首先尝试从缓存中检索值。如果找不到它,您通常要用更耗时的方法从它的原始来源检索它。一旦检索到,就将其添加到缓存中,并将值返回给调用者。您通常不需要被告知某个项目将从缓存中移除。如果出于某种原因您真的真的需要知道,您可以添加一个CacheEventListener http://www . ehcache . org/API docs/2 . 6 . 9/net/SF/ehcache/event/CacheEventListener . html
顺便说一句,我不会直接使用ehcache进行简单的缓存。我会选择标准的java缓存实现JSR107,并使用ehcache作为JSR107提供者。这样,您就不会引用第三方缓存代码。
根据记录,过期条目不再返回。
您有不同的选择:
我特意安排了这些答案,因为这就是你应该处理问题的方式:尝试1,如果不够,则移至2,如果仍然不够,则必须选择3。
问题内容: 我正在使用urllib.request.urlretrieve将文件下载到本地。 它引发错误: ssl.CertificateError了未处理由用户代码消息:主机名“foo.net”不匹配的“a248.e.akamai.net”,“要么 _.akamaihd.net”,“ .akamaihd-staging.net”,’ 。 akamaized.net”,“_ .akamaized-
问题内容: 我想检查两个日期是否超过一周,例如,检查两个日期是否有7天, 此时,数据范围应仅在一周之内(7天)。 我已经尝试过这样的事情, 有人可以帮忙吗? 问题答案: 最简单的方法是使用Jodatime并使用 另一个解决方案是使用日历,添加7天,然后再次进行比较。
问题内容: 如何检查用户是否有权 查看 或 查询内容 ?我不知道该怎么做。 在?那怎么会工作呢? 在?查看用户是否具有许可权,并以某种方式消除/更改某些args? 例: 如果用户是“访问者”,则他只能看到公共帖子,而“管理员”则可以看到所有内容。 更新 -猫鼬模型看起来像这样: 问题答案: 您可以在resolve函数或模型层中检查用户的权限。这是您必须采取的步骤: 在执行查询之前,对用户进行身份验
问题内容: 我正在构建一种日历Web应用程序 我已经在HTML中设置了以下表格 然后,来自用户的输入将被提交到小服务器中 我想知道,有没有办法检查用户输入的日期是否是有效日期? 显然,我可以编写很多if语句,但是是否有任何内置函数可以检查这一点? 谢谢 问题答案: 你可以尝试做 这将消除诸如> 12,小时> 23,不存在的leap日等问题(在不month年,month = 2的最大值为28,否则为
有inspect代码,这个网站使用angular应用程序作为前端。如何选择日期。如果所有日期都禁用,则转到下个月,如果不可用,则检查下个月 HTML: 当日期可用时,首先单击“另一个”转到下个月,检查是否找到任何可用日期,然后单击。 我该怎么做帮我我试过了但我做不到
问题内容: 我的问题是关于在哪些Java检查的条件for循环时,有一个print语句的顺序做 在 该循环的“条件”。这似乎是不切实际的事情(我从未见过以任何实际方式使用它),尽管我对打印的内容缺乏理解,使我认为我可能不完全了解for循环的功能。在最近的一次考试中出现了以下问题: 输入n = 5时,以下方法将打印什么? 正确的答案是:0 1 2 3 4 5 在我看来,该循环应该打印-1,然后将i递增