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。
我爲月亮拍攝? :)
這會給你任何具有不同實現的匿名函數的GUID。 – edgi 2011-03-18 19:47:53