Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以PHP+;雷迪斯_Php_Redis - Fatal编程技术网

以PHP+;雷迪斯

以PHP+;雷迪斯,php,redis,Php,Redis,在web上的PHP+Redis中有很多关于“管道”的信息。但是,当您实际开始查看示例时,没有一个示例执行实际的管道。他们所做的只是批量处理。例如,让我们以Predis->pipeline()和Phpredis->multi()为例。它们基本上暂停命令的执行,而是将命令收集到缓冲区中,然后在稍后调用->execute()/->exec()时作为批处理执行它们 缺点: -必须分配一个命令缓冲区,该缓冲区对于许多命令来说都会变大 -每批命令都需要一次到服务器的往返 我期望管道模式的行为是:在我将命令传

在web上的PHP+Redis中有很多关于“管道”的信息。但是,当您实际开始查看示例时,没有一个示例执行实际的管道。他们所做的只是批量处理。例如,让我们以Predis->pipeline()和Phpredis->multi()为例。它们基本上暂停命令的执行,而是将命令收集到缓冲区中,然后在稍后调用->execute()/->exec()时作为批处理执行它们

缺点: -必须分配一个命令缓冲区,该缓冲区对于许多命令来说都会变大 -每批命令都需要一次到服务器的往返

我期望管道模式的行为是:在我将命令传递给客户机时立即开始发送命令,而不是缓冲命令。在命令响应到达之前返回。允许在前一个命令处于“飞行”状态时发送越来越多的命令。每隔一段时间,从客户机收集已到达的响应,而不必等待尚未到达的响应

奇怪的是,这些示例实际上将常量传递给客户机,称为“管道”,但它们将该行为描述为批处理


大问题:如何将这些客户机真正置于管道模式?

您必须保留一个挂起的db命令队列,并将响应与查询相匹配。php中的db调用将立即返回,状态稍后传递;php可能必须在出现错误时回滚。它是基于事件的编程;我写的nodejs beanstalkd接口就是这样工作的,挂起的DB命令队列将在Redis服务器和/或网络套接字中。在客户端排队命令将再次破坏管道。关于错误,我期望的效果与我先等待对错误命令的响应,然后再发送更多命令一样,只是没有时间往返。不是等待发送,而是等待响应:php调用将立即返回。但是,在内部,它必须跟踪哪些仍然未完成,才能报告错误。我在msgpack容器中对redis命令的定制批处理进行了基准测试,该批处理由服务器端Lua脚本执行,其性能优于redis管道(见下文)。因此,这对我来说已经不是问题了。