如何使用Cache.getOrElse(java.lang.String key,java.util.concurrent.Callable block,int expiration) 有人可以举个例子吗? 我的观点是如何使用“到期"我知道这意味着到期时间。
顺便说一下: 我想保存一些对象来缓存,并设置一个到期时间。 当过期时,我可以将对象重置为缓存。
感谢。
答案 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 :(得分: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传递给它。
动态的东西会保持动态:)