如何使用 Cache.getOrElse(java.lang.String key, java.util.concurrent.Callable block, int expiration) 谁能给我一个例子?我的意思是如何使用“expiration”,我知道它意味着过期时间。
顺便说一句:我想保存一些对象到缓存,并设置一个过期时间。当过期时间,我可以将对象重置到缓存中。
谢谢。
如何使用 Cache.getOrElse(java.lang.String key, java.util.concurrent.Callable block, int expiration) 谁能给我一个例子?我的意思是如何使用“expiration”,我知道它意味着过期时间。
顺便说一句:我想保存一些对象到缓存,并设置一个过期时间。当过期时间,我可以将对象重置到缓存中。
谢谢。
假设您想User
在缓存上设置对象,因为您设置userId
为key
和user object
as value
。如果需要设置过期时间,对于示例,我将其设置为 30 秒。
cache.set(userId, userObject, 30);
在某个时间点,如果您想从缓存中获取用户对象(之前使用 userId 作为键设置),您可以尝试以下方式从缓存中获取用户对象。
User user = cache.get(userId);
以上将返回用户对象,如果您在 30 秒内访问,否则将返回NULL
. 这对于验证会话之类的情况来说是完美的。在某些情况下,您经常需要从缓存中检索值,因为以下是最好的方法。
User user = cache.getOrElse(userId, () -> User.get(userId), 30);
过期是对象将在缓存中保留的秒数。如果您将 0 作为过期值传递,则缓存不会过期,您必须手动控制它。
getOrElse 所做的是检查缓存,如果对象不存在,则调用您正在传递的可调用块,并将结果添加到缓存中,以作为到期时间传递的秒数。
我的评论基于Play Framework Cache Javadoc。
当我要显示动态和静态内容时,我会在控制器中使用 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 传递给它。
动态的东西将保持动态:)