Кэшируйте DTO или кешируйте данные с дорогого ресурса - PullRequest
2 голосов
/ 01 марта 2010

У меня есть WebService, который возвращает DTO. Веб-сервис получает данные для заполнения DTO из дорогого ресурса. В этом простом примере несколько методов WebService могут попасть в один и тот же метод ExорогоResourceProvider. Где лучше всего выполнить кэширование, чтобы максимизировать попадания в кеш? На веб-сервисе или на Exорого-ресурс-провайдере? Я должен отметить, что некоторые данные из ExорогоResourceProvider изменяются довольно часто и не должны долго кэшироваться.

public class MyWebService : System.Web.Services.WebService
{
    public MyDTO GetObject1And2()
    {
        MyDTO dto12 = HttpRuntime.Cache.Get("dto12") as MyDTO;
        if(dto12 == null){
            dto12 = new MyDTO();
            dto12.Object1 = ExpensiveResourceProvider.GetObject1();
            dto12.Object2 = ExpensiveResourceProvider.GetObject2();
            HttpRuntime.Cache.Insert("dto12", dto12);
        }
        return dto12;
    }
    public MyDTO GetObject2And3()
    {
        MyDTO dto23 = HttpRuntime.Cache.Get("dto23") as MyDTO;
        if (dto23 == null)
        {
            dto23 = new MyDTO();
            dto23.Object2 = ExpensiveResourceProvider.GetObject2();
            dto23.Object3 = ExpensiveResourceProvider.GetObject3();
            HttpRuntime.Cache.Insert("dto23", dto23);
        }
        return dto23;
    }
    public MyDTO GetObject1And3()
    {
        MyDTO dto13 = HttpRuntime.Cache.Get("dto13") as MyDTO;
        if (dto13 == null)
        {
            dto13 = new MyDTO();
            dto13.Object1 = ExpensiveResourceProvider.GetObject1();
            dto13.Object3 = ExpensiveResourceProvider.GetObject3();
            HttpRuntime.Cache.Insert("dto13", dto13);
        }
        return dto13;
    }
}    
public class ExpensiveResourceProvider
{
    public static object GetObject1() 
    {
        object obj1 = HttpRuntime.Cache.Get("object1") as object;
        if(obj1 == null){
            obj1 = new object();
            HttpRuntime.Cache.Insert("object1", obj1);
        }
        return obj1; 
    }
    public static object GetObject2() 
    {
        object obj2 = HttpRuntime.Cache.Get("object2") as object;
        if (obj2 == null)
        {
            obj2 = new object();
            HttpRuntime.Cache.Insert("object2", obj2);
        }
        return obj2;
    }
    public static object GetObject3()
    {
        object obj3 = HttpRuntime.Cache.Get("object3") as object;
        if (obj3 == null)
        {
            obj3 = new object();
            HttpRuntime.Cache.Insert("object3", obj3);
        }
        return obj3;
    }
}
public class MyDTO
{
    public object Object1 { get; set; }
    public object Object2 { get; set; }
    public object Object3 { get; set; }
}

Ответы [ 2 ]

2 голосов
/ 01 марта 2010

Волатильность ваших данных является ключом к тому, где их кэшировать. В зависимости от вашего механизма кэширования у вас будут разные способы уведомления о том, что ваши данные устарели, и пришло время обновить их. Давайте предположим, что ваш механизм кэширования предусматривает предоставление делегата обратного вызова, и в этом случае ваш делегат должен находиться в том же слое, что и код, который обычно заполняет кэш (предпочтительно код того же , который заполняет кэш для начала) , Сказав это, кажется, что ваше кэширование лучше оставить на усмотрение вашего ExblyResourceProvider.

1 голос
/ 02 марта 2010

Возвращаясь к основам кэширования, вам не следует принимать решения о двух разных уровнях стратегии кэширования вместе, это два разных решения.

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

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

Тем не менее, метод веб-службы не выглядит хорошим дизайном, который перекрывает информацию друг с другом. Я думаю, что ваша проблема не в кешировании, а в том, как ваш объект DTO и дизайн сигнатур метода WS касаются правильной группировки ваших данных.

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

Мои два цента ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...