【问题标题】:How to use Cache.getOrElse(java.lang.String key, java.util.concurrent.Callable<T> block, int expiration)如何使用 Cache.getOrElse(java.lang.String key, java.util.concurrent.Callable<T> block, int expire)
【发布时间】:2016-11-03 04:12:41
【问题描述】:
如何使用Cache.getOrElse(java.lang.String key, java.util.concurrent.Callable block, int expire)
有人可以给我一个例子吗?
我的意思是如何使用“过期”,我知道它意味着过期时间。
顺便说一句:
我想保存一些对象到缓存,并设置一个过期时间。
当过期时间,我可以将对象重置到缓存中。
谢谢。
【问题讨论】:
标签:
caching
playframework
【解决方案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);
- 缓存将检查是否已将 userId 作为键,如果可用则立即返回用户对象并将过期时间进一步更新为 30 秒。
- 如果给定的 userId 不可用,则调用可调用块并将 userId 设置为键,从 db 中获取用户对象作为值,到期时间为 30 秒。
【解决方案2】:
Expiration 是对象在缓存中保留的秒数。如果您将 0 作为过期值传递,则缓存不会过期,您必须手动控制它。
getOrElse 所做的是检查缓存,如果对象不存在,则调用您传递的可调用块并将结果添加到缓存中,以作为过期时间传递的秒数。
我的评论基于Play Framework Cache Javadoc。
【解决方案3】:
当我要显示动态和静态内容时,我会在控制器中使用 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 传递给它。
动态的东西将保持动态:)