How to use Memcached in ASP.Net applications

Download Sample Project (218.91 kb)

Caching data, pre-rendered pages, responses etc. are all part of good architecture for a high performance ASP.Net application. Actually for that matter same holds true for any application. If you can save time on fetching data from database or pre-render some presentation then any time of application will benefit from cache. In this post I am just going to concentrate on caching in ASP.Net application. And mainly how to use Memcached as state server for caching in your application.

What is Memcached?

I am not going to go into discussion about Memcached here. There is lot of very good information available on this opensource application's site itself. You can click here to read everything about it. In nutshell Memcached is a open source, high-performance, distributed memory object caching system.

What to use Memcached?

Now big question you are asking is why should you use Memcached? What is wrong with state server provided by ASP.Net state server? Simple answer, there is no problem with ASP.Net state server. There is one term that distinguishes ASP.Net state server and custom caching server is term DISTRIBUTED. Solutions like Memcached provide distributed and clustered state server. Having a distributed state server ensures near 100% uptime and reliable ASP.Net web application in web farm or web garden configuration.

List of distributed caching software

Before you start using Memcached, let me provide you list of alternatives that can be used for state server. This is not all the list, just some of the ones that I have run into and used from time to time.

How to use Memcached?

There are just few simple steps you need to perform to get started with using Memcached.

Install Memcached

First you will need to install Memcached service on your machine. I am going to keep this in perspective of Windows OS. There are now installers available that will install Memcached on your server with click of a button. The ones that I have used very extensively at few places is from Couchbase. Download the community edition to try. I will not discuss installation and configuration of Memcached in this post. That will be part of discussion for another post. But if you have questions please feel free to drop me a line. Just follow the instructions after installation wizard launches the admin console.

Get .Net API to connect to Memcached service

Memcached is a windows service installed on your machine and communicates through sockets. So you will need a client API that can communicate with this service. There are few opensource APIs available. The one that I use is a port of a JAVA api. You can click here to download it from sourceforge. The code is little old but works like a charm. You can get the source and compile it for .Net4.0 if you want to or compile it for .Net 2.0 depending on framework(s) you want to target. And then add a reference to this library in your project.

Use it in ASP.Net

Now that you have client library to connect to Memcached, only thing left is to get your ASP.Net application to start using it. For introduction I will just discuss how you can instantiate an instance of client library and then store some objects and then get them from cache. In later post I will discuss building a .Net cache provider around Memcached so caching is transparent to your .Net application.

Here is code snippet that I used to initialize use of cache service in my application. This code has been directly taken from code sample that comes with client library code.

public void Initialize()
{
   try
   {
      Initialized = false;
      // initialize the pool for memcache servers
      _pool = SockIOPool.GetInstance();
      Servers = new string[] { "127.0.0.1:11211" };
      _pool.SetServers(Servers);
      _pool.InitConnections = 3;
      _pool.MinConnections = 3;
      _pool.MaxConnections = 5;

      _pool.SocketConnectTimeout = 1000;
      _pool.SocketTimeout = 3000;

      _pool.MaintenanceSleep = 30;
      _pool.Failover = true;

      _pool.Nagle = false;
      _pool.Initialize();

      // get client instance
      _clientInstance = new MemcachedClient();
      _clientInstance.EnableCompression = false;

     Initialized = true;
  }
  catch (Exception ex)
  {
     Initialized = false;
     throw new ApplicationException("Failed to initialize memcached provider", ex);
  }
}

As you can see from the code that service provides lot of configuration parameters to control behaviour of caching as per your application requirements. At the very basic level you just need to methods that will save object in cache then get it.

public void Set(string key, object data, DateTime expireAt)
{
   _clientInstance.Set(key, data, expireAt);
}
public object Get(string key)
{
  return _clientInstance.Get(key);
}

And then using the API in your application is as simple as following code.

ApplicationCache.CacheStorage.Set("SelectedOptions", _selectedOptions);
//Session["SelectedOptions"] = _selectedOptions;
..
..
_selectedOptions = ApplicationCache.CacheStorage.Get("SelectedOptions") as List<int>;

As you can see how easy it is to get started with a robust distributed caching service for your ASP.Net application. In subsequent posts I will discuss more features of use of Memcached service.

comments powered by Disqus