2011-11-07 48 views
3

我正在使用jQuery的$.ajax方法從API中檢索一些JSON。通過jQuery檢索緩存數據

每次頁面加載時,都會對API進行調用,而不管用戶是否已經在此之前接收過此數據 - 這意味着當頁面上有大量用戶時,API限制將生效。

我對如何處理這個問題的想法是首先將數據推送到數據庫(推送到PHP腳本),然後檢查數據庫以查看是否緩存了任何內容,然後再回到API以獲取更多如果需要最新的信息。

這是一種可行的方法嗎?有什麼選擇?

看起來jQuery實際上是一個障礙,而不是一開始就用PHP來完成,但是隨着我在學習語言,我想盡可能地使用它!

+1

爲什麼不在客戶端緩存數據?當然,假設使用HTML5 +本地存儲。 – vzwick

+1

或試試緩存:在您的參數中設置爲true to $ .ajax – Todd

+1

這可以解決每個用戶對每個頁面加載請求的問題,但是如果您有1,000個用戶/小時(純粹假設的),並且API的限制爲150個請求一個小時,然後我假設一些服務器端緩存是必需的? – Daniel

回答

3

爲了幫助區分意見和推薦技巧,我們先讓您解決問題,以確保每個人都瞭解您的情況。

假設我們有兩臺服務器:'服務器A'和'服務器B'。調用我們的PHP Web服務器'Server A'和我們的API服務器'Server B'。我假設你沒有對API服務器的控制權,這就是你爲什麼要單獨調用它的原因,並且不能按照你的需求來並行擴展API服務器。讓我們說它的第三方應用程序,如flickr或收穫或什麼...讓我們說這個第三方API服務器通過您的開發人員API關鍵字每小時限制請求,有效限制您每小時150個請求。

當您的一個頁面加載到最終用戶瀏覽器中時,源代碼來自「服務器A」(我們的PHP服務器),並且該頁面的主體中有一些不錯的jQuery,它執行.ajax()調用到'服務器B'我們的API服務器。

現在,您的開發者API密鑰每小時只允許150個請求,而假設您可能會在一小時內向您的「服務器A」PHP服務器看到1000個請求。那麼,假設我們不能簡單地擴展API服務器(如果可能,最好的選擇),我們如何處理這種負載差異。

這裏有一些事情你可以在這種情況下做的:

  • 就繼續正常,而當jQuery.ajax()返回一個503服務 不可用錯誤由於節流(大多數第三方的API做)禮貌地告訴你的最終用戶, 你正在經歷高於正常的流量,並在稍後再嘗試 。即使您還在 中添加了一些緩存,這也不是一個好主意。
  • 假設由API檢索的數據具有緩存功能,那麼您的 可以在您的PHP服務器上運行代理。當相同的ajax請求會隨着時間的推移重複返回相同的響應 時,這是特別好的 。 (例如:也許你正在爲一個對象提取一些描述 ,同一個對象請求應該在某段時間內返回相同的描述響應 )。這可能是PHP Pass through proxy或 較低級別的代理,如SQUID caching proxy。在PHP Pass through proxy的情況下,您可以使用「保存到數據庫或文件系統」策略進行緩存,甚至可以重新編寫expires頭文件以適應期望緩存生存期的級別。
  • 如果您已經確定響應數據是可緩存的,則您可以使用 緩存:true,允許客戶端也緩存ajax響應。 jQuery.ajax()實際上默認爲擁有緩存:true,因此您只需將緩存設置爲false即可緩存響應。
  • 如果您的響應數據很小,您可能會考慮將其緩存在一個 cookie中的客戶端。但經驗表明,大多數清除其臨時文件 的用戶也將清除他們的Cookie。所以也許內置jQuery.ajax()的緩存同樣好?
  • 用於客戶端緩存的HTML5本地存儲很酷,但缺乏廣泛流行的支持。 如果您控制您的用戶羣(例如在公司環境中),您可能會要求使用符合HTML5的瀏覽器。否則,您的 可能需要基於Cookie的回退或填充缺少 HTML5本地存儲的瀏覽器。在這種情況下,您可能會重新考慮上面的其他選項。

總而言之,無論您使用哪種緩存技術,您都應該能夠向用戶展示友好的服務不可用消息。除此之外,您可以使用API​​響應的服務器端和客戶端緩存中的一個或兩個緩存來降低影響。服務器端緩存保存對同一資源的重複請求,而客戶端緩存則保存同一用戶和瀏覽器對同一資源的重複請求。鑑於描述的場景,我會避免使用Html5 LocalStorage,因爲您需要支持fallback/polyfill選項,這些選項使內置的請求緩存在大多數場景中同樣有效。

正如你所看到的,與從PHP服務器端調用API服務器相比,jQuery不會真的爲你改變這種情況。如果您在服務器端使用PHP執行API調用,而不是通過客戶端的jQuery.ajax()執行API調用,則可以應用相同的緩存技術。當您的容量過大時,應該以某種方式實施同樣友好的服務不可用消息。

如果我誤解了你的問題,請隨時發表評論,澄清和/或編輯你的原始問題。

+0

您描述的情況與我所處的情況完全相同。我基本上從API中提取數據,每隔幾個小時就會更改一次,並且不需要那麼準確。 – Daniel

+0

現在,我將僅僅使用localStorage,這決不是一個商業項目,或者將被超過一小撮人使用的項目。但是謝謝你的解釋,不管:)在接下來的8小時內會獎勵。 – Daniel