获取项目列表的更好方法:缓存序列化数据与数据库查询或其他?

Val*_*lky 8 php mysql caching

我已经做了大量关于缓存文件中数据的搜索(serialize/unserialise vs json_encode/decode,var_export,igbonary)和mysql查询(优化,存储过程,查询缓存),但此时此刻,我想知道更好的方法是什么优化具体案例,如下所示.

提前抱歉:我想这是一个很长的话题,但是有必要了解这个项目.请原谅我糟糕的英语,这不是我的第一语言.

让我们假设我们有这种数据库关系. 在此输入图像描述

数据库的描述(括号中估计的记录数):

  • MODULE(10):是项目的类型,可以是文章,论坛主题,广告,新闻......
  • ITEM(百万):任何带有标题和一些文本的类型
  • 类别(50):项目类别(动物,政治,汽车,电脑......)
  • 标签(数十万):类别的标签(例如政治:国际,法国,巴拉克奥巴马......)
  • ITEM_TAG(outch):项目和标签关联

所以我们有几个关系,每个都是ITEM创建/更新的记录器.

我已经使用以下示例在文件夹和文件中缓存了ITEM数据:

public function cacheItem()
{
    $req=mysql_query("SELECT id, title, content, id_mod, id_cat
            FROM ITEM
            WHERE ITEM.id='".$this->id."'")or die(mysql_error());
    if(mysql_num_rows($req)==1)
    {
        $this->itemData=mysql_fetch_array($req);
        $this->folder=floor($this->id/1000);//1000 items max per folder
        $this->itemUrl=$this->folder."/".$this->id.".txt";                      
        if(!file_exists($this->itemUrl))
        {
            touch($this->itemUrl);
        }
        file_put_contents($this->itemUrl,serialize($this->itemData),LOCK_EX);
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到了它们unserialize(file_get_contents($url)),这部分就像一个魅力!

现在我希望优化ITEM列表以通过几个选项(例如)显示它们,foreach显示每个分页限制为100:

  • 所有项目
  • 模块的项目
  • 类别的项目
  • CATEGORY和MODULE的项目
  • 标签的项目
  • TAG和CATEGORY的项目
  • TAG,CATEGORY和MODULE的项目

我已经知道如何在SQL中执行此操作并将结果放在缓存树中.

使用这些缓存文件的问题是,当创建/更新新的ITEM时,可能必须以非常严格的方式刷新列表.

第一个问题:

那么,如果同时创建/更新ITEM(那些列表也是如此)会发生什么?

是否LOCK_EXfile_put_contents();,而从获得的文件将做他的工作file_get_contents();

第二个问题

我知道更多的PHP会工作,更少的mySQL会(和其他方面),但是更好(显示更快)的方式来做这些带有分页的列表,每秒钟或更多时间显示,并且只能通过添加/来修改更新新的ITEM?

  • 我的缓存系统(我不这么认为......)
  • mySQL中的存储过程
  • 多个数据库服务器和/或多个文件服务器
  • 其他

任何想法,例子,链接都非常感谢.

PS:只是为了好玩我可能会问"Facebook怎么样"和"stackoverflow怎么样"?

nee*_*lsg 2

第一个问题

您的操作应该没问题LOCK_EX。如果同时访问这些文件可能会被锁定,这肯定会减慢速度,但所有操作都应该正确完成。然而,这是一个很好的例子,说明为什么您不应该实现自己的缓存系统。

第二个问题

MySQL 肯定会比你的缓存系统更快(除非你做了一些认真的 wicket 编码而不是 PHP)。像MySQL这样的数据库在优化性能方面做了很多工作。

我不相信 MySQL 中的存储过程会给您带来上面提供的示例中比普通旧的任何真正的好处SELECT查询的任何真正好处。

如果您在服务器集群上使用分片,那么使用 MongoDB 等 NoSQL 方法可以为您提供帮助。这更难编写,而且更多的服务器花费更多的钱。此外,从您的问题中还不清楚是否可以选择迁移到不同的数据库系统。

如果您坚持使用 MySQL,那么实现负载平衡应用程序服务器可能比数据库服务器集群更容易。考虑到这一点,PHP 完成的更多工作优于 MySQL 中的更多工作。但我不会遵循这种方法,因为你为了一点点的好处而放弃了很多。

简而言之,我建议您坚持使用简单SELECT查询来获取您需要的内容。在不同的服务器上运行应用程序和数据库,并使用功能更强大的服务器作为数据库服务器。

附言。Facebook 为 PHP 编写了一个预编译器,以使他们的代码运行得更快。在我看来,PHP 不是一种非常快的语言,您可以从 Python 或 Node.js 获得更好的结果。

Stackoverflow 将 ASP.NET MVC 与 MS SQL Server 结合使用。他们有一个强大的数据库服务器,并且显然更愿意尽可能地使用数据库查询。他们还使用与其数据库服务器分开的负载平衡应用程序服务器。