2017-04-05 54 views
1

我有一個rails 4.1應用程序,其中我有一個預訂部分。在本節中,我有多個子部分,例如酒店,度假租賃等。如何緩存每個用戶在rails中的外部API響應?

在這些部分的每一節中,我都會從相關的apis中提取數據,供用戶進行排序和過濾。

我想緩存每個用戶的響應,這樣一旦我得到了數據,過濾&排序是快速的緩存數據和時間不浪費在另一次去另一個網站。

但是一個問題是用戶可以做到這一點,即使沒有登錄。

我已經安裝memcached的商店,其緩存數據以精爲先用戶,但是,當第二個用戶來爲第一用戶數據被覆蓋。

如何緩存每個用戶的數據(logggd/unlogged)? (我願意改變緩存存儲,只要我不需要花費任何額外的工作)

+0

你檢查Redis的? –

+0

Can Redis可以保存未登錄用戶的特定用戶數據嗎? – RamanSM

回答

1

Rails實際上支持每個用戶開箱即用的「緩存」。它被稱爲會議。默認情況下,Rails使用cookie作爲存儲器,但是您可以輕鬆地交換存儲以使用Memcached或Redis來繞過瀏覽器施加於cookie的〜4kB大小限制。

用Rails與memcached的作爲存儲後端使用Dalli gem

# Gemfile 
gem 'dalli' 

# config/environments/production.rb 
config.cache_store = :dalli_store 

這將讓你存儲由相當多的東西:

session[:foo] = bar 

和會話值可以取,只要因爲用戶保留了包含會話ID的cookie。

如果您想保持使用CookieStore進行會話的性能優勢,可以使用會話ID作爲用於在Memcached中緩存請求的密鑰的一部分,從而爲每個用戶提供單獨的緩存。

您可以通過在控制器中調用session.id來獲得會話ID。

require 'dalli' 
options = { :namespace => "app_v1", :compress => true } 
dc = Dalli::Client.new('localhost:11211', options) 
cache_key = 'foo-' + session.id 

@data = dc.fetch(cache_key) do 
    do_some_api_call 
end 

您也可以使用視圖片段和普通導軌低級高速緩存來執行此操作。請注意,模型不是會話感知的。

請參見:

+0

僅限登錄用戶的導軌會話。即使是未登錄的用戶,我是否可以保存用戶特定的數據如果是,MB/KB的限制是多少? – RamanSM

+0

否會話是將Cookie與ID鏈接到會話存儲的簡單機制。除非您已禁用會話中間件,否則每個訪問者都有會話 - 無論您是否具有「登錄」用戶身份的驗證系統。如果事實上該會話只是構建基於會話的身份驗證系統(如Devise)的構建塊。 – max

+0

限制完全取決於正在使用的會話存儲。Cookie的限制約爲4kb,但可能因瀏覽器而異。 memcached和redis的限制較大,但完全取決於服務器配置。我會建議你閱讀我鏈接到的兩篇文章。 – max

相關問題