http://www.hanselman.com/blog/InstallingConfiguringAndUsingWindowsServerAppFabricAndTheVelocityMemoryCacheIn10Minutes.aspx
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.
You can go to http://msdn.com/appfabricand 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.
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.
C:\> 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
Grant-CacheAllowedClientAccount scottha
...and you should do the same for whatever account your IIS is running as.
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
using
Microsoft.ApplicationServer.Caching;
using
System.Collections.Generic;
public
class
CacheUtil
{
private
static
DataCacheFactory _factory =
null
;
private
static
DataCache _cache =
null
;
public
static
DataCache GetCache()
{
if
(_cache !=
null
)
return
_cache;
//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
DataCacheClientLogManager.ChangeLogLevel(System.Diagnostics.TraceLevel.Off);
//Pass configuration settings to cacheFactory constructor
_factory =
new
DataCacheFactory(configuration);
//Get reference to named cache called "default"
_cache = _factory.GetCache(
"default"
);
return
_cache;
}
}
|
Once your cache is setup, it's trivial to use.
1
|
m_cache.Add(orderid, order);
|
and
1
|
Order order = (Order)m_cache.Get(orderid);
|
or updating an existing object:
1
|
m_cache.Put(orderid, order);
|
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-cache
CacheName [Host] Regions --------- --------------- default [HANSELMAN-W500:22233] Default_Region_0103(Primary)
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.
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
<?
xml
version
=
"1.0"
encoding
=
"utf-8"
?>
<
configuration
>
<!--configSections must be the FIRST element -->
<
configSections
>
<!-- required to read the <dataCacheClient> element -->
<
section
name
=
"dataCacheClient"
type="Microsoft.ApplicationServer.Caching.DataCacheClientSection,
Microsoft.ApplicationServer.Caching.Core,
Version
=
1
.0.0.0,
Culture
=
neutral
,
PublicKeyToken
=
31bf3856ad364e35
"
allowLocation
=
"true"
allowDefinition
=
"Everywhere"
/>
</
configSections
>
<!-- cache client -->
<
dataCacheClient
>
<!-- cache host(s) -->
<
hosts
>
<
host
name
=
"CacheServer1"
cachePort
=
"22233"
/>
</
hosts
>
</
dataCacheClient
>
<
system.web
>
<
sessionState
mode
=
"Custom"
customProvider
=
"AppFabricCacheSessionStoreProvider"
>
<
providers
>
<!-- specify the named cache for session data -->
<
add
name
=
"AppFabricCacheSessionStoreProvider"
type
=
"Microsoft.ApplicationServer.Caching.DataCacheSessionStoreProvider"
cacheName
=
"poopylands"
sharedId
=
"MySharedApp"
/>
</
providers
>
</
sessionState
>
</
system.web
>
</
configuration
>
|
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.
Related Links