2011-05-05 34 views
6

假設我有一組用戶。每個用戶都有一個USER_ID用戶名Tenant_ID緩存對象集合的最佳方法。一起或作爲單獨的項目?

有時我需要的所有用戶特定Tenant_ID
有時候,我需要一個特定的用戶基礎上USER_ID」。
有時候,我需要根據用戶名用戶。

我會永遠可用的Tenant_ID作爲查找的一部分使用。

實現此數據緩存層的理想方法是什麼?
因爲我正在處理多租戶系統,所以我應該做些什麼?
管理所有可能的緩存鍵的最佳方法是什麼?

選項#1:存儲所有用戶一起「Tenant_1_Users」

與此問題的一個關鍵是下,我會大量無用數據,通過線路傳輸。如果我只需要找到一個特定的用戶,那麼我需要在檢索整個集合後使用LINQ或其他東西在代碼中進行查找。

選項2:在不同的鍵(例如「TenantID_1_UserID_5」和「TenantID_1_Username_Jason」)下複製相同的用戶對象。

這裏的問題是管理所有不同的密鑰和用戶對象的位置。特別是如果我需要刷新特定用戶,因爲它已在數據庫中更新。我現在需要知道它可以存儲的所有可能的位置。由於同一個用戶可以使用不同的密鑰,因此也使用更多的內存。

相關:AppFabric Cache 'Design' - Caching Individual Items or Collections?
問題是,Azure AppFabric緩存不支持區域,標記或通知。

回答

4

對於它的價值,我傾向於不希望在多個密鑰下緩存相同的對象,因爲如果以後需要更新或刪除該記錄,則必須記住更新/刪除所有可能的密鑰它可以使用。

+1

對,這絕對是數據重複最大的問題之一。 – Vyrotek 2011-05-05 19:07:02

2

在過去,我已經添加項目到單獨的緩存,鍵控緩存關閉記錄的主鍵。然後,在需要的地方,我維護了一個字典對象,它可以快速查找基於其他值的主鍵。當我需要這個時,我會創建一個自定義集合類,它包裝了維護字典的所有邏輯,查找從緩存過期的記錄,搜索從未添加到緩存的記錄,提供用於檢索項目的訪問器它們的各種值等這種結構使得它使每個數據項可以不考慮收集的其餘部分與它分別到期,但我的字典還是會保持它的按鍵屬於與二次值的列表,以便我能恢復過期無論使用哪個訪問器來請求它,都可以很容易地找到它。

不能說這一定是最好的方式,但它似乎也降低前往數據存儲,而不陷入泥淖的應用服務器,因爲它在內存過多擠滿工作。當我開發這種技術時,我正在使用標準的ASP.NET和SQL後端,但我無法看到它無法轉換爲雲環境的任何原因。

1

在這種情況下,我會忍不住做這樣的事情:

List<User> users = [list of users] 
Dictionary<string,int> userIDLookup = ... 
Dictionary<string,int> tennantIDLookup = ... 
Dictionary<string,int> usernameLookup = ... 

這有被緩存與多個查找字典提供的索引,列表中的單個對象的好處。你可以將其封裝在一些很好的方法中,比如GetUserFromName(string username)等等......以便在代碼中使用它。也許都放在一個UserCache類中,以便您可以實例化緩存並調用其上的查找方法。

相關問題