Пятница, 22 Апреля 2011 г. 15:54
+ в цитатник
Недавно писал про оптимизацию сайта для всяких спидтестов. Но все они бесполезны, если сам сайт работает медленно, а чтобы его ускорить нужно не только встроенное кэширование на уровне страниц - @OutputCache, но и кэширование на уровне объектов модели. Кэширование на уровне базы, всякие memcache актуально лишь когда есть куча FrontEnd'ов и они тоже генерят немало запросов несмотря на свое кэширование.
Так вот, для кэширования объектов в asp.net делается простой класс, например:
Copy Source | Copy HTML- /// <summary>
- /// Класс кэшированных объектов
- /// </summary>
- public abstract class CacheObject<T> : ISystemObject where T : CacheObject<T>, new()
- {
- /// <summary>
- /// Необходимо задать функцию загрузки из кэша
- /// </summary>
- public static T LoadFromCache(string UID)
- {
- object o = HttpRuntime.Cache.Get(typeof(T).Name + UID);//попробовали загрузить
- if (o == null)
- {
- T sample = new T();
- return sample.Load(UID)?sample:null;
- }
- return o as T;//если получилось, то вернем объект
- }
-
- /// <summary>
- /// Необходимо задать уникальный номер объекта
- /// </summary>
- protected abstract string _CacheUID
- {
- get; set;
- }
-
- /// <summary>
- /// Необходимо задать уникальный номер объекта
- /// </summary>
- protected virtual string _CacheKey
- {
- get
- {
- return typeof(T).Name + _CacheUID;
- }
- }
-
- /// <summary>
- /// Время, через которое будет очищен кэш
- /// </summary>
- protected virtual TimeSpan? _CacheExpiration
- {
- get
- {
- return null;
- }
- }
-
- /// <summary>
- /// Сохранение
- /// </summary>
- public virtual bool Save()
- {
- HttpRuntime.Cache.Insert(_CacheKey, this,null,Cache.NoAbsoluteExpiration,_CacheExpiration??Cache.NoSlidingExpiration);
- return true;
- }
-
- /// <summary>
- /// Удаление
- /// </summary>
- public virtual bool Delete()
- {
- HttpRuntime.Cache.Remove(_CacheKey);
- return true;
- }
-
- /// <summary>
- /// Удаление специфичного объекта,
- /// необходимо для использования связных классов
- /// </summary>
- public static bool Remove(string UID)
- {
- HttpRuntime.Cache.Remove(typeof(T).Name + UID);
- return true;
- }
-
- /// <summary>
- /// Первичная загрузка
- /// </summary>
- public abstract bool Load(string uid);
-
- /// <summary>
- /// Первичная загрузка по строчке БД
- /// </summary>
- public abstract bool Load(DataRow dr);
- }
И теперь любой объект модели может быть прототипирован как class MyObject : CacheObject
. И уже конкретный экземляр создан вызовом MyObject mo = MyObject.LoadFromCache(uid);
Ничего более сложного для кэширования объектов в asp.net сайте-фронтэнде, на мой взгляд, не нужно.
Метки:
code
-
Запись понравилась
-
0
Процитировали
-
0
Сохранили
-