A few weeks back I blogged about the Windows Server AppFabric launch (AppFabric is Microsoft's "Application Server") and a number of folks had questions about how to install and configure the "Velocity" memory cache. It used to be kind of confusing during the betas but it's really easy now that it's released.
Here's the comment:
Have you tried to setup a appfabric (velocity) instance ? I suggest you try & even do a blog post, maybe under the scenario of using it like a memcache for dasblog. I would love to know how to setup it up, it's crazy hard for what it is.
No problem, happy to help. I won't do it for dasblog, but I'll give you easy examples that'll take about 10 minutes.
Get and Install AppFabric
You can go to http://msdn.com/appfabric and download it directly or just do it with the Web Platform Installer.
Run the installer and select AppFabric Cache. If you're on Windows 7, you'll want to install the IIS 7 Manager for Remote Administration which is a little plugin that lets you manage remote IIS servers from your Windows 7 machine.
NOTE: You can also an automated/unattended installation as well via SETUP /i CACHINGSERVICE to just get caching.
The configuration tool will pop up, and walk you through a small wizard. You can setup AppFabric Hosting Services for Monitoring and Workflow Persistence, but since I'm just doing Caching, I'll skip it.
The Velocity Caching Service needs to know where to get its configuration and it can get it from one of two places - either a database or an XML file on a share. If you use the XML file on a share, you'll need to make sure the service account has access to the share, etc. I'll use a database. The config wizard can make it for you as well. Click Next then Finish up the configuration.
Configuring the Configuration Database...
Ok, let's start it up and poke around.
Start and Administer your Memory Cluster from PowerShell
Now what? Go to the Start Menu and type in Caching. You'll have an item called "Caching Administration Windows PowerShell." This is where you can connect to the cache, check out what's going on, make new caches, etc. Run it as Administrator.
If you type "get-command *cache*" you'll see all the different commands available for cache management. I typed start-cachecluster.
HostName : CachePort Service Name Service Status Version Info
-------------------- ------------ -------------- ------------
HANSELMAN-W500:22233 AppFabricCachingService UP 1 [1,1][1,1]
Cool, it's up and running. If you look in the config database (or the XML file if you chose that) you'll see that I have one machine in my memory cluster. I could have lots and lots, and if I had Windows Server Enterprise I would also have high-availability if one of the nodes went down.
I download the AppFabric Caching Samples and opened the CacheSampleWebApp in Visual Studio. Immediately we notice the two new references we don't usually see in a web application, Microsoft.ApplicationServer.Caching.Core and .Client.
Remember that for security everything is locked down by default, so you'll need to grant access to the cache for whatever user you'll be using to access it. I'm running as "ScottHa" so I'll run
...and you should do the same for whatever account your IIS is running as.
Use Your Memory Cache from ASP.NET
Remember that you can chop up your memory caches into logical buckets (partitions) and a memory cluster can serve more than one application, if you wanted.
Your cache can be hooked up in the web.config or from code (however you like). Here's a code example helper method where the sample does this manually. This data could come from wherever you like, you just need to tell it a machine to talk to and the portnumber. It'll automatically connect to the
Caches can also be partitioned. For example, I'm using a named cache called "default" but I could have multiple logically segmented areas like "shoppingcart" and "productcatalog" if I wanted.
public class CacheUtil
private static DataCacheFactory _factory = null;
private static DataCache _cache = null;
public static DataCache GetCache()
if (_cache != null)
//Define Array for 1 Cache Host
List<DataCacheServerEndpoint> servers = new List<DataCacheServerEndpoint>(1);
//Specify Cache Host Details
// Parameter 1 = host name
// Parameter 2 = cache port number
servers.Add(new DataCacheServerEndpoint("mymachine", 22233));
//Create cache configuration
DataCacheFactoryConfiguration configuration = new DataCacheFactoryConfiguration();
//Set the cache host(s)
configuration.Servers = servers;
//Set default properties for local cache (local cache disabled)
configuration.LocalCacheProperties = new DataCacheLocalCacheProperties();
//Disable tracing to avoid informational/verbose messages on the web page
//Pass configuration settings to cacheFactory constructor
_factory = new DataCacheFactory(configuration);
//Get reference to named cache called "default"
_cache = _factory.GetCache("default");
Once your cache is setup, it's trivial to use.
Order order = (Order)m_cache.Get(orderid);
or updating an existing object:
Check your Caching Statistics
So after adding a bunch of items to the cache, then requesting a bunch back I can go into PowerShell and see what's going on:
C:\> Get-CacheStatistics default
Size : 2493
ItemCount : 5
RegionCount : 5
RequestCount : 17
MissCount : 3
You can use Performance Monitor as there is an imperial buttload of different Performance Counters Available. As I mentioned, you can make different partitions, like "default" or "poopypants" and check the stats on each of those separate, or the cache as a whole:
And of course, I can recycle my webserver, start it up again and fetch an order and it's still there. You've effectively got a big, partitionable distributed (and optionally highly available) hashtable across multiple machines.
Replacing ASP.NET Session State with AppFabric Caching
If you want, in ASP.NET 4 you can also swap out the default in-memory Session State Provider for AppFabric via your web.config. Here's an example web.config.
<?xml version="1.0" encoding="utf-8" ?>
<!--configSections must be the FIRST element -->
<!-- required to read the <dataCacheClient> element -->
<!-- cache client -->
<!-- cache host(s) -->
<sessionState mode="Custom" customProvider="AppFabricCacheSessionStoreProvider">
<!-- specify the named cache for session data -->
Resources and Links
Here's a recent AppFabric caching slidedeck from Ron Jacobs I found useful. More links below. Microsoft Windows Server AppFabric Slides at SlideShare.
As with all things, a little abstraction goes a long way. If you have an existing caching strategy (via EntLib, or whatever) you can almost certainly swap out your internal storage for AppFabric Caching.