管理键(在 memcache 中)以防止过时的缓存值的最佳方法是什么?
我最近在我的网站上实现了memcache,它一直处于重的mysql负载下(mysql尽可能地优化)。它解决了我所有的加载问题,网站运行得很好。
我现在面临的问题是过时的缓存值。我在大多数页面上都有1小时的自动过期时间,并且当DB chnage中的值时,我也删除了密钥,但是我很难跟踪并有效地清除所有密钥。
在某些页面上,它是微不足道的。我可以使密钥item_id(例如item_4653),当更新它的数据或删除项目时,密钥将被清除。
但是在大多数页面上,我采用脚本文件名+查询字符串,md5 it,并将其用作memcache中的键。这对于复杂的URL(非常常见)特别有用。
例如,我加载了以下页面。
index.php?search_keywords=good&search_section=1&sort=release&page=2
它将包含一个项目列表,这些项目将从memcache中获取。然后,另一个用户提交一个项目,该项目的标题中包含“好”,并且它恰好在值范围内,它将出现在第2页上,除了它不会出现在那里,直到刷新缓存。更复杂的是,新添加的项目也将出现在索引.php?sort=latest,以及索引.php?category=some_category?page=1等。其中每个 1 个都有一个唯一的键(脚本名称 + 查询字符串的 md5)。
因此,如果从实时数据库获取新添加的项目,则它们可能会出现在数十个页面上,但在更新过时的缓存之前,它在任何页面上都不可见。唯一的选择是等待项目自动过期。
这个问题在我的论坛(自定义编码)上变得更加明显,其中所有可能的缓存页面组合的值都必须按需更新。假设我有4页线程,我注意到第2页上有3个垃圾邮件帖子。删除它们后,将重建页面 2,但随后还必须重新生成页面 3 和 4,否则在新建页面 2 和旧页面 3 上将出现重复的帖子。这只是一个例子.....有几十种这样的场景。
有什么想法吗?