2011-09-12 115 views
1

在過去,我曾問如何創建自己的API,允許外部網站訪問我的分貝我存儲在數據庫中的一些問題。這個特別的問題是,我要求提供關於如何優化外部網站的API訪問以幫助保持本地服務器負載下降的建議。首先,API的設置方式是使用包含數據和php的MySQL來提供數據。 API本身由URL中帶有API密鑰的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權限才能安裝額外的軟件,有沒有什麼幫助。

+0

50K沒什麼。不要擔心。 –

+0

@OZ_其實如果這個其他地方的跡象可能會跳到一百萬以上。主要目的是試圖找到一個現在可以正常運行的解決方案,但也可以擴展以處理更多問題。 – John

回答

3

除非你有規模有額外的只讀節點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中。

如果您瞭解computation complexities,Redis非常棒。每月

+0

感謝您的信息!問題是,當站點訪問api並且我的代碼正在使用新數據更新redis條目時,有沒有「衝突」的機會?你也建議使用mysql授權api訪問權限或將該信息存儲在redis中? – John

+0

Redis正在使用阻止功能,甚至允許交易。我會建議從你最需要的API中徹底清除MySQL,那麼它不會是一個瓶頸。即使您持有緩存一分鐘,Redis的效率也會更高。 – romaninsh

+0

好的,有什麼具體的設置我應該調整,以進一步優化redis,你推薦?或者開箱即用的設置很不錯? – John