开发者

ASP.net any way to cache things like this?

I have a function called on every single page:

/// <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;
}

It works like this website, it gets the latest blog entry date and if it's greater than the users cookie value it displays a new icon next to the blog link.

It seems rather wasteful to keep calling this function per page request, called 1:1 on the number of page requests you have. Say you have 30,000 page views per day, that's 1,250 database queries per hour.

Is there any way I can cache this results, and have it expire say every hour?

I'm aware it's a bit of a micro optimisation, but given 10 or so similar functions per page it might add up to something worthwhile. You could denormalise it into a single table and return them all in one go, but I'd rather cache if possible as it's easier to manage.


Since it's not based on the user (the cookie is, but the query doesn't seem to be) - you can just use the standard ASP.NET Cache.

Just insert the result with an expiration of 1 hour. If you like, you can even use the callback to automatically refresh the cache.

Assuming you've stored it into MS-SQL, you could even use a SqlCacheDependency to invalidate when new data is inserted. Or, if your inserting code is well-factored, you could manually invalidate the cache then.


Just use the ASP.NET Cache object with an absolute expiration of 1 hour. Here's an example of how you might implement this:

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;
}


You haven't indicated what is done with the returned value. If the returned value is displayed the same way on each page, why not just place the code along with the markup to display the result in a user control (ASCX) file? You can then cache the control.


Make it a webmethod with a CacheDuration?

[WebMethod(CacheDuration=60)]
public static DateTime GetNewestBlogDate()
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