ASP.net какой-нибудь способ кешировать такие вещи? - PullRequest
1 голос
/ 28 апреля 2011

У меня есть функция, вызываемая на каждой странице:

/// <summary>
/// Gets the date of the latest blog entry
/// </summary>
public static DateTime GetNewestBlogDate()
{
    DateTime ReturnDate = DateTime.Now.AddDays(30);
    using (var db = new DataClassesDataContext())
    {
        var q = (from d in db.tblBlogEntries orderby d.date descending select new {d.date}).FirstOrDefault();
        if (q != null)
            ReturnDate = q.date;
    }
    return ReturnDate;
}

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

Кажется довольно расточительным продолжать вызывать эту функцию для каждого запроса страницы, называемого 1: 1, для количества запросов страниц, которые у вас есть. Допустим, у вас есть 30 000 просмотров страниц в день, это 1250 запросов к базе данных в час.

Можно ли как-нибудь кэшировать эти результаты, и у меня есть срок действия, скажем, каждый час?

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

Ответы [ 4 ]

3 голосов
/ 28 апреля 2011

Так как он не основан на пользователе (куки-файл есть, но запрос не выглядит таковым) - вы можете просто использовать стандартный ASP.NET Cache .

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

Предполагая, что вы сохранили его в MS-SQL, вы могли бы даже использовать SqlCacheDependency для аннулирования при вставке новых данных. Или, если ваш код вставки корректен, вы можете вручную аннулировать кеш тогда.

1 голос
/ 28 апреля 2011

Просто используйте объект ASP.NET Cache с абсолютным сроком действия 1 час. Вот пример того, как вы могли бы реализовать это:

public static DateTime GetNewestBlogDate()
{            
    HttpContext context = HttpContext.Current;
    DateTime returnDate = DateTime.Now.AddDays(30)
    string key = "SomeUniqueKey"; // You can use something like "[UserName]_NewestBlogDate"
    object cacheObj = context.Cache[key];
    if (cacheObj == null)
    {
        using (var db = new DataClassesDataContext())
        {
            var q = (from d in db.tblBlogEntries orderby d.date descending select new { d.date }).FirstOrDefault();
            if (q != null)
            {
                returnDate = q.date;
                context.Cache.Insert(key, returnDate, null, DateTime.Now.AddHours(1), Cache.NoSlidingExpiration);
            }
        }
    }
    else
    {
        returnDate = (DateTime)cacheObj;
    }

    return returnDate;
}
0 голосов
/ 28 апреля 2011

Сделать веб-метод с CacheDuration ?

[WebMethod(CacheDuration=60)]
public static DateTime GetNewestBlogDate()
0 голосов
/ 28 апреля 2011

Вы не указали, что делается с возвращенным значением.Если возвращаемое значение отображается одинаково на каждой странице, почему бы просто не разместить код вместе с разметкой для отображения результата в файле пользовательского контроля (ASCX)?Затем вы можете кэшировать элемент управления.

...