Um es kurz zu machen, welche EINFACHEN In-Memory-Caches gibt es im .Net-Ökosystem?
Was ich suche, ist:
var myCache = new SimpleCache(1024 * 1024 * 100); // 100 MB
Ich habe diese Optionen bereits untersucht:
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.
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.
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:
Überprüfen Sie den MemoryCache und diesen Artikel auf CodeProject über die Verwendung von MemoryCache.