2012-06-13 16 views
8

Czy istnieje ogólna alternatywa/implementacja dla MemoryCache?Ogólna implementacja System.Runtime.Caching.MemoryCache

Wiem, że MemoryCache używa tablicy Hashtable pod maską, więc wystarczy przejść do używania Słownika <,>, która jest ogólną wersją HashTable.

Zapewni to bezpieczeństwo typu i zapewni korzyści w zakresie wydajności, ponieważ nie ma boksu ani rozpakowywania.

EDYCJA: Kolejną rzeczą, która mnie interesuje jest posiadanie innego typu klucza. Wartością domyślną jest System.String.

+0

Ale byłbyś w stanie tylko buforować jeden typ? Nie martwiłbym się zbytnio o ten koszt, część bokserska będzie bardzo pomijana w przypadku prymitywnych typów wartości. –

+0

@AdamHouldsworth: Tak, to jest przeznaczone.Owijam pamięć podręczną na mapie bazy danych z wygaśnięciem po wygaśnięciu, która zwraca tylko jeden typ. – caesay

+0

Czy jest to typ wartości? –

Odpowiedz

13

Czy istnieje ogólna alternatywa/implementacja dla MemoryCache?

Nie w bibliotece klasy podstawowej. Musiałbyś przetasować własny, chociaż ja, osobiście, zrobiłbym opakowanie o numerze MemoryCache, które zapewnia interfejs API, który chcesz.

byłoby to zapewnić bezpieczeństwo typu i zapewnić wzrost wydajności jak nie boks/unboxing

Bezpieczeństwo typu mogą być traktowane dość łatwo w klasie owijarki. Boxing/unboxing byłby tylko problemem, gdybyś przechowywał typy wartości (nie klasy), a nawet wtedy, byłby prawdopodobnie minimalny, ponieważ jest mało prawdopodobne, że będziesz naciskał i wyciągał z pamięci podręcznej, na tyle często, aby było to prawdziwe działanie kwestia.

chodzi o bezpieczeństwo i użyteczność typu, jakie faktycznie napisane moje własne metody zawinąć wywołuje MemoryCache elementu w ogólnej metody, co pozwala nieco ładniejszy wykorzystania z punktu widzenia API. To bardzo proste - zazwyczaj po prostu wymaga metody takie jak:

public T GetItem<T>(string key) where T : class 
{ 
    return memoryCache[key] as T; 
} 

Podobnie można uczynić metodę ustawiania wartości w ten sam sposób.

EDYCJA: Kolejną rzeczą, która mnie interesuje jest posiadanie innego typu klucza. Wartością domyślną jest System.String.

Nie jest to obsługiwane bezpośrednio przez MemoryCache, więc wykonanie własnego klucza wymagałoby sporo pracy. Jedną opcją byłoby utworzenie bezpiecznej owijki typu, która dostarczyłaby również Func<T, string>, aby wygenerować klucz łańcucha oparty na wartości - co pozwoliłoby wygenerować wpis pamięci podręcznej dla dowolnego typu T. Oczywiście, należy zachować ostrożność, aby uwzględnić wszystkie dane w łańcuchu, który chciałbyś dodać do swojego porównania.

+0

Myślę, że boks/unboxing jest ważnym problemem - jeśli rzeczywiście buforujesz typy wartości. Jednym z głównych powodów korzystania z pamięci podręcznych jest to, że obliczasz wartość z wysoką częstotliwością. W związku z tym powszechną sytuacją, w której pamięć podręczna będzie często trafiać, będzie zwykła sytuacja. Może trafiony tyle, aby boks drogie to niezwykły przypadek, ale to zależy od tego, jak aplikacja jest wrażliwy na nacisk GC –