2014-02-24 107 views
0

我打電話從服務器的API方法:如何緩存API調用的結果?

def get_data 
    #......... 
    get_some_data_from_server 
end 

我想緩存此調用的結果,很明顯。所以,我在一個表中創建一個字段,改變了get_data看起來像這樣:

def fetch_data 
    key = get_cache_key 
    Rails.cache.fetch key, expires_in: 500.minutes do 
     get_some_data_from_server 
    end 
    end 

get_some_data_from_server結果不經常變化,這幾乎是相同的所有的時間。但它可能會隨着時間的推移而變化,即使在500分鐘過去之後,即使在之前也是如此。因此,用戶可能會從緩存中收到過期的數據。

這個策略是否合理?我該如何處理get_some_data_from_server隨時間變化?

回答

1

如果它已經改變,那麼密鑰應該改變。理想情況下,您希望您的密鑰在某些部分反映其所代表數據的獨特之處。例如,

在請求的情況下。如果您提出的請求包含兩個日期,則需要在兩點之間接收數據。我的密鑰將包含這兩個日期,所以每次我請求來自不同日期範圍的數據時,它都不會使用相同的緩存密鑰。

在請求總是相同的情況下,應該有一種方法來確定api是否發生了變化,可能是通過一個比較便宜的api調用。如果這個調用說新數據可用,那麼你應該清除該密鑰的緩存並請求新數據。

在提出請求之前,檢查數據是否發生更改的一種方法是使用ETag和條件獲取。詳細說明可以在這裏http://fideloper.com/api-etag-conditional-get

+0

如果它的變化改變了,那麼關鍵應該改變。 - 沒有爲什麼?它是持久的。 –

+0

你的鑰匙決定你是否應該提出要求。因此如果請求參數改變,你的密鑰應該改變。我不知道get_some_data在做什麼樣的請求。 – Senjai

+0

你怎麼知道我的鑰匙是什麼決定的?它不依賴於API或其他任何結果。請求get_some_data進行api調用。該鍵看起來像「my_api_call _#{current_user.id}」。 –