我们已经构建了一个带有Angular前端和RoR后端的动态问卷。由于要处理许多动态部分,因此无法使用ActionView或jbuilder缓存帮助程序。每个问卷调查请求都有很多查询需要完成,例如检查答案的有效性,检查依赖关系等。是否有建议的策略来缓存动态JSON响应?
提出一个想法..
控制器代码:
def advance
# Decrypt and parse parameters
request = JSON.parse(decrypt(params[:request]))
# Process passed parameters
if request.key?('section_index')
@result_set.start_section(request['section_index'].to_i)
elsif request.key?('question_id')
if valid_answer?(request['question_id'], request['answer_id'])
@result_set.add_answer(request['question_id'],
request['answer_id'],
request['started_at'],
request['completed_at'])
else
return invalid_answer
end
end
render_item(@result_set.next_item)
end
next_item
可能是一个问题或部分,但也会返回进度指示器数据和可能的先前给出的答案(可能导航)。此外,数据从前端加密发送到前端。
我们还构建了一个带有Angular前端的管理区域。在这方面,可以查看和比较调查问卷的结果。正在进行一些查询以查找子问题,可比较的问题等。我们发现很难缓存这些问题。点击多个并发用户后,您可以填满服务器内存。
该应用程序部署在Passenger上,我们已根据服务器配置对配置进行了微调。结果存储在Postgres数据库中。
TLDR:在生产中,我们发现内存使用成为一个问题。可以对查询进行一些优化(具体包括),但是是否建议使用缓存动态JSON响应的策略?
答案 0 :(得分:0)
如果没有关于如何存储和检索数据的详细信息,这有点难度。但是你所说的是,你的next_item
方法是CPU和内存密集型的,试图找到下一个项目。那是对的吗?假设您可能想看一下Linked List。每个节点(多态)都有到下一个节点的链接。如果你需要前进和后退,你可以将它实现为双向链表。
答案 1 :(得分:0)
数据多久更改一次?如果您可以缓存其中的大部分内容,并且您将找到触发器属性(例如updated_at
),则可以在视图中执行片段缓存。或者甚至更好地在控制器中进行HTTP缓存。你可以混合两者。
这有点复杂。请查看http://www.xyzpub.com/en/ruby-on-rails/4.0/caching.html