2015-11-06 37 views
8

简介:缓存失效和同步角/后端太

我已经上了后端复杂和持久的查询,反馈的前端角应用。

目前,角度应用程序使用后端的缓存数据,而不是直接从复杂查询中读取,这需要几分钟的时间。缓存每天早上和每晚都会变暖。

随着用户对ui进行更改并保存数据,然后将其传递到服务器端并保存到数据库。那时用户界面是最新的,直到用户刷新页面。同时数据库是最新的,但缓存已过时。

因此,当用户刷新页面时,陈旧的缓存值将显示在页面上。

更多信息:

现在我去想办法刷新缓存,并且任何建议从有经验的人将是最欢迎的。

我的想法是通过缓存作业(一次一个)刷新缓存,只要用户保存某些内容,就立即排队。作业将有相关的信息发生变化,整个缓存不必重新计算,而只是改变了一点。

问题的一部分:

我可以使用哪些技术来保持用户了解最新的数据,即使用户刷新页面?我应该以indexedDB还是localstorage的形式在客户端保存'deltas',同时将数据发送到服务器。所以当页面刷新时,用户从本地存储或索引数据库中读取数据。

我还在想这个低谷,显然我没有太多的经验,对目前为止我所采取的方向有什么意见?

基本上我可以改变任何东西,包括后端/前端/缓存它仍然在POC阶段,我只是试图尽可能知道什么为别人工作。

更新

多一点背景。我正在处理像页面这样的索引,因此有多个可以内联编辑的记录。

另外我正在做一些后端平面数据库记录的转换,然后将它们转储到像结构一样的映射中,并以json的形式将它传递到前端。

+0

如果用户进行了一些更改并保存,为什么不能在刷新时请求这些数据库值? –

+0

我认为最简单的方法是确保知道缓存创建的时间。在进行更改时,请将当前页面的状态以及缓存的时间保存在localStorage中。当你加载页面时,你会得到缓存的数据,请检查它是否比localStorage版本更新。如果是,请使用缓存,如果没有,请从localStorage重新载入数据,因为缓存数据已经添加了您的更改。 – dave

+0

您所描述的内容听起来更像是数据转换作业,而不是缓存。阐述你在服务器端做什么和使用什么是有用的。 – zeroflagL

回答

3

我认为最简单的方法是确保知道缓存创建的时间。在进行更改时,请将当前页面的状态以及缓存的时间保存在localStorage中。当你加载页面时,你会得到缓存的数据,请检查它是否比localStorage版本更新。如果是,请使用缓存,如果没有,请从localStorage重新载入数据,因为缓存数据已经添加了您的更改。

+0

当多个用户修改数据,每一个都会有自己的本地存储的应用程序的状态。 – AdamSkywalker

2

你的问题太长了,让我总结一下事实。

  1. 你有很多的信息在数据库中
  2. 直接搜索查询需要几分钟
  3. 为客户提供快速搜索,您可以使用它每天更新
  4. 两次缓存当用户更改数据,数据库被更新并且缓存不存在,所以网页显示来自缓存的过时信息。

这看起来像是一个典型的缓存使用场景,解决方案很明显:只要数据库发生更改,您应该尽快用deltas更新缓存。真正的实现将取决于您的应用程序体系结构和缓存结构。

有关问题的典型的工作流程是:

def updateRequest(Request req) { 
    def tx = db.startTransaction(); 
    tx.execute(createUpdate(req.getData())); 
    tx.commit(); // if transaction fails, cache is not updated 
    cache.update(req.getData()); // can be done in background, if you return delta 
} 
0

看来你是存储在表数据,并使用这些表有一个复杂的查询,以构建一个JSON配置,以使您的index.html文件。我通过避免表格和使用NoSQL解决方案避免了这个问题。我在客户端构建JSON配置对象,并将该JSON配置对象存储在NoSQL集合中。我使用URL做了一个简单的查询来获取JSON配置对象并呈现index.html文件。

我有一些将AWS JSON配置对象存储在AWS DynamoDB中的经验,如果我需要加快速度,我可能会切换到AWS ElastiCache。

关键在于您需要使用像站点主机名或其他基本URL这样的有用键来缓存您的JSON配置对象,并将其用作index.html呈现的真实来源。

+0

谢谢你的建议,但改变数据库是一个nogo在这一点上 –