问题标签 [cache-invalidation]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
471 浏览

node.js - 如何使 NodeJS 中 S3 上特定文件夹的 cloudfrontcahce 无效?

我想使节点 js 中 s3 存储桶中的文件夹(和子文件夹)无效。这是我目前正在使用的脚本:

这就是我得到的答案:

0 投票
0 回答
441 浏览

amazon-web-services - AWS CloudFront 错误调用 CreateInvalidation 操作时发生错误 (NoSuchDistribution):指定的分配不存在

拥有 Cloud Front 策略的用户

但出现错误:AWS CloudFront 错误调用 CreateInvalidation 操作时发生错误 (NoSuchDistribution):指定的分配不存在。

0 投票
2 回答
170 浏览

database - 是否有一个开源组件可以订阅各种数据库活动提要并使 Redis 等进程外缓存失效?

我们正在寻求实现一个基于 redis 的缓存来读取大量数据,以便将我们的数据库作为读取缓存。我想实现一种更好的失效机制,而不是仅仅基于 TTL 或 LRU 的驱逐,以尽可能地防止过时的读取。

一些数据库为诸如表之类的数据库对象提供通知机制。例如 oracle 有Change Notifications而 Postgresql 有NOTIFY用于此目的。是否有任何现有的开源项目/组件可以监听这些通知并使用它们使进程外缓存(如 redis 或 memcached)无效?我已经看到了几个对进程内缓存执行此操作的项目,但到目前为止还没有一个针对进程外(集群/非集群)缓存的项目。

0 投票
1 回答
113 浏览

sql - 从预定义查询列表中查找哪些 SQL 查询受 INSERT、UPDATE 或 DELETE 影响

介绍

我正在构建一个缓存系统,其中缓存的每个节点都可以从具有 0-n 参数的预定义、有限的 SQL 查询集中调用任意数量的 SQL 查询。

根据这些查询的结果,节点执行相当慢的计算并返回一个缓存的值。

查询可能如下所示:

查询 #1:

查询 #2:

其他查询可能使用连接,没有参数或有多个参数,但查询的数量是有限的。

我跟踪每个节点调用的查询和参数集,并建立一个依赖关系列表。然后当查询结果发生变化时,我知道我需要使依赖它的所有缓存节点无效并重新计算它们的值。

问题的核心

现在,困难的部分是知道在我执行 INSERT、UPDATE 或 DELETE 时哪些查询和参数集受到影响。

例子

此操作将影响带有参数的查询#1 ['foo'],并且所有依赖于具有这些参数的查询的缓存节点都应该失效。

此操作不会影响查询 #1,因为它不依赖列birth_date来构建其结果。

['bar']即使在操作后没有行与查询 #1 匹配,这也会影响带有参数的查询 #1。

第一个解决方案

我想出的解决方案有效,但肯定需要改进。

  1. 对于数据库上的每个操作,跟踪一组受影响的行和列:
    INSERT:考虑插入的行及其所有列
    UPDATE:考虑更新之前和之后的行,仅包含更新的列。您最终得到 2 行
    DELETE:考虑删除之前的已删除行及其所有列
  2. 对于在步骤 1 中找到的每一行,找出所有可能受到影响的查询。这是我今天做大量体力工作的地方。我目前正在手动列出每个查询的所有依赖项。示例Q1

需要注意的一些有趣的事情:

  • 一个查询在使用join时可能会依赖多个表,所以dependencies是一个数组
  • 我列出了查询所依赖的列,因此可以跳过其他列的更新
  • 通过查看表和列,我们知道行会影响查询
  • 我们需要根据行找到参数集。
    结果是一个数组,因为一行可能会影响具有多个参数集的同一查询。在这个基本示例中,数组的长度仅为 1,因为该行使用 1 个参数集影响查询。

现在考虑以下查询:

基于步骤 1,我们构建两行:

  • { id: 'foo' }: 更新前行的值
  • { id: 'bar' }: 更新后行的值

请注意,两行都只有id列,因为我们只更新了这一列。现在查看我们在上面构建的依赖项数组,我们知道两行都会影响查询Q1,因为表匹配,并且列重叠(它们都有id列)。

要找到参数集,我需要getParams为每一行调用并将结果展平: [['foo'], ['bar']].

就是这样。我们现在使所有依赖于Q1参数集['foo']或的缓存节点无效['bar']

开放式问题

