缓存失效和同步 Angular/后端

8

简介:

我在后端有一个复杂且持久的查询,将数据反馈到前端的Angular应用程序中。

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

随着用户更改UI并保存数据,数据被传递到服务器端并保存到数据库中。此时UI是最新的,直到用户刷新页面。同时,数据库是最新的,但缓存已经过期。

因此,当用户刷新页面时,页面上显示的是过期的缓存值。

更多信息:

现在我正在考虑刷新缓存的方法,欢迎更有经验的人提供任何建议。

我的想法是通过缓存作业(一次一个),在用户保存内容后立即排队。作业将具有更改的相关信息,不必重新计算整个缓存,而只需更改的部分。

问题部分:

如果用户刷新页面,我可以使用什么技术使用户始终了解数据?我应该在客户端以indexedDB或localstorage的形式保存“增量”,同时将数据发送到服务器。因此,当页面刷新时,用户从localstorage或indexed db中读取数据。

我仍在思考这个问题,显然我没有太多经验,对我所采取的方向有何评论?

基本上,我可以更改任何东西,包括后端/前端/缓存,它仍处于POC阶段,我只是尽可能了解其他人的工作情况。

更新

更多背景。我正在处理类似索引的页面,因此有多个记录可以进行内联编辑。

此外,在将扁平数据库记录转储到地图结构中并以json的形式传递到前端之前,我正在对后端进行一些转换。


如果用户进行了一些更改并保存,为什么不能在刷新时请求这些数据库值呢? - Matt Way
@dave 谢谢回复,听起来不错,我会试一试。 - Gandalf StormCrow
我不理解的是为什么“保存”请求不会更新转换后的数据,这将进而更新数据库。您还可以将转换后的数据持久化,而不仅仅存在于主内存中。这种情况看起来非常像CQRS的用例。 - a better oliver
@Matt Way,客户端不进行任何转换的原因是因为后端的转换数据也被其他客户端使用。我认为在这种情况下,转换超出了范围。 - Gandalf StormCrow
@GandalfStormCrow,您在缓存、数据库和后端编程语言方面使用哪些技术? - Orcun Yucel
显示剩余10条评论
3个回答

3

我认为最简单的方法是确保你知道缓存的创建时间。当你进行更改时,将页面的当前状态以及缓存的时间保存在localStorage中。当你加载页面时,获取缓存数据,检查其时间是否比你的localStorage版本更新。如果是,则使用缓存;否则,从localStorage重新加载数据,因为它已经包含了缓存数据和你的更改。


当多个用户修改数据时,每个用户都将在本地存储中拥有自己的应用程序状态。 - AdamSkywalker

2
您���问题很长,让我总结一下要点。
1. 您有大量数据库信息。 2. 直接搜索查询需要几分钟。 3. 为提供快速搜索,您使用缓存,每天更新两次。 4. 当用户更改数据时,数据库被更新而缓存没有被更新,因此网页显示来自缓存的过时信息。
这看起来像是典型的缓存使用场景,解决方案很明显:应该在数据库更改后立即使用增量更新缓存。真正的实现取决于您的应用程序架构和缓存结构。
您的问题的典型工作流程如下:
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 DynamoDB存储JSON配置对象的经验,如果需要更快速,我可能会切换到AWS ElastiCache。

关键是您需要使用有用的键(如站点主机名或其他基本URL)缓存JSON配置对象,并将其用作index.html渲染的真实来源。


谢谢您的建议,但在这个阶段更改数据库是不可行的。 - Gandalf StormCrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接