PUT与GET速度相比,是否值得对GET进行更改检查,然后执行PUT?

时间:2014-08-11 21:17:21

标签: php apache

我正处于一个涉及将网上商店与外部API同步的项目中,我在产品更新等方面有一些钩子,每次处理对后端API很重要的值时,我会这样做:

/**
 * localObject parameters must be the same as the ones from the API
 * @param $endpoint
 * @param $objectName
 * @param $identifierKey
 * @param $identifierValue
 * @param $localObject
 * @return bool
 */
private function objectHasChanged($endpoint, $objectName, $identifierKey, $identifierValue, $localObject) {
    $res = $this->request("GET", "/$endpoint?$identifierKey=".$identifierValue);

    if ($res->status !== 200 || !property_exists($res->body, $endpoint))
        return false;
    $BBObject = $res->body->{$endpoint}[0];

    $objectHasChanged = false;
    foreach ($BBObject as $property => $value) {
        if (property_exists($localObject, $property)) {
            if ($value != $localObject->{$property}) {
                $BBObject->$property = $localObject->$property;
                $objectHasChanged = true;
            }
        }
    }
    if ($objectHasChanged) {
        $this->request("PUT", "/$endpoint/".$BBObject->id, array(
            $objectName => $BBObject
        ));
    }
    return $BBObject;
}

这基本上查询GET,它在avg prob上返回大约20个项目,将项目循环到本地副本,如果存在更改则更新后端,每次执行PUT会更快吗?

PUT更新还包含大约20个平均项目。数据是JSON。

1 个答案:

答案 0 :(得分:1)

如果系统接近(即不在非常慢的线路上),get总是比更新快。 (不是真的,但请忍受我)。

你看,一旦数据库开始填满+10.000产品,更新往往会花费很多。特别是如果你在繁忙的商店前端做这件事。

(我会假设MySQL是这里的webservice的后端)。

使用GET的便宜得多,它会消耗20倍的带宽(假设你有带宽),而不是UPDATE查询。主要是因为SELECT将从mysql的缓存中回答。据我从mysql文档中可以看出,UPDATE不会从缓存中回答,并且需要为每个查询转到磁盘,而UPDATE在工作时有很大的可能导致表锁定。

这基本上意味着,即20个问题。 (或200,如果你需要)将从RAM中回答,速度非常快。 磁盘IO可能是您在实时商店系统中的限制因素。

但说实话,如果我是你,我会尝试两者并测量每种情况下的花费时间。请记住,当您获得许多产品时,一切都会变慢(特别是更新)。