2014-09-30 60 views
1

我有一個類方法(放置在/app/lib/),直到接收到一個結果,其執行一些重計算和子http請求。導軌 - 如何緩存數據服務器使用,服務於多個用戶

結果是不是太動態的,並且由多個用戶訪問所述應用程序特定視圖請求。因此,我想安排定期運行該方法(使用cron和Whenever Gem),將結果存儲在服務器的某個地方,使用JSON格式,並根據需要將結果單獨讀入視圖。

這是如何實現的? 正確這樣做的方式是什麼?

我目前有:

def heavyMethod 
    response = {} 
    # some calculations, eventually building the response 
    File.open(File.expand_path('../../../tmp/cache/tests_queue.json', __FILE__), "w") do |f| 
     f.write(response.to_json) 
    end 
end 

,並也有相應的方法來讀取該文件。

我搜查,但沒有找到實現這一使用Rails緩存約定(而不是我寫了一些私有代碼)的例子,在未與ActiveRecord的相關數據。

謝謝!

+1

軌高速緩存 - 。memcached.'cache.set'在烏爾週期性工作,'cache.get'在烏拉圭回合請求ü需要小心發生了什麼在冷啓動。 U可能希望在服務器啓動時運行該過程,或者可以這樣做,以便視圖在缺少條目時運行它。但這對於經驗不利 – 2014-09-30 05:38:56

+1

[Rails指南](http://guides.rubyonrails.org/caching_with_rails.html#cache-stores)提供了許多緩存方法,您也可以使用redis或memcache爲您保存json數據,它閱讀文件可能會更快。 – dddd1919 2014-09-30 06:47:32

+0

@KarthikT,非常感謝這兩個答案。事實上,我希望沒有任何用戶會體驗該方法的加載時間。即,我想每15分鐘執行一次後臺作業,緩存它,並在我的rails視圖中獲取緩存結果的數據。另外,對於冷啓動,在服務器啓動時運行似乎確實是一個更好的主意(使用rake任務或從實例初始化程序調用該方法)。你可以用一個例子說明如何使用memcached方法實現這個答案嗎? – cyber101 2014-09-30 10:14:06

回答

1

您的解決方案應該可以正常工作,但使用Rails.cache應該是更清潔,更快一點。 Rails guides提供有關Rails.cache足夠的信息,以及如何得到它與memcached工作,讓我總結一下我怎麼會用它在你的情況

方法重載

def heavyMethod 
    response = {} 
    # some calculations, eventually building the response 
    Rails.cache.write("heavy_method_response", response) 
end 

請求

response = Rails.cache.fetch("heavy_method_response") 

這裏唯一的問題是,當第一次啓動ur服務器時,緩存將是空的。此外,如果/當memcache重新啓動。

一個優點是某處的流動,U傳中的數據整理入庫,然後unmartialled的出路。意思是你可以傳入複雜的數據結構,並且不需要手動序列化爲json。

編輯:如果內存用完memcached的將清除您的項目。自從使用LRU(我認爲)算法來使事情過期以來,這將非常罕見,並且我認爲你會經常使用它。 爲了防止這種情況,

  1. 設置比當前的cron期expires_in較大,
  2. 變化中的抓取代碼調用heavy_method如果烏拉圭回合獲取失敗(如Rails.cache.fetch("heavy_method_response") {heavy_method},並改變heavy_method只返回對象。
  3. 使用類似redis,不會刪除項目
+0

感謝您的回答! 只是爲了確保 - (1)再次調用此方法將使用更新的信息刷新商店緩存? (2)'fetch'方法有可能失敗嗎?或者一旦這個方法運行在服務器啓動時,主服務器會一直存在,直到服務器關閉? 謝謝, – cyber101 2014-10-01 08:50:57

+0

如果memcached發生故障,或者如果你沒有使用memcached,無論你使用什麼緩存,它都會失敗。不要使用每個進程 – 2014-10-01 10:02:58

+0

的本地缺省內存存儲cuz,並且對於(1)q – 2014-10-01 10:03:31