2011-11-05 5 views
19

Używam pamięci podręcznej dostarczonej przez System.Runtime.Caching.MemoryCache.Czy mogę iterować po .NET4 MemoryCache?

Chciałbym wymienić na przedmioty cache tak, że mogę unieważnić (eksmitować następnie przeładować) pozycje jak taki

foreach (var item in MemoryCache.Default) { item.invalidate() } 

ale oficjalne docs found here stan:

Ważne: Pobieranie modułu wyliczającego dla instancji MemoryCache jest operacją wymagającą dużej ilości zasobów i blokującą. Dlatego moduł wyliczający nie powinien być używany w aplikacjach produkcyjnych.

Z pewnością musi istnieć prosty i skuteczny sposób na powtórzenie pozycji pamięci podręcznej?

+0

Może będziesz musiał jakoś wiedzieć w ADVANCE, co jest w pamięci podręcznej ... Ale to oznaczałoby użycie tablicy lub czegoś. – sinni800

+0

Tak, właśnie to robię teraz, ale to szalone, ponieważ oznacza to śledzenie tego, co pamięć podręczna już śledzi! :) –

+0

Dokładnie. Ale jeśli pamięć podręczna zawiera duże ilości danych, a tablica zawiera tylko informacje do REACH, które dane przechowują dobrze. – sinni800

Odpowiedz

9

Sugestie do tej pory były świetne, ale moja potrzeba jest nadal taka, jak stwierdzono: do iteracji nad elementami pamięci podręcznej. Wydaje się to być tak prostym zadaniem i spodziewam się, że pamięć podręczna ma wewnętrzną strukturę listy. Dokumenty i zestaw funkcji dla MemoryCache są potrzebne.

Tak jak omówiono powyżej, dodałem listę do mojej klasy adaptera pamięci podręcznej, która zawiera odniesienie do każdego elementu umieszczanego w pamięci podręcznej. Jeśli potrzebuję do iteracji pamięci podręcznej - nie tylko do unieważnienia, ale do gromadzenia statystyk, itp. - wtedy powtarzam swoją listę.

Jeśli liczba pozycji umieszczonych w pamięci podręcznej nie zmieni się, jest to rozsądne rozwiązanie. Jeśli liczba się zmieni, należy wstawić/usunąć za pośrednictwem klasy adaptera, aby zachować synchronizację listy z rzeczywistą pamięcią podręczną. Bałaganiarski, ale działa, i unika kar umownych, o których mowa w dokumentach.

Mam nadzieję, że dostawca pamięci podręcznej zostanie rozszerzony w następnej wersji platformy.

+0

Hehe, byłem zbyt wolny :). Bez obaw! – sinni800

+1

W końcu zrozumiałem, dlaczego klasa została napisana tak, jak było. Podczas iteracji nad pamięcią podręczną możesz napotkać warunek wyścigu, ponieważ przedmiot jest eksmitowany podczas iteracji! Musisz więc zablokować pamięć podręczną. ALE jeśli masz przypadek użycia, tak jak ja, gdzie ustawiasz przedmioty, aby nigdy nie wygasły, to nie ma to zastosowania (oczywiście moje przedmioty mogą zostać wyeksmitowane mimo to z powodu małej ilości pamięci, ale to jest przypadek graniczny, jeśli Twoja pamięć podręczna jest mały i korzystasz z nowoczesnego serwera). –

+0

Więcej informacji. To dało mi do myślenia, że ​​moje rozwiązanie jest dość * niebezpieczne * i prawdopodobnie głupie. O wiele rozsądniej jest zaakceptować perfekcyjne trafienie i pozwolić na zablokowanie MemoryCache podczas iteracji - lub użyć innego sposobu unieważnienia wszystkich jego elementów. Jeśli pamięć podręczna nie jest często unieważniana, to dobrze jest żyć z perfekcyjnym trafieniem: pomyśl tylko, ile czasu potrzeba na ocieplenie pamięci podręcznej - unieważnienie całej sprawy nie jest niczym innym. Niemniej jednak, doktorzy ostrzegają, aby nie używać modułu wyliczającego w kodzie produkcyjnym: zastanawiam się, dlaczego? Być może są inne problemy, których nie znam? –

1

Należy rozważyć użycie ChangeMonitors, które pozwalają automatycznie eksmitować nieaktualne wpisy po spełnieniu określonych warunków.

Zobacz Is there some sort of CacheDependency in System.Runtime.Caching?

ten jest podobny do System.Web.Caching CacheDependencys, który pozwoli Ci dokonać eksmisji wpisy, gdy pliki lub inne wpisy cache zmienić.

-2

W 2014 r

Jest to poprawny sposób, aby wszystkie elementy:

Dim AllItems = MemoryCache.Default.Select(Of ItemType)(Function(O) O.Value)

Nadzieja to pomaga kogoś.

+2

Dochód. Jest to to samo, co "wyliczanie" elementów pamięci podręcznej, które, jak OP stwierdza z oficjalnej dokumentacji, wymagają "dużej ilości zasobów" i należy ich unikać. Zobacz [Problem z wyliczeniem] (http://stackoverflow.com/a/22388943/219516). – publicgk

+0

Sorry @publicgk Nie przeczytałem tego pytania całkowicie. – Dejisys