如何使用Cache.getOrElse(java.lang.String key,java.util.concurrent.Callable <t> block,int expiration)</t>

时间:2013-04-09 03:14:23

标签: caching playframework

如何使用Cache.getOrElse(java.lang.String key,java.util.concurrent.Callable block,int expiration) 有人可以举个例子吗? 我的观点是如何使用“到期&#34;我知道这意味着到期时间。

顺便说一下: 我想保存一些对象来缓存,并设置一个到期时间。 当过期时,我可以将对象重置为缓存。

感谢。

3 个答案:

答案 0 :(得分:1)

我们假设您要在缓存中设置User个对象,因为您将userId设置为key而将user object设置为value }。如果需要设置到期时间,对于样本我将其设置为30秒。

cache.set(userId, userObject, 30);

在某些时候,如果您想要使用userId作为键从缓存中获取用户对象,您可以尝试以下方式从缓存中获取用户对象。

User user = cache.get(userId);

如果您在30秒内访问,则上面将返回用户对象,否则将返回NULL。这对于验证会话等情况非常适合。 在某些情况下,您经常需要从缓存中检索值,因为以下是最佳方法。

User user = cache.getOrElse(userId, () -> User.get(userId), 30);
  1. 缓存将检查是否已将userId作为密钥,如果可用,则立即返回用户对象并将到期时间更新为30秒。
  2. 如果给定的userId不可用,则调用可调用块并将userId设置为键,将用户对象从db中获取为值,并将到期时间设置为30secs。

答案 1 :(得分:0)

Expiration是Object在Cache中保留的秒数。如果您在到期时传递0,则缓存不会过期,您必须手动控制它。

getOrElse做的是检查缓存,如果对象不存在,则调用您传递的可调用块,并将结果添加到缓存中,作为到期时间传递的秒数。

我的评论基于Play Framework Cache Javadoc

答案 2 :(得分:0)

当我要显示动态和静态内容时,我在控制器中使用getOrElse。缓存静态,然后将其与动态部分一起渲染:

    try {

        Html staticHtml = Cache.getOrElse("static-content", () -> staticView.render(), 60 * 60);

        Html rendered = dynamicPage.render(arg1, arg2, staticHtml);
        return ok(rendered);

    } catch (Exception e) {
        e.printStackTrace();
        return internalServerError();
    }

staticView.render()从视图中返回一些html。这个视图不应该调用任何其他动态的页面,或者你藏匿一些你不想藏匿的东西。

60*60表示我想存储它一小时(60秒60分钟......如果你愿意,你可以写3600

我应该添加getOrElse使用指定的密钥从缓存中获取Object(在此示例中密钥为static-content)但是如果找不到它,则会调用返回一个对象的函数,该对象随后使用该键在缓存中存储指定的时间。非常整洁。

然后你可以调用其他(动态)页面并将html传递给它。

动态的东西会保持动态:)