【问题标题】:Cache invalidation and synchronisation Angular/back-end缓存失效和同步 Angular/后端
【发布时间】:2016-02-08 04:39:03
【问题描述】:

简介:

我在后端有一个复杂而持久的查询,在前端反馈了 Angular 应用程序。

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

用户对 UI 进行更改并保存数据,然后将其传递到服务器端,并保存到数据库中。那时 UI 是最新的,直到用户刷新页面。同时数据库是最新的,但缓存是陈旧的。

所以当用户刷新页面时,过时的缓存值会显示在页面上。

更多信息:

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

我的想法是通过缓存作业(一次一个)刷新缓存,一旦用户保存某些内容,该作业就会排队。该作业将包含更改的相关信息,并且不必重新计算整个缓存,而只需重新计算更改的位。

问题部分:

即使用户刷新页面,我可以使用什么技术让用户及时了解数据?我是否应该在客户端以 indexedDB 或 localstorage 的形式保存“增量”,同时将数据发送到服务器。因此,当页面刷新时,用户会从本地存储或索引数据库中读取数据。

我还在考虑这个问题,显然我在这方面没有太多经验,到目前为止我所采取的方向有什么问题吗?

基本上我可以更改任何东西,包括后端/前端/缓存它仍处于 POC 阶段,我只是想尽可能多地了解对其他人有用的东西。

更新

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

我还在后端对平面数据库记录进行了一些转换,然后将它们转储到类似地图的结构中,并以 json 的形式将其传递给前端。

【问题讨论】:

  • 如果用户进行了一些更改并保存,为什么不能在刷新时请求这些数据库值?
  • 我认为最简单的方法是确保您知道创建缓存的时间。当您进行更改时,将页面的当前状态连同缓存的时间一起保存在 localStorage 中。当你加载页面时,你会得到缓存的数据,检查它是否比你的 localStorage 版本更新。如果是,请使用缓存,如果不是,请从 localStorage 重新加载您的数据,因为它已经缓存了数据以及您的更改。
  • 您所描述的听起来更像是一项数据转换工作,而不是缓存。详细说明您在服务器端做什么和使用什么会很有用。
  • @Matt Way 感谢您的回复。我无法获取这些记录,因为我不是在查看单个记录,而是在查看类似页面的索引。
  • @dave 感谢您的回复,听起来不错,我会试一试。

标签: javascript java angularjs caching


【解决方案1】:

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

【讨论】:

  • 当多个用户修改数据时,每个用户都会在本地存储中拥有自己的应用程序状态。
【解决方案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 
}

【讨论】:

    【解决方案3】:

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

    我有一点使用 AWS DynamoDB 存储 JSON 配置对象的经验,如果我需要更快,我可能会切换到 AWS ElastiCache。

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

    【讨论】:

    • 感谢您的建议,但目前无法更改数据库
    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2021-03-26
    • 2014-04-30
    • 2015-09-19
    • 2013-11-26
    相关资源
    最近更新 更多