当前位置: 首页 > 知识库问答 >
问题:

如何在Ehcache 2.10.x中检查过期条目

汪志业
2023-03-14

我是在我的项目中实现缓存技术的新手,在阅读了一些博客后,决定使用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会在过期时自行删除缓存项,因此我面临实现上述算法的挑战。是否有任何配置可以设置为即使过期也不从缓存中删除?

共有3个答案

司马彦
2023-03-14

根据我的使用情况,重新加载缓存条目非常昂贵,我负担不起,过期时刷新缓存并返回最新记录。

这是我决定用来实现我的用例的方法。

>

  • 设置external=“true”以使缓存中的元素永不过期。如果将“永恒”设置为“真”,则timeToLive和timeoIdeal设置将不可用
  • 因此,在我的代码中维护缓存的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));
      }
    } 
    

  • 怀飞扬
    2023-03-14

    缓存通常的工作方式是删除元素,缓存中没有足够的空间(或者由于其他原因,例如过期策略)使用缓存的方式是首先尝试从缓存中检索值。如果找不到它,您通常要用更耗时的方法从它的原始来源检索它。一旦检索到,就将其添加到缓存中,并将值返回给调用者。您通常不需要被告知某个项目将从缓存中移除。如果出于某种原因您真的真的需要知道,您可以添加一个CacheEventListener http://www . ehcache . org/API docs/2 . 6 . 9/net/SF/ehcache/event/CacheEventListener . html

    顺便说一句,我不会直接使用ehcache进行简单的缓存。我会选择标准的java缓存实现JSR107,并使用ehcache作为JSR107提供者。这样,您就不会引用第三方缓存代码。

    蓟浩旷
    2023-03-14

    根据记录,过期条目不再返回。

    您有不同的选择:

    1. 如另一个答案所述,只需尝试访问缓存,当一无所获时,只需加载,放回缓存,返回。这是使用缓存的标准方式。
    2. 您确实需要很快过期条目才能刷新-Ehcache提供了帮助您做到这一点的功能:提前刷新和计划刷新
    3. 您需要细粒度的控件-只需将一个对象放入包含您自己的过期信息的缓存中,依靠缓存永远不会过期。自己进行检查并实现您描述的逻辑

    我特意安排了这些答案,因为这就是你应该处理问题的方式:尝试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递增