.Net Einfache In-Memory-Caches

8

Um es kurz zu machen, welche EINFACHEN In-Memory-Caches gibt es im .Net-Ökosystem?

Was ich suche, ist:

  • Keine Konfiguration (andere als einfache API-Aufrufe). Ich möchte mich nicht mit externen Konfigurationsdateien anlegen, da sie die Bereitstellung nur erschweren.
  • Gleicher Prozess (kein externer Prozess oder Server). Vorzugsweise so einfach erstellt wie
    var myCache = new SimpleCache(1024 * 1024 * 100); // 100 MB
  • Angegebenes Speicherlimit
  • Elemente, die aufgrund der geringsten Verwendung aus dem Cache gelöscht wurden
  • Zeitbasiertes Ablaufdatum (nicht erforderlich, aber in anderen Szenarien möglicherweise nützlich)
  • Funktioniert mit .Net 3.5

Ich habe diese Optionen bereits untersucht:

  • ASP.Net System.Web.Caching
    • Seine API unterstützt keine Art der Kontrolle über die Größe des Caches oder die Priorität, die auf der Verwendung basiert. Folglich sind Sie völlig abhängig davon, wann es entscheidet, gibt es genügend Speicherdruck, um den Cache zu leeren.
  • System.Runtime.Caching
  • Microsoft Enterprise-Bibliothek - Caching-Block
    • Abgesehen davon, dass ich den Ruf habe, Schwergewicht zu sein, mag ich seine Konfiguration nicht mit XML-Dateien oder app.config. Darüber hinaus unterstützt es zwar die Größe des Caches basierend auf NUMBER der gespeicherten Objekte, verfügt jedoch nicht über Mechanismen zur Begrenzung der SIZE dieser Objekte.
  • NCache
    • Wahrscheinlich Overkill für den Anwendungsfall, den ich möchte, aber vor allem ist es ein bezahltes Produkt, mit dem ich mich nicht beschäftigen möchte (verglichen mit mir, wenn ich nur einen Tag oder zwei schreibe). Wie üblich, hat seine Express-Edition Nutzungsbeschränkungen, die ihre Verwendung für Produktionszwecke verhindern.
  • MemCacheD
    • Genau das Gegenteil von dem, was ich möchte (externer verteilter Prozess)

Ich arbeite mit Google Protocol Buffers (protobuf-net), daher habe ich eine relativ genaue Schätzung des Speicherbedarfs jedes Elements. Ich speichere Daten, die vom Datenbankzugriff zurückgegeben werden, aber ich habe keine Lust, ein formales ORM zu verwenden (ich benutze tatsächlich PetaPoco, aber das ist neben dem Punkt).

In diesem Stadium plane ich, meinen eigenen Cache zu implementieren, indem ich eine doppelt verkettete Liste und ein Hash (Wörterbuch) verwende, um das Löschen von Elementen zu ermöglichen, die zuletzt aus dem Cache verwendet wurden, sobald das Cache-Limit erreicht ist. Allerdings wollte ich überprüfen, ob jemand von geeigneten Optionen wusste, bevor ich meine eigene rollte.

    
Matt G 11.06.2012, 13:28
quelle

4 Antworten

3

Was haben Sie am Cache gemacht?

Ich habe einen Prototyp von Universal Cache, an dem ich gearbeitet habe, was ziemlich genau das ist, was Sie wollen, außer dem Cache-Limit nach Kapazität (Anzahl der Elemente) statt nach Speicherverbrauch, aber es hat noch eine zusätzliche Funktion, die Sie vielleicht schätzen werden: lokal Persistenz.

Der Cache ist nach Schichten strukturiert, wobei Sie eine einzelne Schicht haben können: Speicher, eine doppelte Schicht: Speicher + lokale Persistenz oder eine dreifache Schicht: Speicher + lokale Persistenz + Netzwerkfreigabe. Sie können eine beliebige Kombination von Ebenen verwenden, wie Sie möchten. Obwohl die Netzwerkfreigabe, die als .net-Remoting-Dienst entwickelt wurde, der auf jedem Computer im Netzwerk installiert werden kann und von Clientcaches selbst entdeckt werden kann, noch nicht funktionstüchtig ist.

Die Caches sind generische Klassen, auf die über eine Schnittstelle ICache & lt; TKey, TValue & gt; zugegriffen wird. Der lokale persistente Cache verwendet SQL Express Compact 4 zum Erstellen von Datenbanken und Tabellen, die alle Felder Ihres TKey, einen Zeitstempel und einen TValue enthalten, der als Image-Spalte serialisiert wird. Wenn Sie bei der Mehrschichtkonfiguration die Methode TryGetValue (TKey-Schlüssel, aus TValue-Wert) im Cache der obersten Ebene verwenden, wird die erste Schicht (Speichercache) nicht mit dem Element verglichen, sondern intern mit der nächsten Schicht (lokal) persistent), dann der nächste ... bis kein Cache mehr zur Verfügung steht, um die Daten bereitzustellen. Wenn der Speichercache ein Element verwirft, wird dem nächsten Cache die Möglichkeit gegeben, das Element zu seinem Layer hinzuzufügen, so dass im Falle eines persistenten Cache die Daten für zukünftige Anforderungen gespeichert werden.

Die Caches haben einen benutzerdefinierten Aufbewahrungszeitparameter (d. h. einige Minuten für einen Speichercache, 30 Tage für den lokalen persistenten Cache) und Kapazität.

Ich kann es als Public-Domain-Code veröffentlichen, wenn jemand interessiert ist.

    
ML64 30.08.2012 20:03
quelle
1

Was ist mit den Cache-Funktionen in AppFabric für Windows Server? Versuche es ! Ссылка und Ссылка

Wenn es jedoch keine Produkte auf dem Markt gibt, die das gewünschte Verhalten bieten, müssen Sie Ihre eigene benutzerdefinierte Caching-Ebene mithilfe von Entwurfsmustern implementieren.

    
Jason De Oliveira 11.06.2012 21:22
quelle
1

Es ist ziemlich alt, aber ich ähnele dem, worüber du redest

Generischer Cache mit Speicherverbrauch

und hier ist eine weitere SO mit einem relevanten Szenario:

Leistung der System-Laufzeit-Caches

    
Mare Infinitus 11.06.2012 22:13
quelle
0

Überprüfen Sie den MemoryCache und diesen Artikel auf CodeProject über die Verwendung von MemoryCache.

    
Khachatur 30.10.2013 09:04
quelle

Tags und Links