Thursday, July 15, 2010

asp.net 4.0 , writing Custom outputcache provider for Oracle coherence Memory Cache

One of my Favorite feature of ASP.NET 4.0 is that we can offload the ouputcache from in-Process memory to external storage. i.e Disk, or a big in-memory cache. then we can Cache more Data  instead of being flushed out of memory when asp.net worker process get a lot pressure.  this will be more helpful during the holidays season.

Coherence is one popular in-memory distributed cache cluster. I just spent 30 minutes to build one simple outputcache provider. less than 100 lines of Code. much easier than the diskcache example:)
http://weblogs.asp.net/gunnarpeipman/archive/2009/11/19/asp-net-4-0-writing-custom-output-cache-providers.aspx

Key Points,

  • Keep the object in-memory, we need take care the object serialization /deserialization
    • this can be done easily in .NET. there are 5+ different serializer/formatters
    • I will use the BinaryFormatter which is more space -efficient
  • every cache item has a expiry setting, need flush and purge it when it reaches lifetime settings.
    • Coherence has the overflow setting,
    • you can specify the ttl when inserting object into the cache.

Steps.

  • Setup your distributed Cache Cluster and one dedicated cache.
  • Reference Coherence Assembly and fill up 4 methods which are required by OutputCacheProvider
  • Config asp.net web.config, point the provider to ours.

Setup your distributed Cache Cluster and one dedicated cache. here I will define one cache called outputcache to hold all the cached data.

Build the CoherencCacheOutputCacheProvider.

  • Create one Class library project named CoherencCacheOutputCacheProviderLib
  • reference several dlls.
    • System.web.dll (where OutputCacheProdiver exists)
    • System.configuration
    • Coherence.dll
  • Create one Class named CoherencCacheOutputCacheProvider
  • Compile
  • here is the source code. you may just copy and paste .

change your asp.net application to using the New cache provider.

  • reference the dll we just compiled
  • change the web.config
  • tune you outputcache settings.

here is the web.config

testing and make sure cache works as it should be.

first, I create one simple page just pringout the current time, enable the outputcache and setup duration to 30 seconds. and very by url parameter x

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="testcache.aspx.cs" Inherits="testcache" %>
<%@ OutputCache Duration="30" VaryByParam="x" %>
Last Update :<% =System.DateTime.Now %>

When I browse http://localhost:39847/WebSite1/testcache.aspx?x=1

the runtime will create two cache items, one is the Cachevary, another one is page itself.
image

when try different x value, will get more cached object.

image

the key for the item is url+xvalue.
Let me change the cache logic to vary by browser.
<%@ OutputCache Duration="30" VaryByParam="none" VaryByHeader="user-agent" %>

then try IE/Chrome/Opera.
image

Since we config the cache expiry setting to 30 seconds. so let’s verify the cache item are gone once they get expired.
it is!

image

Conclusion:

asp.net 4.0 provider model is very convenient for extension.  OutputCacheProvider  comes to a citizen of the provervider model.
  just like the coherence session provider for asp.net, it’s plug and play. write once , and enjoy the benefit everywhere.

 
Locations of visitors to this page