【问题标题】:Memcache - How to prevent frequent cache rebuilds?Memcache - 如何防止频繁的缓存重建?
【发布时间】:2013-02-10 12:30:11
【问题描述】:

上周左右我一直在为 Memcache 工作,我已经设法弄清楚如何设置键/删除键。这很好,但我仍在尝试找出如何在一段时间的结果循环中做同样的事情。

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

我能想到一个可能的解决方案的唯一方法是,当用户插入新帖子时,这会删除密钥,而当再次查看所有帖子时,这就是再次设置密钥的时候。但这似乎适得其反,就像有 10 位用户提交帖子一样,所有帖子都会一遍又一遍地设置(似乎并不真正有益)

我希望这是有道理的,任何帮助或指导将不胜感激。

【问题讨论】:

    标签: php mysqli memcached


    【解决方案1】:

    是的,如果您在有新帖子时删除密钥,则会发生您指定的情况。为了避免这种情况,您可以使用 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 插件,那么您只能使用(原子)getset 的组合来复制 touch 的行为。

    职位系统

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

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

    【讨论】:

    • 感谢 Birla,这很有帮助。我已经安装了 Memcached,这似乎是两者中更好的(尽管我读过的绝大多数文章主要是针对 Memcache 的)你能给出一个使用触摸方法的粗略例子(或者知道网上的任何例子吗?)我将尝试用一些代码更新我的问题,以说明我如何/可以解决这个问题。关于触摸方式。
    • @LeeMarshall 我已经用一些代码更新了答案。基本上,您需要使用与调用 add 时相同的键调用 touch 来存储最新帖子组。
    • 我明白你的意思,我说的对吗?触摸方法在触摸方法到期之前不允许再次重建?这是正确的吗?防止在给定时间段内进行大量重建(在上面的示例中为 10 分钟)
    • 是的,没错。另一种看待它的方式是,在缓存数据中出现新帖子之前至少会有 10 分钟的延迟。解决问题的最佳方法实际上是节流而不是去抖动,但我们不能单独使用 memcache 来实现这一点。请参阅drupalmotion.com/article/… 了解去抖动和节流之间的比较,尽管在 JavaScript 的上下文中它应该有所帮助..
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    相关资源
    最近更新 更多