首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Play2 -智能缓存

Java Play2 -智能缓存
EN

Stack Overflow用户
提问于 2012-08-31 08:18:03
回答 2查看 1.1K关注 0票数 2
代码语言:javascript
复制
@Cached(key="homePage")
public static Result index() {
  return ok("Hello world");
}

文档并没有告诉我更多关于智能缓存的内容。这真的是我要做的全部吗?

如果内容发生了变化怎么办?play会自动更新缓存吗?

这似乎是真的。

更新1:

由于某种原因,它不能工作

代码语言:javascript
复制
 @Cached(key="homePage")
    public static Result index() {
      Logger.info("" + Cache.get("homePage"));
      return ok("Hello world");
    }

如果我理解正确的话,Logger.info("" + Cache.get("homePage"));应该只被调用一次(如果缓存是空的)。但每次我刷新页面时都会调用它。另外,结果总是空的,所以它甚至不能工作。

有什么想法吗?

更新2:

我试着添加了类似这样的duradion:

代码语言:javascript
复制
@Cached(key="homePage",duration=3000)

但这并不管用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-02 15:28:01

我感觉这个问题是由于使用了@Cached注释造成的。实际上,如果您手动缓存值,它会起作用,但如果您使用注释(顺便说一下,就像文档中描述的那样),它似乎不起作用。

下面的代码可以很容易地演示它:

代码语言:javascript
复制
 @Cached(key="page1")
  public static Result page1() {
      java.util.Date d = Calendar.getInstance().getTime();
      return ok(page.render(d.toString()));
  }

  public static Result page2() {
      Result result = (Result) Cache.get("page2");
      if ( result == null ) {
          java.util.Date d = Calendar.getInstance().getTime();
          result = ok(page.render(d.toString()));
          Cache.set("page2", result);
      }   
      return result;
  }

使用下面的页面

代码语言:javascript
复制
@(date: String)
@date

和路由

代码语言:javascript
复制
GET     /page1                      controllers.Application.page1()
GET     /page2                      controllers.Application.page2()

如果您使用http://localhost:9000/page1,则每次调用时日期都会更改,而如果您使用http://localhost:9000/page2,则日期将被有效地缓存

这是一种变通方法,但它确实起到了作用。

关于你的第一个问题“如果内容改变了怎么办?播放会自动更新缓存吗?”,我认为情况并非如此,你必须手动从缓存中删除条目(如果你不想等待过期日期的话)。例如:

当您将过期时间为10 minutes

  • Another的值放入缓存中时,业务调用会使缓存中的值过时,并且您希望立即通知用户,因此您必须从缓存中移除该值,因为该值将不会出现在缓存中,并将使用

重新计算

从缓存中删除似乎只在版本2.1 (ticket here)上可用,解决方法是将具有相同键的内容放入缓存中,并在1秒内过期。

票数 5
EN

Stack Overflow用户

发布于 2012-11-13 04:04:07

@Cached似乎是broken in 2.0.4的,可能也适用于较低的版本。请注意,@With(CachedAction.class)已丢失。不过,它在current master中得到了修复:)

现在最简单的解决方法就是滚动你自己的@Cached和CachedAnnotation。只需从master复制粘贴并添加到您的项目中:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12207368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档