2012-01-25 58 views
1

我正在開發部署在Google應用引擎上的基於Spring的Web應用程序。 我有一個經理,在應用範圍內存儲數據。我使用的是一個彈簧bean(singleton),它擁有一張地圖,並簡單地執行get和remove從地圖,然而GAE是一個分佈式環境,這種設計有一個問題,因爲每個應用程序實例將有自己的經理和請求不是保證對相同的應用程序實例進行。 所以我環顧四周,發現2可能的解決方案:Google應用引擎和應用範圍數據

  1. 使用數據存儲
  2. 使用的memcache

存儲數據會造成大量的讀取和寫入,並最終我不需要要保存的數據。 第二看起來前途無量,但谷歌提到:

一般情況下,一個應用程序不應指望緩存值始終可用。

我需要一個保證,當我讓我的管理員獲得一個值時,它會返回它。

有沒有其他解決方案? 我錯過了什麼?

+0

這是什麼類型的數據?它有多少?它多久更換一次? –

+0

這是一個多玩家遊戲地圖,每個元素都是一個可以保持該遊戲中所有玩家狀態的遊戲(最多5個玩家)。數據每秒鐘都會頻繁地讀取,並且每隔5秒左右更新一次。在大小方面它不是很大,在最大它將小於1MB –

回答

2

一個常見的解決方案是將值存儲在由數據存儲支持的memcache中。

首先從memcache中獲取應用程序範圍值,如果memcache返回零結果(cache-miss事件),則從數據存儲中獲取值並將獲取的值放在memcache上。

通過這種方式,memcache的下一次獲取將返回您的應用程序範圍數據,從而減少了對數據存儲的相對昂貴讀取的需求。

App Engine memcache是​​最近使用最少的高速緩存,因此經常讀取的值會因少數高速緩存未命中事件而受到影響。

具有應用程序範圍值的更復雜解決方案是將駐留內存中的值存儲在駐留的後端,並讓所有其他實例通過servlet處理程序向/從該特定後端請求/更新值。

+0

好吧,我只是這樣做。使用dao圖層的memcache infront。 –

+0

如果有幫助,你能接受答案嗎?如果您想接受答案,請點擊答案左側的虛線複選標記。它會變成一個綠色的複選標記。 –