Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Play2-智能缓存_Java_Caching_Playframework 2.0 - Fatal编程技术网

Java Play2-智能缓存

Java Play2-智能缓存,java,caching,playframework-2.0,Java,Caching,Playframework 2.0,文档并没有告诉我很多关于智能缓存的内容。这真的是我要做的全部吗 如果内容发生变化怎么办?play是否自动更新缓存 这似乎是真的 更新1: 由于某种原因,它不起作用 @Cached(key="homePage") public static Result index() { return ok("Hello world"); } 如果我理解正确,Logger.info(“+Cache.get”(“homePage”)只应被调用一次(如果缓存为空)。但每次我刷新页面时都会调用它。而且结果总是空

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

如果内容发生变化怎么办?play是否自动更新缓存

这似乎是真的

更新1:

由于某种原因,它不起作用

@Cached(key="homePage")
public static Result index() {
  return ok("Hello world");
}
如果我理解正确,
Logger.info(“+Cache.get”(“homePage”)只应被调用一次(如果缓存为空)。但每次我刷新页面时都会调用它。而且结果总是空的,所以它甚至不起作用

有什么想法吗

更新2:

我尝试添加duradion,如:

 @Cached(key="homePage")
    public static Result index() {
      Logger.info("" + Cache.get("homePage"));
      return ok("Hello world");
    }

但是它没有帮助。

我感觉问题是由于使用了@Cached注释。事实上,如果手动缓存该值,它会工作,但是如果使用注释(如文档中所述),它似乎不工作

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

@Cached(key="homePage",duration=3000)
请看下一页

 @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;
  }
路线

@(date: String)
@date
如果您转到
http://localhost:9000/page1
每次调用时日期都会更改,而如果使用
http://localhost:9000/page2

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

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

  • 在缓存中放入一个过期时间为10的值 会议记录
  • 另一个业务调用会使缓存中的值过时,而您 希望立即通知用户,因此您必须 立即从缓存中删除该值
  • 下次该值将不在缓存中,并将重新计算 用新数据
  • “从缓存中删除”似乎只在版本2.1()上可用,解决方法是使用相同的密钥将某些内容放入缓存中,并在1秒内过期。

    @Cached似乎是,并且可能也适用于较低版本。请注意,
    @with(CachedAction.class)
    已丢失。但在中已修复:)

    现在最简单的解决方法是使用自己的@Cached和CachedAnnotation。只需从母版复制粘贴并添加到您的项目中:


    您是否处于开发模式?i、 e使用
    play run
    而不是
    play start
    ?我现在尝试了这两个命令。启动并运行。我仍然得到同样的结果:/
    GET     /page1                      controllers.Application.page1()
    GET     /page2                      controllers.Application.page2()