Caching ist in ASP.NET seit der ersten Version ein mitgeliefertes Feature. Es gibt viele Gründe für Caching, allerdings kommt es immer auf das jeweilige Problem an. Caching ist (oder sollte zumindest – sonst macht man etwas falsch ;)) “deutlich schneller” als herkömmliche Datenbankabfragen & co. sein. Wie kommt man denn aber in den Genuss von Caching in WCF Services & co. ohne grosse 3rd Party Services zu benutzen?
Caching in WCF & co.: ObjectCache & MemoryCache im Framework
Seit der Version 4 gibt es die abstrakte Klasse ObjectCache mit der Implementierung eines InMemory-Caches namens “MemoryCache”.
Die API ist ziemlich simpel und orientiert sich auch an die API des ASP.NET Caches:
private void btnGet_Click(object sender, EventArgs e) { ObjectCache cache = MemoryCache.Default; string fileContents = cache["filecontents"] as string; if (fileContents == null) { CacheItemPolicy policy = new CacheItemPolicy(); List<string> filePaths = new List<string>(); filePaths.Add("c:\\cache\\example.txt"); policy.ChangeMonitors.Add(new HostFileChangeMonitor(filePaths)); // Fetch the file contents. fileContents = File.ReadAllText("c:\\cache\\example.txt"); cache.Set("filecontents", fileContents, policy); } Label1.Text = fileContents; }
Der Caching-Mechanismus kann angepasst werden bzw. kann man eine eigene Implementierung des ObjectCaches vornehmen.
Weitere Features (ob alles im InMemory Cache verfügbar ist muss man in der MSDN nachlesen) :
- AbsoluteExpiration: Set a date/time when to remove the item from the cache.
- ChangeMonitors: Allows the cache to become invalid when a file or database change occurs.
- Priority: Allows you to state that the item should never be removed.
- SlidingExpiration: Allows you to set a relative time to remove the item from cache.
- UpdateCallback & RemovedCallback: Two events to get notification when an item is removed from cache. UpdateCallback is called before an item is removed andRemovedCallBack is called after an item is removed. </ul>
Gibt es weitere Implementierungen des ObjectCaches?
Von Microsoft selbst scheint es nur den InMemory Cache zu geben.
Wird Azure Caching oder ein anderer Distributed Cache unterstützt?
Scheinbar nicht direkt – bzw. müsste man selbst an dieser Stelle etwas implementieren. Zum Thema Azure Caching gibt es diese Info-Seite.
Vorteil dieser Variante: Null Installationsaufwand – es ist im Framework.
Alternative: CacheAdapter – InMemory, Memcached, AppFabric & ASP.NET Cache
Wer etwas flexibler sein möchte, der kann direkt sich dieses Projekt näher anschauen:
Im Wiki gibt es nähere Informationen zur Verwendung der Bibliothek. Die Bibliothek ist auch noch am “Leben” – jedenfalls gibt es Commits auf das Repository.
Was nutzt ihr für Caching Lösungen?
Das sind zwei Varianten die ich gefunden habe. Die erste hat den Vorteil das man garnichts installieren muss. Die zweite Variante bezieht eine Bibliothek mit ein, allerdings kann diese Lösung theoretisch auch einfach InMemory laufen. Bestimmt gibt es noch mehr. Mich würde interessieren: Was nutzt ihr? Gab es vielleicht schon große Reinfälle?