Tommy Jakobsen
Tommy Jakobsen

Reputation: 2361

ASP.NET MVC, autocomplete textbox, caching?

Using ASP.NET MVC, I've implemented an autocomplete textbox using the approach very similar to the implementation by Ben Scheirman as shown here: http://flux88.com/blog/jquery-auto-complete-text-box-with-asp-net-mvc/

What I haven't been able to figure out is if it's a good idea to cache the data for the autocomplete textbox, so there won't be a roundtrip to the database on every keystroke?

If caching is prefered, can you guide me in the direction to how to implement caching for this purpose?

Upvotes: 4

Views: 5630

Answers (4)

Cyril Gupta
Cyril Gupta

Reputation: 13723

Well, how will caching in asp.net prevent server round trips? You'll still have server round trips, at best you will not have to look up the database if you cache. If you want to prevent server roundtrips then you need to cache at the client side.

While it's quite easily possible with Javascript (You need to store your data in a variable and check that variable for relevant data before looking up the server again) I don't know of a ready-tool which does this for you.

I do recommend you consider caching to prevent round-trips. In fact I have half a mind to implement javascript caching in one of my own websites reading this.

Upvotes: -1

Sergey
Sergey

Reputation:

I think caching in this case would require more work than simply storing every request. You'd want to focus more on the terms being searched than individual keys. You'd have to keep track of what terms are more popular and cache combinations of characters that make up those terms. I don't think simply caching every single request is going to get you any performance boost. You're just going to have stale data in your cache.

Upvotes: 0

xandy
xandy

Reputation: 27421

You sure can Cache your result, using the attribute like:

[OutputCache(Duration=60, VaryByParam="searchTerm")]

ASP.net will handle the rest.

Upvotes: 5

Chaddeus
Chaddeus

Reputation: 13366

You have a couple things to ask yourself:

  1. Is the data I'm pulling back dynamic?
  2. If not, how often do I expect this call to occur?

If the answers are, 1- not really and 2 - call to happen frequently, you should cache it.

I don't know how your data access is setup, but I simply throw my data into cache objects like so:

public IQueryable<Category> FindAllCategories()
{
    if (HttpContext.Current.Cache["AllCategories"] != null)
        return (IQueryable<Category>)HttpContext.Current.Cache["AllCategories"];
    else
    {
        IQueryable<Category> allCats =  from c in db.Categories
                                          orderby c.Name
                                          select c;

        // set cache
        HttpContext.Current.Cache.Add("AllCategories", allCats, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 30, 0, 0), System.Web.Caching.CacheItemPriority.Default, null);
        return allCats;
    }
}

This is an example of one of my repository queries, based off of LINQ to SQL. It first checks the cache, if the entry exists in cache, it returns it. If not, it goes to the database, then caches it with a sliding expiration.

Upvotes: 5

Related Questions