PHP Memcached:getDelayed和getMulti-如何使用?

3

最近我思考了一下如何在PHP应用程序中使用getDelayedgetMulti以及它们之间的区别。

从阅读有关getDelayed的文档中:

“该方法不等待响应,立即返回。当您准备好收集项目时,请调用Memcached::fetch或Memcached::fetchAll。”

显然,在有可用键之前需要调用fetchAll,而不是像getMulti那样。但实际上,什么时候进行实际的memcached调用呢? 在fetchAll还是在运行getDelayed时?

更新示例:

    $this->memcached->set('int', 99);
    $this->memcached->set('string', 'a simple string');
    $this->memcached->set('array', array(11, 12));

    $this->memcached->getDelayed(array('int'));
    $this->memcached->getDelayed(array('string'));
    $this->memcached->getDelayed(array('array'));

    print("<pre>".print_r( $this->memcached->fetchAll() )."</pre>"); // returns the array element only.
2个回答

4
Memcache IO发生在getDelayedfetchAll中。 getDelayed的基本含义是“我将要用到这些键,但我现在不需要它们”。主要的好处是它允许PHP在后台作为并行操作执行此操作。如果您知道在进程的后续阶段需要哪些键,则可以要求PHP获取它们,并在您确实需要它们时调用fetchAll
如果PHP在忙于其他任务时成功获取数据,则在您调用fetchAll时,不需要等待。如果没有,进程会暂停,直到来自Memcached的数据传输完成。
一个非常愚蠢的例子是,如果您有两件事情要做:
1.调整大小需要3秒的图像。 2.从memcache获取100个值需要2秒钟。
如果您只调整了图像大小,然后使用getMulti,那么需要5秒钟。
如果您为您的键调用了getDelayed,然后调整了图像大小,然后使用fetchAll,那么整个过程只需要3秒钟。

嗨,Oli,感谢你的回答。我用一个例子更新了我的帖子。显然,getDelayed调用覆盖了所有先前的getDelayed,并且仅返回最后一次调用中的值。请查看我的第一篇帖子并告诉我你的想法。 - Industrial
没问题,但如果是这样的话,getMulti和getDelayed之间有什么区别呢? :) - Industrial
嗨Oli,非常感谢!这是SO上最好、最详细的答案了!大家都很看好! - Industrial

3

这个过程是在后台完成的。当您调用getDelayed时,它会告诉该服务器上的memcache客户端它想要这些键,并且稍后会回来获取它们。因此,当memcache客户端执行提取操作时,您的PHP脚本可以自由地执行其他操作。然后,在需要数据时,您调用fetchAll。如果在调用fetchAll时所有数据已经可用,则立即返回。否则,它将阻塞直到所有数据准备好。

getMulti和fetchAll都是阻塞调用。它们等待直到有所有数据可供返回。getDelayed是非阻塞的,因为它无论是否有数据都会立即返回(因为您稍后需要“拉”数据)。

一个使用getDelayed的例子是这样的:假设你有一个应用程序,你知道你需要从memcached中获取一个大对象(比如渲染的html页面)。一旦你知道你需要它,你可以调用getDelayed。然后,你可以处理所有的应用程序清理、日志记录、头等操作。一旦所有的事情都处理完了,你就可以调用fetchAll来实际导入数据到你的脚本中。由于其他所有的事情都已经完成,你只需要输出数据并退出即可。

我可以使用多个getDelayed调用和一个fetchAll来获取它们而不会引起开销吗? - Industrial
老实说,我不确定。试一下吧...那是找出答案的最好方法。只要尝试一下... - ircmaxell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接