问题标签 [fragment-caching]

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 投票
1 回答
2275 浏览

ruby-on-rails - 解决 Memcached 在 Rails 片段缓存中缺少通配符过期的问题

我正在向既有登录用户又有匿名用户的 Rails 3 站点添加片段缓存,并且需要根据整个站点显示的内容何时更新来控制页面的某些部分何时过期。在此过程中,我发现 memcached 不支持 expire_fragment 的正则表达式,所以现在我正在寻找解决方法。

对于匿名用户来说,这不是一个大问题。我创建缓存键,例如“frontpage-new-shows”或“schedule-weekly-forecast-10/24/10”,并在 Show 模型中出现新条目或下周播出的节目时使它们过期通过清扫器进行修改。这工作得很好。

我的问题是登录的用户。他们每个人都有自己定制的时间表,所以我的密钥看起来像“schedule-user-jschuur-10/10/24”,而 jschuur 是帐户的用户名。我知道,使用基于日期的约定,它们自然会过期,但我也想在当天(或一周)的日程安排中发生与显示相关的更改时,显式地使缓存日程安排的所有片段过期。

事实证明,memcached 无法执行我需要的那种通配符过期(schedule-user-.*-10/10/24)。这意味着我需要某种解决方案来存储在 memcached 中的中央查找键中发出的所有键,或者让 Rails/Ruby 根据我为我发送到 memcached 的键在内部以某种方式执行此操作。

我假设前者是更好的解决方案。我的问题是,我如何以最有效的方式做到这一点,所以我不会一直吹,不再打数据库。我可以在 memcached 中存储一个数组或散列,检索整个内容,循环查找匹配项,删除它们并将散列存储回来。这听起来对几百甚至一千名用户来说可能很有效,但这真的是最好的方法吗?

有人已经解决了这个问题并发布了解决方案吗?

需要考虑的一件事是,我目前几乎所有的缓存都是通过视图中的语句完成的,面向 ActiveRelations 准备好的尚未触发的查询,例如:

该站点托管在 Heroku 上,我使用 dalli gem 作为客户端。

0 投票
1 回答
232 浏览

ruby-on-rails - 使用 Touch 缓存片段

目前我正在使用带有对象键的片段缓存。我使用 Touch 使缓存过期,并更新 updated_at 列,然后当前缓存变得过时。并且下次生成一个新的缓存。

对象的缓存键如下所示

