Caching 在Play框架中使用缓存

Caching 在Play框架中使用缓存,caching,playframework,Caching,Playframework,我正在尝试实现一个测验应用程序。应用程序使用ajax逐个加载问题。当用户单击“转到下一个问题”按钮时,其答案将保存在缓存中。但当我调试时,缓存列表总是空的 此代码创建第一个缓存阵列: 公共静态void viewquick(@Required String user,@Required String test){ if(validation.hasErrors()){ 闪光错误(“Hoop kullanıcılazım.”; 索引(); }否则{ TestClass selectedTest=Te

我正在尝试实现一个测验应用程序。应用程序使用ajax逐个加载问题。当用户单击“转到下一个问题”按钮时,其答案将保存在缓存中。但当我调试时,缓存列表总是空的

此代码创建第一个缓存阵列:

公共静态void viewquick(@Required String user,@Required String test){
if(validation.hasErrors()){
闪光错误(“Hoop kullanıcılazım.”;
索引();
}否则{
TestClass selectedTest=TestClass.find(“title”,test).first();
List choiceList=new ArrayList();
session.put(“testID”,selectedTest.id);
Cache.set(“选择”,choiceList,“30mn”);
render();
}
}
这段代码试图一个接一个地保存答案:

公共静态无效问题(@所需长id,字符串答案){
longtestid=Long.parseLong(session.get(“testId”);
TestClass test=TestClass.findById(testId);
List questList=Question.find(“test_id”,test.id.intValue()).fetch();
quest=questList.get(id.intValue());
如果(回答!=null){
List choiceList=Cache.get(“选项”,List.class);
添加(id.intValue(),答案);
Cache.set(“选择”,choiceList,“30mn”);
}   
int count=questList.size()-1;
渲染(任务、计数、id);
}
这段代码是第二个的html视图:

#{扩展'main.html'/}
#{设置标题:'question.html'/}
var questionId=${id};
$(“#下一个按钮”)。单击(函数(){
$('questionDiv').html('p>

'); $('#questionDiv')。加载(“/test/”+++questionId); }); $(“#结束按钮”)。单击(函数(){ $('questionDiv').html('p>

'); $('#questionDiv')。加载(“/result”); }); Soru${id+1} &{quest.question}

#{列出项目:quest.choices,如:'choice'} &{choice}

#{/list} #{如果id
缓存不可靠,在开发模式下可能会将其设置为null。这是预期的,您可以尝试将其更改为prod模式并查看其行为。

不要使用缓存来“存储”对象。将其存储在会话中,或者创建一个新模型来存储答案。通常,您不能期望缓存保留您放入的对象;这是缓存,不是商店

引用这出戏的话!网站:

重要的是要了解缓存契约是明确的:何时 你把数据放在缓存中,你不能期望数据留在那里 永远。事实上你不应该。缓存很快,但值过期, 而且缓存通常只存在于内存中(没有持久性) 备份)


我无法在prod模式下使用eclipse进行调试。它锁定在某个地方,但我找不到…听起来很奇怪,开发模式会创建不同的结果,以prod-mode。你使用的是什么版本的播放?您是在使用标准的内存缓存,还是在使用其他东西,比如memcache。我还假设您在单个服务器上,因为它是开发模式,而不是跨多个实例进行负载平衡。我还应该注意,由于播放是无状态的,您不应该将缓存用作数据存储。如果您正在进行负载平衡,则不能保证您将返回同一服务器。通过记忆,你打破了游戏的无状态性。当数据库中已经存在数据时,最好使用缓存,但用于最小化频繁的数据库读取。我正在使用play 1.2.1,不更改任何缓存设置。我使用mysql在ubuntu本地主机上运行。