【问题标题】:Memcached getDelayed alternative implementationMemcached getDelayed 替代实现
【发布时间】:2010-06-14 21:25:18
【问题描述】:

我想在 PHP Memcached 扩展上使用getDelayed,但我认为它没有以正确的方式实现。

现在您要求一些密钥,然后使用fetch()fetchAll() 检索所有密钥。但是想象一个场景,我需要检索页面不同部分使用的 15 个键,我事先不知道,但我可以要求各种对象给我列表。我想要的是给 Memcached 实例这个列表(每个组件都会给出它的一部分),然后当我需要它们时从实例中检索它们,但不是一次全部检索:每个组件都会采用它需要的一个。

基本上,如果我要实现这一点,我会禁止单独使用getDelayed 并实现一个bookGet($keys) 方法,您可以在其中添加键到book(实际上调用getDelayed),并重新定义get 来处理这些三种情况:

  1. key被预订并取回->返回值;
  2. key 已预订但未取回 -> 去强制获取已预订的 key 并返回正确的值;
  3. 未预订密钥 -> 进行正常查找。

我想知道这是否有意义,您对这个主题的看法,以及是否有人已经实现了这个,或者 PECL Memcached 已经以这种方式工作,实际上文档没有正确解释它。

【问题讨论】:

    标签: php caching memcached


    【解决方案1】:

    我认为像这样将它添加到 PECL 是一个坏主意:get() 函数应该直接从 memcache 中检索,自您执行最后一次 fetch()/fetchAll() 以来,它可能已经更改了数据。通过为您的特定目的扩展 memcached 类可以轻松实现您的功能,这可能不是世界其他地方想要的。只需在您的课程中添加一些“已预订”和“已检索”密钥的私人存储并重新定义您的 get() 方法以按照您的喜好行事(当然也可以调用parent::get()),您就可以开始了。

    确实认为我应该能够多次调用 getDelayed() 并期望它添加额外的键来检索而不是覆盖它。 (所以 $m->getDelayed(array('foo'); 后跟 $m->getDelayed(array('bar'); 将导致这两个键的 fetchAll(),而不仅仅是最后一个“条”。

    【讨论】:

    • 是的,我知道我可以实现它,而且我知道getDelayed 不会忘记旧请求。我用这种方法遇到的问题可以在这种情况下解释:$m->getDelayed('foo');/.../$m->getDelayed('bar');/.../现在我想要'bar',所以我需要做一个 fetchAll(),它也返回' foo' 并且我必须将 'foo' 存储在某处 /... / 现在我需要 'foo' 所以我需要检查在之前的获取中是否已检索到它,如果没有,我需要现在获取。不知道我的推理是不是有些局限,但这会导致大量重复代码和不可扩展性......
    • 我知道您想暂时将“foo”存储在某个地方,这可以通过扩展类和 get() 方法轻松完成,正如我所描述的。没有其他对象实例,没有重复代码。
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    相关资源
    最近更新 更多