我正处于一个涉及将网上商店与外部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。
答案 0 :(得分:1)
如果系统接近(即不在非常慢的线路上),get总是比更新快。 (不是真的,但请忍受我)。
你看,一旦数据库开始填满+10.000产品,更新往往会花费很多。特别是如果你在繁忙的商店前端做这件事。
(我会假设MySQL是这里的webservice的后端)。
使用GET的便宜得多,它会消耗20倍的带宽(假设你有带宽),而不是UPDATE查询。主要是因为SELECT将从mysql的缓存中回答。据我从mysql文档中可以看出,UPDATE不会从缓存中回答,并且需要为每个查询转到磁盘,而UPDATE在工作时有很大的可能导致表锁定。
这基本上意味着,即20个问题。 (或200,如果你需要)将从RAM中回答,速度非常快。 磁盘IO可能是您在实时商店系统中的限制因素。
但说实话,如果我是你,我会尝试两者并测量每种情况下的花费时间。请记住,当您获得许多产品时,一切都会变慢(特别是更新)。