gpt4 book ai didi

php - 管理 key (在 memcache 中)以防止缓存值过时的最佳方法是什么?

转载 作者:IT王子 更新时间:2023-10-29 00:17:41 24 4
gpt4 key购买 nike

我最近在我的网站上实现了内存缓存,该网站一直承受着沉重的 mysql 负载(mysql 已尽可能优化)。它解决了我所有的负载问题,并且网站运行良好。

我现在面临的问题是陈旧的缓存值。我在大多数页面上都有 1 小时的自动过期时间,当数据库中的值发生变化时,我也会删除 key ,但我很难跟踪并有效地清除所有 key 。

在某些页面上,这是微不足道的。我可以将键设置为 item_id(例如 item_4653),当它的数据更新时,或者项目被删除时,键被清除。

但在大多数页面上,我采用脚本文件名 + 查询字符串,对其进行 md5,并将其用作内存缓存中的键。这对于复杂的 url(非常常见)特别有用。

例如,我加载了以下页面。

index.php?search_keywords=&search_section=1&sort=release&page=2

它将包含一个项目列表,这些项目将从内存缓存中获取。然后另一个用户提交了一个标题中有“good”的项目,它恰好在值的范围内,它会出现在第 2 页上,除非它不会出现在那里,直到缓存被刷新。让这更复杂的是,新添加的项目也会出现在 index.php?sort=newest 以及 index.php?category=some_category?page=1 等等。每一个都有一个唯一的键(脚本名称的 md5 + 查询字符串)。

因此,如果新添加的项目是从实时数据库中获取的,那么它们可能会出现在数十个页面上,但在陈旧缓存更新之前,它不会在任何页面上可见。唯一的选择是等待项目自动过期。

这个问题在我的论坛(自定义编码)上变得更加明显,其中的值必须按需更新,对于所有可能的缓存页面组合。假设我有 4 个页面线程,我注意到第 2 页上有 3 个垃圾帖子。删除它们后,第 2 页被重建,但它也必须重建第 3 和第 4 页,否则新重建的第 2 页上会有重复的帖子,和旧的第 3 页。这只是 1 个示例......有许多这样的场景。

有什么想法吗?

最佳答案

由于您在 memcached 中缓存整个页面,因此您的页面无法相互共享数据库中的缓存数据。假设我有 page1.php 和 page2.php,page1page2 作为 memcached 中的键。两个页面都显示项目。我添加了一个新项目。现在我必须使 page1page2 过期。

相反,我可以在 memcached 中有一个 items 键,page1.php 和 page2.php 都用来显示项目。当我添加一个新项目时,我使 items 键过期(或者更好,更新它的值),并且 page1.php 和 page2.php 都是最新的。

如果您仍然想缓存整个页面,您可以将信息添加到您的键中,这些信息将在缓存的数据发生变化时发生变化(如果数据变化太频繁,这将没有意义)。例如:

"page1:[timestamp of newest item]"

通过这种方式,您可以查找最新项目的时间戳,一个廉价的查询,并用它构建您的缓存键。一旦添加了更新的项目,缓存键就会改变,自动失效。这种方法意味着您仍然必须每次都访问数据库以查看最新项目的时间戳。

关于php - 管理 key (在 memcache 中)以防止缓存值过时的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1879657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com