2016-08-31 3 views
8

От HttpContext.Current.Cache и ApplicationContext.ApplicationCache.RuntimeCache в Umbraco? И какой из них лучше использовать с точки зрения эффективности?Какой тип кеша подходит для использования в проекте Umbraco и как я могу реализовать интеллектуальный кеш?

Я использовал Umbraco 7.4.x в своем проекте и ASP.NET MVC. В моем проекте у меня есть список продуктов, которые могут содержать столько элементов, и я хочу использовать кеш по этой причине. В частности, я хочу поместить свои данные в кеш, и когда новый элемент добавлен в узел Products, кэш автоматически будет обновляться. Как это реализовать?

Модифицировано: Пожалуйста, дайте мне представление с деталями для моего кода.

Products.cshtml:

@using Jahan.Handicraft.Model.UModel.URenderModel 
@using Jahan.Handicraft.Model.UModel 

@inherits Umbraco.Web.Mvc.UmbracoViewPage<BaseRenderModel<Jahan.Handicraft.Model.UModel.Products>> 


@foreach (var prod in Model.Model.ProductList.Skip((page - 1) * pageSize).Take(pageSize)) 
    { 
     @*<div>LOAD DATA</div>*@ 
    } 

ProductsController.cs:

namespace Jahan.Handicraft.Web.Mvc.UmbracoCms.App.Controllers 
{ 
    public class ProductsController : BaseRenderMvcController<Products> 
    { 
     // GET: Products 
     public override ActionResult Index(RenderModel model) 
     { 
      return base.Index(Instance); 
     } 
    } 
} 

BaseRenderMvcController.cs :

public class BaseRenderMvcController<TBaseEntity> : RenderMvcController where TBaseEntity : BaseEntity 
{ 
    private BaseRenderModel<TBaseEntity> _instance; 
    public BaseRenderModel<TBaseEntity> Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new BaseRenderModel<TBaseEntity>(CurrentContent, CurrentCultureInfo); 
      } 
      return _instance; 
     } 
     set 
     { 

     } 
    } 

    public virtual IPublishedContent CurrentContent 
    { 
     get 
     { 
      if (UmbracoContext.Current != null) 
       return UmbracoContext.Current.PublishedContentRequest.PublishedContent; 
      return null; 
     } 
    } 

    public virtual CultureInfo CurrentCultureInfo 
    { 
     get 
     { 
      if (UmbracoContext.Current != null) 
       return UmbracoContext.Current.PublishedContentRequest.PublishedContent.GetCulture(); 
      return null; 
     } 
    } 
} 

BaseRenderModel.cs:

public class BaseRenderModel<TBaseEntity> : RenderModel where TBaseEntity : BaseEntity 
{ 

public TBaseEntity Model { get; set; } 
public BaseRenderModel(IPublishedContent content, CultureInfo culture) : base(content, culture) 
{ 
    object[] args = new object[] { content, culture }; 
    Model = (TBaseEntity)Activator.CreateInstance(typeof(TBaseEntity), args); 
} 

public BaseRenderModel(IPublishedContent content) : base(content) 
{ 
    object args = new object[] { content }; 
    Model = (TBaseEntity)Activator.CreateInstance(typeof(TBaseEntity), args); 
} 

public BaseRenderModel() 
    : base(UmbracoContext.Current.PublishedContentRequest.PublishedContent) 
{ 

} 
} 

ответ

7

Есть несколько кэшей, которые можно использовать в Umbraco. У вас есть следующее:

ApplicationContext.ApplicationCache.RuntimeCache - это кеш, доступный для ВСЕХ запросов.

ApplicationContext.ApplicationCache.RequestCache - это кеш, который используется только для текущего запроса. Используйте, если вы хотите кэшировать объект для использования в нескольких представлениях.

ApplicationContext.ApplicationCache.StaticCache - это статический кеш и должен использоваться очень редко и с осторожностью, поскольку неправильное использование может вызвать проблемы с памятью.

Если элементы, которые вы кешируете, необходимо обновлять, когда узел заменен в бэк-офисе, вам нужно будет написать ICacheRefresher для его обработки.

Вот некоторая информация о трех кэшей, и как получить элементы в кэше: https://our.umbraco.org/documentation/reference/cache/updating-cache

Там в пример ICacheRefresher здесь: https://github.com/Jeavon/SEOCheckerCacheRefresher

Смежные вопросы