我正在寻找我可能忽略的任何其他路线。最重要的是,我正在寻找一种自动构建每个查询的依赖关系的方法,手动完成是缓慢、困难且容易出错的。

0 投票
1 回答
41 浏览

amazon-web-services - AWS cloudfront 在 Google Chrome 中提供过时的内容?

我在 AWS s3 中安装了一个反应应用程序。我正在使用 AWS CloudFront 提供内容。我在应用程序中进行了一些更改,并在 CloudFront 中进行了失效。它在除 Google Chrome 之外的所有浏览器中提供更新的内容。谷歌浏览器使用旧内容加载页面。你能告诉我为什么会这样吗?

谢谢你。

0 投票
0 回答
33 浏览

javascript - 如何使查询字符串中包含“{”的 CDN URL 无效

下面是包含查询字符串参数的请求 url,我已经使用 CDN 成功缓存了它。但我无法从缓存中清除请求 url 或使其无效。

url - /search/name?parent=true&filter={"age":5,"skip":0,"where":{"address.pincode":"403003"},"include":["name", "姓氏”,“地址”]}

错误消息 - “您的请求包含一个或多个失效失效路径。”

0 投票
0 回答
120 浏览

caching - 缓存和缓存失效不起作用 GCP Cloud CDN

使用 https 负载均衡器实现 GCP Cloud CDN 时遇到问题。Https 负载均衡器使用的是公共的后端存储桶。我从邮递员那里得到输出,但是当在负载均衡器日志中调试时,随机缓存命中有时是真实的,而不是其他时间命中跟随文档 https://cloud.google.com/cdn/docs/caching

缓存无效也不起作用。 https://cloud.google.com/cdn/docs/cache-invalidation-overview

0 投票
0 回答
187 浏览

node.js - 使 TypeORM Redis 缓存失效

我正在使用 NodeJs (Typescript)、MySQL、Redis 和 TypeORM,我有一个关于 Redis 缓存失效的问题。

让我举一个用例,假设有 100 个国家和与这些国家相关的不同产品(假设数据库中有几百万个产品)

然后是根据自己的国家搜索产品的用户。也可以通过搜索条件,比如说搜索所有来自日本的电子类产品,其中包含单词磨床。我想缓存这些搜索至少一两天,但是当我们说数据库中的产品价格发生变化时会出现问题,我想使缓存无效,但由于我无法为该动态搜索条件提供固定标识符,我是无法使 Redis 中的特定卡盘无效。

我已经阅读了缓存的 TypeORM 文档,但我不建议这样做。

请建议是否有可能使用 TypeORM 来解决上述问题或任何解决方法,例如手动使用 Redis Client 和 TypeORM 来添加、获取和使数据无效。

任何帮助,将不胜感激。

0 投票
0 回答
23 浏览

node.js - Redis - 基于标签的失效驱逐策略

我想实现一个 Redis 缓存,它应该能够基于标签使键失效。

例如,要缓存一个帖子列表查询,缓存看起来像

以开头的条目tags包含一组缓存键,其中存在给定的实体,因此要使特定帖子的缓存无效,我将获取其标签并del为所有它们触发查询。

我正在努力解决的部分是驱逐政策。通常,allkeys-lru首选是 ,但是,我需要确保在查询仍在缓存时标签不会随机消失,因为如果 redis 驱逐tags:post:1,我将无法使其缓存无效。

我看了看,volatile-ttl以为我ttl在数据上设置为 3h,但在标签上设置为 4h,这样 Redis 应该更喜欢将标签保留更长时间,但是这lru部分不起作用。我觉得这有一些隐藏的问题。

我该怎么办?我曾考虑将标签保存在单独的数据库中,但驱逐策略是针对每个实例,而不是针对每个数据库。

我应该将标签存储在单独的实例中吗?

0 投票
2 回答
89 浏览

reactjs - AWS Cloudfront 缓存失效路径使用情况

我在云端使用s3存储桶作为源来缓存和托管我的reactjs网站。

在 s3 上的每次部署之后,我想使我的云端分发的缓存无效,以便用户可以获得部署的最新版本。

此外,在阅读云端失效的定价时,我想确保我不超过每月1000 条路径的免费套餐。另外,我们在一个月内没有超过 10 或 20 个部署到生产环境。每个部署在目录中都有大约 500 个文件:

在此处输入图像描述

所以我的问题是:如果我"/*"用作失效查询,它会被视为1 路径吗?或者它将是500 条路径