2014-05-14 19 views
3

http://api.bitcoincharts.com/v1/markets.json(樣本爲例)如何緩存而不是訪問REST端點

我計劃訪問多個REST端點下面提到的數據,並在特定的時間訪問一些端點由於故障JSON數據連接錯誤或服務不可用。我只對數據的最後一個快照感興趣。爲了解決這個問題,我想將最新的快照存儲在數據存儲(最好是NoSQL)中,比如說Mongo或Redis,並且希望修改應用程序邏輯以便始終查看這些數據源,而不是API端點。這將始終提供可預測的數據,我打算運行一些CRON腳本來定期從這些REST端點提取數據並將其存儲在上述數據源中。

http://api.foo.com/v1/foo.json 
http://api.bar.com/v1/bar.json 
http://api.baz.com/v1/baz.json 
  1. 有沒有更好的辦法來解決這個問題?
  2. 什麼樣的存儲空間適合存儲JSON,並將其檢索以供處理。它是Mongo還是Redis?

回答

1
  1. 當你獲取首次從REST端點的數據,將數據存儲在緩存層,並返回到服務。 當你得到後續請求時,檢查數據是否存在於緩存中,如果數據不存在,則向REST發出請求並獲取數據。

    您需要提及將數據存儲在緩存層時的過期時間。這將阻止CRON作業,因爲不是一次獲取所有數據,而是隻在需要時才抓取它,此時檢查它是否已在緩存中過期。

  2. 我寧願redis,因爲它是最適合緩存層的之一。它是一個「NoSQL」鍵值數據存儲,它不像MongoDB這是一個基於磁盤的文檔存儲。與memcache類似,它可以在添加新數據時逐出舊數據。如果您希望高度可擴展的數據存儲由多個進程,多個應用程序或多個服務器共享,則Redis是一個絕佳選擇。與Memcache不同,Redis提供了強大的聚合類型,如排序集和列表。它有一個可配置的持久性模型,它可以在指定的時間間隔保存背景,並且可以在主從設置中運行。我們所有的Redis部署都運行在主從設備上,從設備每分鐘保存到磁盤。

    作爲一個進程間通信機制,它很難被擊敗。它的速度也使它成爲一個緩存層。

+0

您確定Redis是在Redis中存儲大型JSON對象的明顯選擇(如http://api.bitcoincharts.com/v1/markets.json)。是否有設計抽象可以用來實現緩存和對REST端點的相應查找。 – Rpj

+0

從你給JSON的樣本來看,其實並沒有那麼大。它可以支持高達512MB的字符串值。 http://stackoverflow.com/questions/5606106/what-is-the-maximum-value-size-you-can-store-in-redis –

9

您正在使用REST,因此基本上可以使用簡單的HTTP反向代理(例如,使用Apache HTTP,NGINX或Varnish)緩存HTTP請求/響應。爲什麼用NoSQL打擾一個簡單的緩存?

當然,MongoDB和Redis提供了更多的功能,但是你真的需要它們嗎?看看另外一個問題:Caching JSON objects on server side

0

如果你碰巧在使用Java,ehcache(http://ehcache.org/)是完美的解決方案。我們大量使用它來存儲大型json對象。緩存是通過xml配置的。它基本上是一個鍵/值存儲,並且可以爲每個鍵(緩存條目)獨立設置超時。它是一個單一的.jar文件。 CacheManager類處理所有細節。它只需要幾行代碼來實現。