2011-03-22 77 views
1

假設我有一個我正在打開(消耗)每個頁面負載的天氣web服務。效率或智能不是很高,可能會超過我的API限制或讓網絡服務所有者發瘋。因此,我沒有直接從控制器動作中獲取數據,而是有一個輔助/作業/方法(某一層),有機會緩存​​數據。我們還要說,我不太關心數據的實時性。在使用web服務時緩存

現在我過去所做的只是將來自天氣服務的屬性存儲在表格中,並且每隔一段時間刷新一次數據。例如,氣象服務可能是這樣的:

Weather for 90210 (example primary key) 
----------------------------- 
Zip Name: Beverly Hills 
Current Temperature: 90 
Last Temp: 89 
Humidity: 0 
... etc. 

因此,在這種情況下,我會爲每個屬性創建列,並將其儲存當我從web服務獲取。我可以有一個到期的導軌操作(頁面緩存)來進行刷新,或者我可以做一個後臺工作。

這個簡單的方法運行良好,除非web服務具有大量的屬性(比如1000)。現在我花了很多時間來創建和維護數據庫列,重複其他人已有的屬性。如果我可以簡單地緩存整個響應並在需要時將其稱爲簡單哈希,那麼最好的做法是。然後,我將所有屬性緩存爲web服務提供的「免費」,因爲Web服務的所有功能都將位於我的哈希中,而不僅僅是緩存子集。

要做到這一點,我可能會獲取Web服務響應,序列化它(YAML也許),然後獲取序列化的對象,如果它存在。呃,不是很好。序列化可能會出現特殊字符。如果我可以遵循一個memcached類型模型,但是我不認爲你可以在memcached中存儲複雜的對象,那真的很酷嗎?我還想限制引入的軟件數量,因此獨立代理層會不太理想。

任何人做過類似的事情或者有一個這樣的名字?

+0

是否有一個原因,爲什麼像將主鍵提取到其列並將另一列中的整個響應轉儲不起作用一樣簡單? – 2011-03-22 14:52:08

+0

好吧,我想避免一個blob,並有更結構化的東西。 – squarism 2011-03-22 15:38:52

+0

我在這裏失蹤的單詞「博客」有一些隱藏的含義嗎? – 2011-03-22 15:41:45

回答

4

如果您正在使用的API是RESTful並尊重緩存,請勿重新發明輪子。 HTTP內置了緩存(請參閱RFC 2616),所以儘可能使用它。你有兩種選擇:

  1. 只需在你的應用和API之間粘貼一個squid代理,就完成了。
  2. 使用Wrest - 我們寫它支持HTTP 2616緩存,它是我知道的唯一的Ruby HTTP包裝。

如果API不尊重緩存(大多數情況下),那麼您收到的其他建議是有道理的。你實際使用什麼來保存你的緩存(mongodb/memcached/whatever)取決於一系列其他因素,這真的取決於你的情況。

+0

嘿很酷,感謝Ruby的lib鏈接,從來沒有聽說過2616。 – squarism 2011-03-23 17:25:45

1

您可以使用MongoDB(或另一個JSON數據存儲)並以JSON的形式獲取API的結果,並將結果存儲到您的mongo集合中。然後獲取您關心的數據和屬性,並忽略其餘部分。

對於您的天氣API調用,您可以檢查您的mongo集合中是否存在該城市,以及是否通過API獲取(然後以mongo存儲)。

這將是對Rails.cache模式的修改。

+0

是的。這是個好主意。當人們說mongo可能是memcached的替代品時,這就是人們的意思嗎? – squarism 2011-03-22 15:39:30

+0

取決於你如何使用memcached,但是,在這種情況下是的。對於其他形式的數據(序列化數據和需要非常快速的操作),我認爲memcached仍然是一種方式 – 2011-03-22 16:02:57

+0

您不需要MongoDB來緩存一塊JSON。任何K/V商店都可以。我們使用memcached和redis。 – Matthias 2012-01-03 14:55:05