我在VPS上运行应用程序(基于PHP& MySql)。我有文章表,其中有数百万条记录。每当用户登录时,我都会显示每个部分的最后50条记录。
所以每次使用登录或刷新页面时都会执行sql查询来获取这些记录。现在网站上有很多用户,因为我的网页速度已大幅下降。
我做了一些关于缓存的研究,发现我可以根据section,no读取mysql数据。例如(第1条和第1条 - 第50条)。将其存储在磁盘文件缓存/ md5(部分号)中。
然后将来当我收到该部分的请求时,只需从cache / md5获取数据(部分号)。
以上解决方案看起来很棒。但在我开始之前,我真的想澄清一下专家们的疑虑。
提前谢谢
此致 拉吉
答案 0 :(得分:0)
我遇到了同样的问题,每个页面加载导致运行2个以上的查询。值得庆幸的是,他们的查询非常相似,因此缓存(如您的情况)非常有用。
您有几个选择:
将数据库卸载到同一网络上的单独VPS,以根据需要上下扩展
缓存来自每个查询的数据,并在点击数据库之前尝试从缓存中检索
最后我们选择了两者,安装Memecached及其php扩展用于查询缓存。 Memecached是一个键值存储(很像PHP的关联数组),其存储的每个值都以秒为单位设置到期时间。由于它将所有内容存储在RAM中,因此易失性高速缓存数据的权衡是非常快的读/写时间,远远优于文件系统。
我们的实现基本上是通过过滤器运行每个查询;如果是select语句,则通过将memecached键设置为“namespace_ [md5 of query]”来缓存它,并将值设置为包含所有结果行的数组的序列化版本。缓存120秒(3分钟)应该足以帮助解决服务器负载问题。
答案 1 :(得分:0)
如果Memecached不是一个可行的解决方案,请将每个部分的所有50篇文章存储为RSS源。您可以一次性提取所有文章,使用SimpleXML抓取每篇文章的内容,并根据网站设计将其包装在网站的文章模板HTML中。一旦数据存在,使用CSS样式仅显示X文章,使用JavaScript进行分页。
由于两个进程同时修改同一个文件是一个坏主意,因此向一个部分添加一个新故事会触发一个事件,这会将故事添加到消息队列中。该消息队列将由一个工作人员处理,该工作人员使用SimpleXML执行两个连续的操作:
删除XML文件末尾最旧的故事
将消息队列中的新故事添加到XML文件的顶部
如果您愿意,根据部分提供的RSS Feed可以是一个面向公众的功能。