簡體   English   中英

緩存jQuery檢索的數據

[英]Caching data retrieved by jQuery

我使用jQuery的$.ajax方法從API中檢索一些JSON。

每次加載頁面時,都會調用API,無論用戶之前是否已收到此數據 - 這意味着當頁面上有大量用戶時,API限制將生效。

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

這是一種可行的方法嗎? 有哪些替代方案?

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

不,不要在PHP中這樣做。 使用HTML5 LocalStorage緩存第一個請求,然后進行檢查。 如果您必須支持舊瀏覽器,請使用后備( 嘗試這些插件 )。

為了幫助區分意見和推薦的技巧,讓我們首先分解您的問題,以確保每個人都了解您的方案。

假設我們有兩台服務器:“服務器A”和“服務器B”。 將'Server A'稱為我們的PHP Web服務器,將'Server B'稱為我們的API服務器。 我假設您無法控制API服務器,這就是您單獨調用它的原因,並且無法根據您的需求並行擴展API服務器。 讓我們說它的第三方應用程序,如flickr或收獲或其他......讓我們說這個第三方API服務器每小時限制您的開發人員API密鑰請求,有效地限制您每小時150個請求。

當您的某個頁面加載到最終用戶瀏覽器中時,源代碼來自“服務器A”(我們的php服務器),並且該頁面正文中有一些很好的jQuery執行對服務器B的.ajax()調用'我們的API服務器。

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

在這種情況下,您可以執行以下操作:

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

總而言之,無論您采用何種緩存技術,都應該能夠向用戶顯示友好的服務不可用消息。 除此之外,您可以使用API​​響應的服務器端和客戶端緩存中的一個或兩個來減少影響。 服務器端緩存可以將重復請求保存到同一資源,而客戶端緩存可以保存同一用戶和瀏覽器對相同資源的重復請求。 鑒於所描述的場景,我會避免使用Html5 LocalStorage,因為您需要支持回退/填充選項,這使得內置請求緩存在大多數情況下都同樣有效。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM