В настоящее время изучаются решения для кэширования распределенной памяти, такие как Memcached и Microsoft AppFabric. Мне кажется, что одним из трудных препятствий в реализации распределенного кэша для приложения является определение соответствующих ключей для хэша.
Наивный подход заключается в том, чтобы жестко закодировать хеш-ключи в вашем приложении, чтобы все экземпляры на всех узлах кластера использовали один и тот же ключ для одних и тех же данных.
Немного менее наивным подходом для операторов выбора SQL было бы, возможно, создать MD5 на самом операторе выбора. Эти операторы выбора могут динамически генерироваться 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();
}
}
Есть ли способ уникальной идентификации делегата, чтобы мы знали, что это одно и то же в доменах приложений? В идеале решение должно работать и для анонимных функций, и для лямд.
Я стреляю в луну? :)