2

如何使用 Cache.getOrElse(java.lang.String key, java.util.concurrent.Callable block, int expiration) 谁能给我一个例子?我的意思是如何使用“expiration”,我知道它意味着过期时间。

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

谢谢。

4

3 回答 3

1

假设您想User在缓存上设置对象,因为您设置userIdkeyuser objectas 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 中获取用户对象作为值,并将过期时间设置为 30 秒。
于 2016-11-02T14:46:45.590 回答
0

过期是对象将在缓存中保留的秒数。如果您将 0 作为过期值传递,则缓存不会过期,您必须手动控制它。

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

我的评论基于Play Framework Cache Javadoc

于 2014-02-17T19:27:12.020 回答
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 传递给它。

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

于 2015-02-16T16:41:02.683 回答