php – 获取项目列表的更好方法:缓存序列化数据与数据库查询或
我已经在文件(
serialize/unserialise vs json_encode/decode,var_export,igbonary)和mysql查询(优化,stored procedures,query cache)中进行了很多关于缓存数据的搜索,但是此时,我想知道优化具体案例的更好方法是什么,如下所示.
提前抱歉:我想这是一个很小的答案的长话题,但是有必要了解这个项目.请原谅我可怜的英语,这不是我的第一语言. 让我们假设我们有这种数据库关系. 数据库的描述(括号中估计的记录数): > MODULE(10):是项目的类型,可以是文章,论坛主题,广告,新闻…… 所以我们有几个关系,每个关系都是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: >所有项目 我已经知道如何在SQL中执行此操作并将结果放在缓存树中. 使用这些缓存文件的问题是,当创建/更新新的ITEM时,可能必须以非常严格的方式刷新列表. 第一个问题: 那么,如果同时创建/更新ITEM(那些列表也是如此)会发生什么? 是file_put_contents()的LOCK_EX吗?将从file_get_contents()获取文件时完成其工作; ? 第二个问题 我知道更多的PHP可以工作,而不是mySQL(和其他方面),但是更好(显示更快)的方式来做这些带分页的列表,每秒钟或更多时间显示,并且只能通过添加/来修改更新新的ITEM? >我的缓存系统(我不这么认为……) 任何想法,例子,链接都非常感谢. 附: :只是为了好玩,我可能会问“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.他们有一个强大的数据库强大的服务器,显然他们可以尽可能地使用数据库查询.它们还使用与其数据库服务器分开的负载平衡应用程序服务器. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |