问题标签 [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 回答
192 浏览

php - 如何让多个并行 PHP 请求等待缓存更新?

我有一个标准场景,您有多个并行请求试图访问基于 Redis 的缓存中的相同键。

当这个密钥过期时,请求进程会通知一些外部工作人员它需要重新计算(工作人员可能在另一台服务器上)。工作人员重新计算它并更新缓存。

当缓存很热时,一切都很好,因为我可以继续从缓存中提供过时的数据,直到重新计算新值。

问题是当缓存很冷并且 Redis 中还没有数据可供服务时。请求进程需要等待,直到外部工作者生成该值。在这种情况下,我不能使用缓存预热,因为由于缓存大小有限,只有请求的键应该被缓存。

所以问题是我怎样才能让 PHP 请求等到 Redis 中的计算值可用?或者在这种情况下,常见的解决方案是什么?

我已经知道的可能的解决方案:

Redis blpop 命令可能不起作用,因为要重新计算的值不在列表中,感觉有点像解决方法。也许可以实现某种基于文件的锁?但是,Web 应用程序和工作程序位于不同的服务器上,例如 NFS 不支持文件锁定。

我能想到的唯一可行的解​​决方案是有一个无限的 while 循环,每隔 X 毫秒对 Redis 执行一次 ping 操作,并有一些 Y 最大等待时间。然而,这真的是一个好的实用的解决方案吗?因为我不喜欢在所谓的短暂 Web 请求中使用无限循环。此外,在重新计算值时,数百个请求可能会运行无限循环并等待。

0 投票
1 回答
90 浏览

intellij-idea - IntelliJ 使缓存无效,但本地历史记录除外

我想在不删除文件本地历史记录的情况下使 IntelliJ 的缓存无效。

它存在这样做吗?我在网上找不到任何东西。

0 投票
1 回答
178 浏览

javascript - 如何检测/避免对我缓存的基于 React 的应用程序的更新?或者如何在缓存失效发生之前检测到它?

我正在用 React 开发一个应用程序,它在客户端进行加密并将加密的内容发送回服务器以进行安全存储(例如考虑在线钱包)。这很有效,因为数据是安全的,以防有人恶意访问数据。但是,如果黑客访问服务器并更改实际的 React 代码以将数据以原始格式而不是加密格式发送回,这将破坏整个系统。

那么如何强制 React 应用程序只缓存一次,然后在未来的任何时候,在它拉取应用程序的新版本之前,它会警告用户“有新的更新可用并且他们需要检查 twitter和/或 GitHub 以确保有效性”?

基本上我需要在“缓存失效”尝试发生之前检测它们并警告用户。我怎么能这样做?

0 投票
1 回答
340 浏览

symfony - 使用 Symfony 内置反向代理的 FOSHttpCacheBundle 缓存失效不起作用

我正在尝试做一件困难的事情:使用 FOSHttpCacheBundle 2.9.0 和内置的 Symfony 反向代理,使用 Symfony 4.4.13 实现缓存失效。不幸的是,我不能使用其他缓存解决方案(如 Varnish 或 Nginx),因为我的托管服务不提供它们。所以,Symfony 内置的反向代理是我唯一的解决方案。

我已经安装并配置了 FOSHttpCacheBundle(按照文档)。还创建了一个 CacheKernel 类并修改了 Kernel 以使用它(遵循Symfony 官方文档FOSHttpCache 文档FOSHttpCacheBundle 文档)。

经过几次测试(使用我的浏览器),HTTP 缓存工作并且 GET 响应被缓存(在浏览器网络分析器中看到)。但是,当我使用 PUT/PATCH/POST 更新资源时,GET 响应仍然来自缓存,并且在到期之前保持不变。我的推论是无效化不起作用。

我做错了吗?你能帮我解决问题吗?请参阅下面的代码和配置。

配置/包/fos_http_cache.yaml

src/CacheKernel.php

src/内核.php

公共/index.php

我的控制器之一,src/Controller/SectionController.php(注意:路由在 YAML 文件中定义)

0 投票
1 回答
226 浏览

redis - Redis:如何区分客户端跟踪跨多个数据库的键失效

无论如何要区分失效适用于哪个数据库?

例子:

跟踪插座:

主插座:

我遇到的问题是,当 MYKEY 在数据库 2 中设置时,跟踪套接字接收到:redis :invalidate 1) MYKEY。但是我想跟踪的密钥在数据库 1 中。

如果没有重新设计应用程序以避免跨数据库的键冲突或为每个数据库+跟踪创建一个套接字,我如何以有意义的方式使用跟踪?

编辑:Redis 6.0.8 独立安装

0 投票
1 回答
149 浏览

hibernate - 在集群中使用 infinispan 失效缓存休眠

我在集群环境中使用 Hibernate 5.4.22 和 Infinispan 11.0.4。Hibernate 二级缓存配置为使用 JCache 提供程序:

