Вне всякого сравнения был предложен неоднократно мне.
public T GetFromCache (строковый ключ, Func ifKeyNotFoundDelegate )
, чтобы гарантировать, что кэш всегда используется одинаково. [1] Ну, это касается большей части того, что мы делаем на нашем веб-сайте (кластер memcached размером 20 ГБ, распределенный по 20 серверам
[1] Сделав такую функцию единственным интерфейсом для хранения данных в кеше, вы можете добиться следующего. Допустим, я хочу использовать что-то из кеша, например, результат функции. Обычно вы делаете что-то вроде
CacheManager cm = new CacheManager(CacheGroups.Totals);
object obj = cm.GetFromCache("function1result");
if(obj == null)
{
obj = (object)DAO.Foo();
cm.StoreInCache("function1result", obj);
}
return (List<MyEntity>)obj;
. Используя другой интерфейс, вы можете быть уверены, что пользователи не сделают здесь ошибки.
Как
public T GetFromCache<T>(string key, Func<T> ifnotfound)
{
T obj = this.GetFromCache(key) as T;
if(obj == default(T))
{
obj = ifnotfound.Invoke();
this.StoreInCache(key, obj);
}
return obj;
}
Это гарантирует, что
Следовательно: менее вероятно, что они совершат ошибку. Более того: вы получите более красивый и понятный код, например:
List<MyEntity> list = new CacheManager(CacheGroups.Total).GetFromCache<List<MyEntity>>("function1result", ()=>DAO.Foo());
Это серьезная тема, но вот несколько советов:
Если это помогает, я подробно освещаю эту тему в своей книге: Сверхбыстрый ASP.NET .
Команда MS Patterns and Practices создала Enterprise Library в качестве ответа на этот вопрос для множество обычных сценариев. EntLib включает в себя кэширование, а также доступ к данным, проверку, ведение журнала, обработку исключений и т. Д. Мы использовали его годами и не думали бы начинать новый проект без него.
http://www.codeplex.com / entlib
Помимо домашней страницы P&P, http://msdn.microsoft.com/en-us/practices/default.aspx