【发布时间】:2012-08-22 10:17:27
【问题描述】:
我最近阅读了许多关于 PHP 应用程序可扩展性的文章。几乎我读过的所有文章都提到了缓存,所以我想出了在类属性中缓存数据库数据的想法,以防止过多的数据库查询。我想分享这个想法,所以我在博客上发布了它,只是让我的老师告诉我这是毫无意义和愚蠢的。除了用无意义和愚蠢这两个词之外,他无法真正解释为什么它很糟糕。有人可以解释一下为什么这种缓存方法来帮助扩展 PHP 应用程序是不好的吗?
方法:
理论:
我认为最好有一个类属性(变量)来存储获取的数据库数据,以防止需要重复查询或返回相同数据的查询。
如果你不明白,下面是我博客中的一个例子:
我将把 Facebook 带到这个例子中,只是为了简化解释。假设我们正在为社交网络重新编码用户类。
class FBuser
{
}
这个类将包含的明显方法:
getStatusUpdates()
getAccountInfo()
getFriendIDs()
最初,这些方法都必须执行数据库查询,以获取所需的数据。但是使用缓存方法,我会定义一个类属性来存储缓存的数据,并且所有数据库查询都在一个方法中进行:
class FBuser
{
private $userCache = array();
private function getData( $dataToGet = '' )
{
//all of my db querying would happen here
}
}
但是在同样的方法中,如果允许的话,我也会寻找缓存:
private function getData( $dataToGet = '' , $useCache = true )
{
//am I allowed to use cache?
if ( $useCache === true )
{
//does the appropriate data exist in cache?
if ( isset($this->userCache[ $dataToGet ]) )
{
return $this->userCache[ $dataToGet ];//return the cached data, and forget about the DB queries
}
}
//if we get here, caching was disabled or the required data has not yet been cached :(
//all of my db querying would happen here
//store the data that's just been fetched by the queries in the cache property
}
这样,当我想从数据库中获取数据时,我可以调用getData( 'the data I want' , true );,允许我在可能的地方和时间使用缓存的数据。
因此,如果我需要多次调用getAccountInfo()、getStatusUpdates() 或getFriendIDs(),此方法将阻止执行多个数据库查询 = 有利于扩展(我认为)。
【问题讨论】:
-
缓存数据持久化在哪里?如果仅在财产方面-几乎没有意义。在一个页面请求期间执行相同请求的可能性很小。更有意义的是有一些快速的键值存储(如 memcached)并将检索到的数据存储在那里
-
另外 - 拥有
$useCache = true并不是一个好的设计。改用缓存装饰器。 -
但是不同的方法可能需要获取相同的数据。在此示例中,
getAccountInfo()需要获取与getEmailAddress()相同的数据。 -
这不值得。如果你想缓存数据 - 使用一些持久性存储。是的,将数据保留在属性中以供进一步使用也可能是一件好事,但真正的缓存将大大提高整体性能。因此,从“可扩展性”的角度来看 - 您的解决方案几乎毫无意义。所以我什至会同意你老师的观点
-
@zerkms 有一个观点,请参阅我的回答,我在其中扩展了他试图指出的内容。
标签: php performance caching scalability