views:

5603

answers:

5

For a .NET component that will be used in both web applications and rich client applications, there seem to be two obvious options for caching: System.Web.Caching or the Ent. Lib. Caching Block.

  • What do you use?
  • Why?

System.Web.Caching

Is this safe to use outside of web apps? I've seen mixed information, but I think the answer is maybe-kind-of-not-really.

I don't expect to use one of its highlights, SqlCacheDependency, but the addition of CacheItemUpdateCallback in .NET 3.5 seems like a Really Good Thing.

Enterprise Library Caching Application Block

  • other blocks are already in use so the dependency already exists
  • cache persistence isn't necessary; regenerating the cache on restart is OK

Some cache items should always be available, but be refreshed periodically. For these items, getting a callback after an item has been removed is not very convenient. It looks like a client will have to just sleep and poll until the cache item is repopulated.

Memcached for Win32 + .NET client

What are the pros and cons when you don't need a distributed cache?

+1  A: 

Take a look at memcached. It is a really cool, fast and lightweight distributed caching system. There are APIs for several of the most popular languages, including C#. It may not serve well on the client side (unless of course the client is obtaining the cached data from a server of some kind), but if you abstract your usage of memcached to a specific interface, you could then implement the interface with another caching system.

Mike Stone
he specifically mentioned not needing a distributed cache...
Seun Osewa
+2  A: 

Bear in mind that the EntLib documentation specifically steers you towards the ASP.NET cache for ASP.NET applications. That's probably the strongest recommendation towards using it here. Plus the EntLib cache doesn't have dependencies, which for me is a big reason not to use it.

I don't think there's a technical limitation as such on shipping System.Web as part of your app, though it's slightly odd that they've put that notice in on the .NET 3.5 page. Hanselman actually says he started out being creeped out by this notion, but became convinced. Also if you read the comments, he says that the block has too many moving parts and the ASP.NET Cache is much more lightweght.
I think this is exactly the kind of problem that Velocity is going to solve, but that's only a preview for now :-(

I'd say use Web.Caching and see how you get on. If you put some kind of abstraction layer over the top of it, you've always got the option to swap it out for the EntLib block later on if you find problems.

PhilPursglove
It's worth noting that in .NET 4.0 they are moving the caching bits out of System.Web specifically to resolve this issue.
PhilPursglove
A: 

@Davide Vosti

"If they put it in the web namespace, I think's it's for a good reason." Does that same logic apply to the Concurrency and Coordination Runtime (CCR) in the robotic studio? no? didn't think so.

Harry
That's the worst/weakest argument I've heard. The cache was most likely implemented by the asp.net team because it was really needed in a web scenario which is why it ended up in that namespace. However being the smart guys that they were they built it without any dependencies on IIS. It should just get moved to system.caching namespace.
Micah
+6  A: 

These are the items that I consider for the topic of Caching:

MemCached Win32 Velocity .net Cache Enterprise Library Caching Application Block

MemCached Win32: Up until recently I have used MemCached Win32. This is a akin to a web farm (many servers serving the same content for high availability) but it is a cache farm. This means that you can install it locally on your web server initially if you don't have the resources to go bigger. Then as you go down the road you can scale horizontally (more servers) or vertically (more hardware). This is a product that was ported from the original MemCached to work on Windows. This product has been used extensively in very high traffic sites. http://jehiah.cz/projects/memcached-win32/

Velocity: This is Microsofts answer to products such as MemCached. MemCached has been out for quite some time, Velocity is in CTP mode. I must say that from what I have read so far this product will certainly turn my head once it is out. But I can't bring myself to run big production projects on a CTP product with zero track record. I have started playing with it though as once it gains momentum MemCached won't even compare for those locked in the windows world! http://blogs.msdn.com/velocity/

.NET Cache: There is no reason to discount the standard .NET Cache. It is built in and ready to use for free and with no (major) set up required. It offers flexibility by way of offering mechanisms for storing items in local memory, a SINGLE state server, or a centralized database. Where Velocity steps in is when you need more than a single state server (cache in memory) and don't want to use a slow database for holding your cache.

Enterprise Application Block: I stay away from all of the Enterprise Application Blocks. They are heavy frameworks that give more than I generally require! As long as you remember to wrap everything that touches code that is not your own and follow simple rules for coding, stick to any of the other methods over this one! (just my opinion of course - MySpace leverages as much as they can out of Enterprise Application Blocks!)

You don't have to choose up front! I generally create a cache wrapper that I communicate with in my code for methods such as Get, Set, Exists, Remove, ListKeys, etc. This then points to an underlying level of cache abstraction that can point to MemCached, Velocity, or .NET cache. I use StructureMap (or choose another IoC container) to inject which form of cache I want to use for a given environment. In my local dev box I might use .NET cache in the session. In production I generally use MemCached Win 32. But regardless of how it is set up you can easily swap things around to try each system out to see what works best for you. You just need to make sure that you application knows as little as possible about how things are cached! Once this layer of abstraction is in place you can then do things such as run a compression algorithm (gzip) for all the data that is going in and out of cache which would allow you to store 10 times the amount of data in cache. - transparently.

I cover .NET Cache, MemCached Win32, StructureMap, and the appropriate abstractions in my book if you are interested!

ASP.NET 3.5 Social Networking (http://www.amazon.com/ASP-NET-3-5-Social-Networking-Enterprise-ready/dp/1847194788/ref=sr_1_1?ie=UTF8&s=books&qid=1225408005&sr=8-1 ) Andrew Siemer www.andrewsiemer.com blog.andrewsiemer.com www.socialnetworkingin.net

Andrew Siemer
Does your book describe the cache wrapper layer you mentioned?
frankadelic
It discusses the concept of wrappers. I think that I wrapped cache in there but I am not sure how deep into MemCached I got. You can use the Enyim MemCached client behind your wrapper though. However, now that MS Velocity is out on the scene you might want to make a smarter wrapper around Velocity (it has loads of functionality that MemCached doesn't. And if you are on the MS stack you can't go wrong with Velocity.
Andrew Siemer
A: 

Information on how to use the enterprise library caching block.. http://w3mentor.com/learn/asp-dot-net-c-sharp/c-asp-net/microsoft-enterprise-library-caching-block/