Infinispan 配置有以下 infinispan.xml:

我有一个测试实体“配置文件”,它应该与read-write策略一起缓存:

根据缓存并发策略/缓存模式兼容性表<cache usage="read-write"><invalidation-cache>应该是一个工作场景的组合。在我的测试中,我有一个节点持续读取一个对象,一个节点更新同一个对象。我发现读取节点永远不会收到通知对象已更改以便从数据库中再次读取它。通过查看日志,似乎写入节点上的失效缓存没有向读取节点发送任何消息。

但是,如果我将 infinispan.xml 更改为使用<replicated-cache>or<distributed-cache>而不是<invalidation-cache>,则读取节点会收到写入节点所做更改的通知。所以,我想这意味着问题不在 jgroups 中。

这是失效缓存中的问题,还是我的配置中缺少某些内容?

这是从失效缓存inv-read.txt读取的实例的日志文件和更新缓存inv-update.txt的实例的日志文件。

谢谢!

0 投票
1 回答
558 浏览

caching - 如何以编程方式使 Quarkus 缓存无效?

我遇到了一个问题,即使用@CacheInvalidate注释已经不够了。

一种方法必须擦除两个不同的缓存,其中一种使用给定参数中的两个,另一种使用全部三个。

@CacheKey注释的参数用于具有两个标识符的缓存,因此我也无法注释第三个参数,但它需要匹配cache-with-three-identifiers的键。

到目前为止,我看到的唯一解决方案是以编程方式清除方法本身中的第三个参数缓存。你会如何在 Quarkus 中做到这一点?

0 投票
2 回答
104 浏览

domain-driven-design - 在领域驱动设计应用程序中拉动以刷新

我需要在 iOS 应用程序中实现拉取刷新,我遇到了这个问题,我不知道如何使用 DDD 的最佳实践来解决这个问题。

表示层有一个刷新列表的事件,这需要更新结果丢弃缓存并从后端获取元素。

在域层中,我的用例与存储库通信,但是,由于缓存是一个实现细节,存储库接口没有公开“cleanCache”方法,因此没有干净的方法可以从用例刷新缓存。这或多或少是我拥有的文件结构

领域

  • 获取所有待办事项用例
  • TodosRepository(接口)

基础设施

  • InMemoryTodosRepository(缓存)
  • RemoteTodosRepository (api)
  • InMemoryWithRemoteTodosRepository(组合缓存和 api)

应用

  • 工厂

介绍

  • UI(与交互界面对话)
0 投票
0 回答
174 浏览

python - 在python中删除二进制数据的内存缓存

我希望使用我编写的代码来加速大型二进制文件的加载和处理。该代码有效,但速度很慢。我想进行改进,但是每当我第二次加载文件时,我都无法获得真正的加载速度,因为缓存内存会加快速度。如何禁用此缓存,或者如何测量代码的真实性能以便进行迭代?

这就是我正在做的事情:

  1. 首先调用np.memmap它来加载一个大的二进制文件
  2. 索引到 memmapped 数组以检索我想要的值(这是缓慢的部分,afaik)

我尝试手动删除del存储数据的变量,然后在其上调用垃圾收集器,gc.collect()但这无济于事。

我应该如何从内存中释放这些信息,以便获得真正的加载时间(或者如何解决这个问题来衡量真正的性能)?我需要 Cython 来正确处理这个问题吗,我希望暂时不要去那里。

编辑,代码位:

加载内存映射:

这两行都是从我的代码中的函数中调用的。在这些之后,我尝试运行垃圾收集器:

但是这并没有恢复原来的缓慢加载时间,因此我认为它没有清除内存缓存

0 投票
0 回答
499 浏览

google-chrome - 清除 CORS 的浏览器缓存

我需要清除 Chrome 中一个文件的缓存。

我正在设置从我自己的 CDN 加载字体,并添加了cache-control: public, max-age=31536000, immutable标题。但是,我没有正确设置 CORS,所以出现了 CORS 错误。现在,该 CORS 错误已修复,但由于缓存控制标头,Chrome 仍在处理旧请求。

注意:我只需要清除一次缓存。我希望字体在未来是不可变的。

我尝试过的事情

  • 从设置中清除最近的浏览器缓存
  • 在 Devtools > Network 中,选择“禁用缓存”
  • 在 Devtools > Network 中,右键单击网络请求并选择“从缓存中清除”
  • 使用 ⌘⇧R 硬重新加载(在 Mac 上)
  • 长按左上角的刷新按钮,选择“清空缓存并硬重新加载”(https://stackoverflow.com/a/7000899/11506995

我可以确认 CORS 错误有两个原因:

  • 现在可以在 Safari 中使用(以前没有)
  • 运行curl -IL -X'GET' -H'Origin: http://localhost:3000' https:example.com/file返回正确的 CORS 标头

相关文章