Memcache - 如何防止频繁的缓存重建?

时间:2013-02-10 12:30:11

标签: php mysqli memcached

我上周一直在为Memcache工作,我已经设法解决了如何设置键/删除键。这很好,但我仍然试图找出如何为一段时间的结果做同样的事情。

例如,我将有一个post循环的帖子,从逻辑内部函数将检查是否设置了Memcache,如果不是,它将收集结果并创建密钥。我的问题是,如果我已将循环数据设置为设置密钥并显示设置密钥(最新优先)那么当插入新帖子时会发生什么?我知道我可以设置时间限制在设置键上,但是当内容将/可以添加时,似乎设置限制仍然可以显示旧帖子。所以我的问题是如何更新设置密钥。

我能想到一个可能的解决方案的唯一方法是当用户插入新帖子时,这会删除该键,当再次查看所有帖子时,这就是重新设置键的时间。但这似乎相当反效果,就像有10个用户提交帖子一样,所有帖子都会反复设置(看起来并没有什么好处)

我希望这是有道理的,任何帮助或指导都会受到赞赏。

1 个答案:

答案 0 :(得分:0)

是的,如果您在新帖子中删除密钥,则会指定您指定的方案。为了逃避这种情况,您可以使用a)memcache的到期或b)维护自己的作业系统来控制缓存重建的阈值。

Memcache的到期

PHP有两个Memecache PECL插件,即MemcacheMemcached。 Memcached(注意d后缀)支持一种名为touch的方法,它允许我们为现有项设置新的到期时间。假设您将缓存设置为2小时,当出现新帖子时,我们可以使用touch将到期时间设置为10分钟。因此,如果在接下来的10分钟内有新帖子,缓存将只重建一次。这种技术被称为技术术语中的去抖动。

一些代码:

$_memcached = new Memcached;
if(!$_memcached->addServer('localhost',11211))
{
    $_isConnected = FALSE;
}
else
{
    $_isConnected = TRUE;
}

$_memcached->touch($key, $expiry);

$_memcaced->add($key, $value, $expiry);

请注意:这只是举例,请创建一个单例类并使用它。

如果必须使用旧的Memcache插件,则只能使用(原子)touchget的组合复制set的行为。

工作系统

如果您有一个作业系统,那么每次出现一个新帖子时都会提交一个作业,该帖子将由作业聚合器执行,以控制缓存重建的频率。

使用Memecached似乎是最好的方法。