2010-07-02 43 views
0

當前正在研究分佈式內存緩存解決方案,如Memcached和Microsoft的AppFabric緩存。在我看來,爲應用程序實現分佈式緩存的難點之一是爲散列確定合適的密鑰。確定跨應用程序域的代理的唯一性,用於散列分佈式內存緩存

一個簡單的方法是在您的應用程序中對散列鍵進行硬編碼,以便跨所有羣集節點的所有實例對同一數據使用相同的密鑰。

SQL選擇語句稍微不太天真的做法可能是在select語句本身上生成一個MD5。這些select語句可以由ORM動態生成,所以你不會被預定義的鍵所困住。

但是,如果您想基於.NET類中的某個委託的唯一性生成鍵,該怎麼辦?考慮以下內容:

public class MyExpensiveObject 
{ 
    MemCachedClient client = new MemCachedClient(); 

    public static MyExpensiveObject LoadAll() 
    { 
     MyExpensiveObject cached = client.Get<MyExpensiveObject >(Utility.GetKey<MyExpensiveObject>(LoadAllDelegate)); 

     if(cached == null) 
     { 
      cached = LoadAllDelegate(); 
      client.Store(Utility.GetKey<MyExpensiveObject>(LoadAllDelegate), cached); 
     } 

     return cached; 
    } 

    public static List<MyExpensiveObject> LoadAllDelegate() 
    { 
     // return a list of all MyObjects from SQL, or wherever 
    } 
} 

public static class Utility 
{ 
    public static string GetKey<TType>(Func<TType> func) 
    { 
     // How do I do this, such that each delegate returns the same Key value across application instances? 

     // I know this won't work, it seems to return same value within an app domain, but different app domains return different value (which I expected) 
     return func.GetHashCode().ToString(); 
    } 
} 

有沒有一種方法可以唯一標識一個委託,以便我們知道它們在應用程序域中是相同的東西?理想情況下,解決方案也適用於匿名函數和lamdas。

我爲月亮拍攝? :)

回答

-1

目前,似乎

func.GetType().GUID 

是每個功能獨特,但連續運行的應用程序之間的相同(開始 - >停止,並重新開始)。

我將繼續努力。請任何人在我的觀察中誤導我,讓我知道。

+0

這會給你任何具有不同實現的匿名函數的GUID。 – edgi 2011-03-18 19:47:53