现在我想将我的产品缓存在其他地方。为此,我想做与以前相同的事情,即简单地在缓存选项中提供对象,但我不能这样做:(

如果我可以生成这样的密钥以使我的缓存仍然随 Touch 过期,那就太好了。

不幸的是,这是不可能的,有人知道我该如何解决我的问题吗?

格雷格

0 投票
5 回答
1514 浏览

drupal - 在每个页面上使用特定于会话的数据缓存 Drupal 站点

我们有一个用 Drupal 6 编写的网站。

我们想使用 Drupal 的缓存机制来提高性能,但是当我们打开它时,我们发现了问题,因为我们的站点在每个页面上都显示了会话数据。Drupal 的缓存系统仅适用于静态内容页面,我们的会话数据有效地意味着我们的页面都不是静态的。

为此,我们提出了两种解决方案:

  1. 重写显示会话数据的块,以便它使用 Ajax 加载非静态数据,这样主要的 HTML 内容就是静态的。这样做的缺点是它意味着大量的工作,而且它会减少非启用Javascript 的用户和专业浏览器(即屏幕阅读器)的功能。

  2. 将会话数据移动到一个iframe或类似的位置。这听起来不对,我不想这样做,但我认为它会解决问题。

  3. 或者找到一个替代的缓存系统,它允许我们以一种可以处理每个页面上都有一小块动态数据的方式缓存站点。这是我们的首选选项,但我们无法在找到任何东西方面取得任何进展,因此这里提出了问题。

因此,如果有人对选项 3 有任何建议,请告诉我们。谢谢你。

(ps - 我知道 Drupal 7 确实有一个改进的缓存系统可以帮助解决这个问题,但我们还没有准备好迁移到 D7)

[编辑] 在这方面没有太大进展,所以我会开放给赏金。

我研究了 Ubercart 如何处理类似情况(因为它是最流行的 Drupal 模块之一,并且与我们解决的问题基本相同)。他们通过让购物车信息块在用户未登录时显示静态文本(即“单击此处查看您的购物车”)来解决此问题,并且仅在用户登录时在每个页面上显示动态购物车数据。我们不要觉得这实际上解决了问题;它只是逃避它,这不是我们想要的。但我担心,如果 Ubercart 采取这种方式,它可能会成为唯一的选择。

0 投票
2 回答
940 浏览

javascript - Fragment Caching Using Javascript

Can someone point me to some example code on how best to do caching while loading up the dynamic parts of a page using javascript?

My canonical example involves a page where nothing ever changes other than the user's logged in status and username at the top of the page. Changing this text through jQuery and an ajax request is easy enough, but since I'm doing it on $(document).ready(), if you look quickly, you can see the page load with something like "Click Here to Login" before the ajax request fires and updates that section of the page.

Edit for clarification:

If I cache the entire page, the following happens.

  1. User A requests the page
  2. Page is not cached, so application generates html with "Hi User A" in the upper right corner
  3. User B requests the page
  4. Page is cached, so application serves it us as-is -- including the "Hi User A" bit <- This is the part that I want to dynamically update.

Ideally, at step 2, the page would get cached without the "Hi User A" bit, so that when someone requests the page, I make a simple ajax request to get the greeting and then shove it into the dom.

I'm assuming javascript is the way to go, but I'm thinking there has to be a better way than to wait for $(document).ready() such that the page renders more naturally.

If it matters (though I don't think it should, as a solution that applies to static html would also work for what I'm doing), I'm using rails 2.3.x and jQuery.

0 投票
3 回答
2005 浏览

caching - Rails 3:清扫器不破坏片段,认为缓存已禁用

我想用扫地机使碎片过期。执行清扫器回调,但对 expire_fragment 的调用什么也不做,因为(我假设)cache_configured?返回零。缓存已配置,并且正在我的模板中创建和使用片段(在日志中进行了验证)。我究竟做错了什么?

应用程序.rb

生产.rb

拍卖清扫器.rb

在日志文件中,cache_configured?为 nil,perform_caching 和 cache_store 也是如此。

所以我假设我的片段没有过期,因为 expire_fragment 的代码如下:

文件 actionpack/lib/action_controller/caching/fragments.rb,第 87 行

0 投票
2 回答
196 浏览

ruby-on-rails - 在 Rails 中进行片段缓存时链接断开

假设有一个博客,其中包含帖子、评论和可以评论的用户。用户拥有对 SEO 友好的 URL,例如http://localhost:3000/users/john(这可以通过使用 permalink_fu 轻松完成)。

该模型使用触摸来简化缓存:

视图代码将是这样的:

现在假设 John 将他的昵称更改为 Johnny——他的 URL 更改为http://localhost:3000/users/johnny。由于对帖子和评论进行片段缓存,除非片段过期,否则 John 的评论将指向 John 的错误 URL。在此示例中,可以手动触摸或过期包含 John 评论的所有帖子,但在复杂的应用程序中,这将需要非常复杂的查询,并且看起来很容易出错。

这里的最佳做法是什么?我应该使用非 SEO 友好的 URL,例如 /users/13 而不是 /users/john 吗?或者可能保留旧 URL 列表直到缓存过期?没有解决方案对我来说很好。

编辑:请注意这只是一个简化的例子——在这种情况下查询帖子并触摸它们绝对非常简单。但是一个复杂的应用程序意味着对象之间的许多关系,这使得很难跟踪每个引用用户的对象。我对此进行了一些研究——Facebook只允许设置你的用户名一次,所以这个问题不存在。

0 投票
2 回答
1185 浏览

asp.net - ASP.Net 中的页面缓存问题

我们在 ASP.Net 网站主页中使用页面输出缓存,以使其看起来加载更快。缓存时间非常短(5 分钟),因此数据更新可以在短时间内反映给用户。在主页本身,我们有一个名为“投票”的部分,用于为显示的问题投票最佳答案。在此部分中,当用户已经投票时显示投票结果,对于尚未投票的用户,必须显示投票问题。问题是,当已经投票的用户访问了主页时,页面会被缓存并显示投票结果。在这 5 分钟的缓存时间内,当另一个尚未投票的用户访问该页面时,该用户也只显示结果而不是投票问题,因此该用户无法对该投票进行投票。

为了防止这种情况,我们尝试了数据缓存技术,其中缓存主页中所有部分的数据表并呈现页面。这种技术仍然没有页面输出缓存那么快,所以我们的用户并不需要这种技术。与页面输出缓存相比,这两种数据缓存的加载时间要长得多。

我们还尝试了替换缓存方法,即使它缓存了整个页面,也只重新加载页面的一部分。这种缓存方法中最重要的问题是我们只能在那个替换控件中使用 HTML 控件。我们已经尝试仅使用 HTML 控件创建投票部分,但我们仍然遇到页面其他部分中使用的 AJAX 更新面板的问题。

请指导我解决此问题。必须为每个用户单独重新加载页面的一部分(轮询部分),而其他部分必须从缓存中传递。这应该在不影响页面性能的情况下发生。

0 投票
1 回答
282 浏览

ruby-on-rails - Rails 的片段缓存是否适合这个问题?

我还不了解 Rails 的缓存系统,但我在指南部分阅读了一个称为片段缓存的功能。

我的问题是:我的观点主要是静态元素。它几乎是完全静态的,唯一的变化是表单中的状态消息和隐藏的输入字段,这两者都是在对服务于视图的操作的每次请求时生成的。

片段缓存适合这个问题吗?我应该使用什么缓存策略?

0 投票
2 回答
608 浏览

ruby-on-rails - 如何避免使用 Rails 不断地重新计算汇总数据?

我有一个用户个人资料页面,它有一个带有用户统计信息的侧边栏,就像 Stack Overflow 个人资料页面(例如,总访问量、徽章数量)。

问题是目前我正在访问数据库并针对每个请求计算这些统计信息。我可以实现片段缓存来减少这种情况,但是有没有更好的方法来处理这种类型的事情?

将汇总的汇总数据存储在数据库中似乎可能会导致问题(即不一致)。

0 投票
1 回答
725 浏览

ruby-on-rails - Rails 3.1 通配符过期缓存用于查询字符串的操作

我有一个页面,其中index操作显示帖子列表,带有自定义排序列,分页等。虽然我可以缓存每个单独的页面/排序选项

我不能使用一次调用来一次使所有这些过期expire_action(这是一个问题)。我知道expire_action有一个正则表达式选项,但这很混乱(使用正则表达式来搜索用哈希创建的键),而且我使用的 memcached 不起作用。

如何通过一次调用使操作的所有缓存成员过期expire_action?如果这是不可能的,您是否可以推荐任何其他缓存选项?