2010-04-09 58 views
0

我目前正在使用CouchDB和RESTlet實現REST Web服務。所述的Restlet層是主要用於認證和通過CouchDB的服務的JSON數據的一些過濾:緩存身份驗證數據

客戶< = HTTP => [的Restlet < = HTTP =>的CouchDB]

我使用的CouchDB還存儲用戶登錄數據,因爲我不想爲此添加額外的數據庫服務器。因此,對我的服務的每個請求都會導致由RESTlet執行的兩個CouchDB請求(auth數據+「真實」請求)。爲了儘可能保持服務效率,我想減少請求的數量,在這種情況下請求登錄數據。

我現在的想法是在緩存登錄數據的RESTlet應用程序中提供一個緩存(即通過LinkedHashMap的LRU緩存),因爲HTTP緩存可能不夠。但是,例如,一旦用戶更改密碼,我如何使緩存數據無效。由於REST,應用程序可能會並行運行在多個服務器上,我不想創建一箇中央實例來緩存登錄數據。

當前,我將請求的auth數據保存在緩存中,並嘗試使用它們來驗證新請求。如果身份驗證失敗或現在有條目可用,我將向我的CouchDB存儲發送一個GET請求,以獲取實際的身份驗證數據。 因此,在最壞的情況下,已更改其數據的用戶可能仍能夠使用舊憑證登錄。我該如何處理?

或者什麼是一個好的策略來保持緩存(s)最新一般?

在此先感謝。

回答

1

對我來說,看起來你已經長大到足以使用一些「專業」緩存解決方案(例如EHCache)。所有分佈式緩存允許在不同節點之間進行新的數據複製&失效,因此您的問題已經解決。

+0

感謝您的回答,我正在看看EHCache。我不確定額外的開銷是否由我的使用證明是合理的。也許我會緩存每個實例的所有條目,並給他們一個額外的租約。 – 2010-04-11 09:32:09

+0

正如您接受我的回答,是否意味着您正在切換到EHCache?只是好奇。 – mindas 2010-04-14 11:21:23

1

像memcached這樣的分佈式內存緩存可能就是您要查找的內容。您可以配置對象時代,緩存大小,並公開回調以從緩存中移除特定對象(如信息陳舊時)。

+0

感謝您的回答,顯然沒有集中式實例就沒有解決方案(分佈式緩存也是某種集中式實體)。 – 2010-04-11 09:30:44