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

前端之家收集整理的这篇文章主要介绍了php – 获取项目列表的更好方法:缓存序列化数据与数据库查询或其他?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经在文件( serialize/unserialise vs json_encode/decode,var_export,igbonary)和mySQL查询(优化,stored procedures,query cache)中进行了很多关于缓存数据的搜索,但是此时,我想知道优化具体案例的更好方法是什么,如下所示.

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

让我们假设我们有这种数据库关系.

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

> 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);
    }
}

我通过反序列化(file_get_contents($url))得到它们,这部分就像一个魅力!

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

>所有项目
>模块的项目
> CATEGORY的项目
> CATEGORY和MODULE的项目
> TAG的ITEM
> TAG和CATEGORY的项目
> TAG,CATEGORY和MODULE的项目

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

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

第一个问题:

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

是file_put_contents()的LOCK_EX吗?将从file_get_contents()获取文件时完成其工作; ?

第二个问题

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

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

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

附: :只是为了好玩,我可能会问“Facebook怎么样”和“stackoverflow怎么样”?

第一个问题:

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

第二个问题:

MysqL肯定会比你的缓存系统更快(除非你做一些严重的wicket编码而不是PHP). MysqL数据库在优化性能方面做了大量工作.

我不相信MysqL中的存储过程会在上面提供的示例中为普通的旧SELECT查询提供任何真正的好处.

如果在服务器群集上使用分片,使用像MongoDB这样的Nosql方法可以帮助您.这更难写,更多的服务器需要更多的钱.此外,从您的问题中不清楚是否可以选择移动到其他数据库系统.

如果您坚持使用MysqL,那么实现负载平衡应用程序服务器可能比数据库服务器集群更容易.考虑到这一点,PHP完成的更多工作比MysqL中的更多工作更受青睐.我不会遵循这种方法,因为你只是为了一个小的利益而放弃了很多.

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

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

Stackoverflow使用ASP.NET MVC和MS sql Server.他们有一个强大的数据库强大的服务器,显然他们可以尽可能地使用数据库查询.它们还使用与其数据库服务器分开的负载平衡应用程序服务器.

猜你在找的PHP相关文章