寻找API优化建议



在过去,我问了一些关于如何创建我自己的API来允许外部站点访问我存储在数据库中的db的问题。这个问题是关于如何优化外部站点的API访问以帮助降低本地服务器负载的建议。首先,API的设置方式是使用MySQL保存数据,使用php提供数据。API本身由URL调用,URL中有一个API密钥。例如:

http://mysite.com/get_listings.php?key=somekey

然后我的脚本做它需要做上面的动作,然后返回json格式的结果。目前,该API每月提供10-15k个唯一调用,我正在添加另一组网站,这些网站将在API现在提供的基础上每月提供另外20-30k个唯一调用。没有缓存正在进行,它只是通过php脚本直接调用我的API,并且每次调用都会查询MySQL数据库。它返回的数据类型基本上是故事和个人资料信息,调用是最新的故事,故事作者的个人资料和故事细节。

除了php代码的正常优化和优化MySQL查询和索引,你能建议任何其他优化技术,可以帮助保持服务器负载下降,仍然服务于外部网站的API快速?我知道外部站点本身也应该在它们的终端上做一些缓存。但在我的结束,你建议缓存结果从数据库然后服务缓存?如果是这样,使用memcache是一个好的选择吗?或者将json结果存储在redis中?或者一个简单的文件缓存系统就可以了?除了缓存之外还有什么?显然,服务器硬件会有所不同,但这超出了本文的讨论范围。我会说,虽然我将得到一个全新的服务器,将专门做这个。

如果有帮助的话,我有安装其他软件的root权限。

除非你有能力用额外的只读节点扩展mysql,否则你应该开始使用Redis或Memcached。Redis可能更擅长处理复杂的数据类型。这是一个食谱。

  1. https://github.com/nicolasff/phpredis -安装这个,它将帮助你从PHP无缝地与Redis接口。
  2. 按特定键对请求进行分类。例如get_listings.php?key=somekey可能使用$redis->hget('listings',$somekey);
  3. 存储结果序列化或JSON。
  4. 当数据库更新时,一定要销毁或更新Redis中的相关索引。如果您使用后端MVC,那么模型行为处理程序可以为您做。例如,当新的评论发布时,更新Redis排序列表。
  5. 你可以混搭不同的结构。例如,从排序列表中获取键,然后从哈希中提取实际数据。

如果你使用redis作为永久存储,确保你的PHP知道如何清理它。在我的经验中,它被证明是相当有弹性的,尽管我仍然在MySQL中存储数据。

如果你了解计算的复杂性,Redis是很好的。

最新更新